diff options
805 files changed, 22549 insertions, 10836 deletions
diff --git a/api/current.txt b/api/current.txt index f28f8206dfea..fff502a577db 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4070,7 +4070,7 @@ package android.app { method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle); method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect); method public android.app.ActivityOptions setLaunchDisplayId(int); - method public android.app.ActivityOptions setLockTaskMode(boolean); + method public android.app.ActivityOptions setLockTaskEnabled(boolean); method public android.os.Bundle toBundle(); method public void update(android.app.ActivityOptions); field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time"; @@ -5349,18 +5349,18 @@ package android.app { ctor public Notification.Action.WearableExtender(android.app.Notification.Action); method public android.app.Notification.Action.WearableExtender clone(); method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder); - method public java.lang.CharSequence getCancelLabel(); - method public java.lang.CharSequence getConfirmLabel(); + method public deprecated java.lang.CharSequence getCancelLabel(); + method public deprecated java.lang.CharSequence getConfirmLabel(); method public boolean getHintDisplayActionInline(); method public boolean getHintLaunchesActivity(); - method public java.lang.CharSequence getInProgressLabel(); + method public deprecated java.lang.CharSequence getInProgressLabel(); method public boolean isAvailableOffline(); method public android.app.Notification.Action.WearableExtender setAvailableOffline(boolean); - method public android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence); - method public android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence); + method public deprecated android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence); + method public deprecated android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence); method public android.app.Notification.Action.WearableExtender setHintDisplayActionInline(boolean); method public android.app.Notification.Action.WearableExtender setHintLaunchesActivity(boolean); - method public android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence); + method public deprecated android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence); } public static class Notification.BigPictureStyle extends android.app.Notification.Style { @@ -5583,39 +5583,39 @@ package android.app { method public android.graphics.Bitmap getBackground(); method public java.lang.String getBridgeTag(); method public int getContentAction(); - method public int getContentIcon(); - method public int getContentIconGravity(); + method public deprecated int getContentIcon(); + method public deprecated int getContentIconGravity(); method public boolean getContentIntentAvailableOffline(); - method public int getCustomContentHeight(); - method public int getCustomSizePreset(); + method public deprecated int getCustomContentHeight(); + method public deprecated int getCustomSizePreset(); method public java.lang.String getDismissalId(); method public android.app.PendingIntent getDisplayIntent(); - method public int getGravity(); + method public deprecated int getGravity(); method public boolean getHintAmbientBigPicture(); - method public boolean getHintAvoidBackgroundClipping(); + method public deprecated boolean getHintAvoidBackgroundClipping(); method public boolean getHintContentIntentLaunchesActivity(); - method public boolean getHintHideIcon(); - method public int getHintScreenTimeout(); - method public boolean getHintShowBackgroundOnly(); + method public deprecated boolean getHintHideIcon(); + method public deprecated int getHintScreenTimeout(); + method public deprecated boolean getHintShowBackgroundOnly(); method public java.util.List<android.app.Notification> getPages(); method public boolean getStartScrollBottom(); method public android.app.Notification.WearableExtender setBackground(android.graphics.Bitmap); method public android.app.Notification.WearableExtender setBridgeTag(java.lang.String); method public android.app.Notification.WearableExtender setContentAction(int); - method public android.app.Notification.WearableExtender setContentIcon(int); - method public android.app.Notification.WearableExtender setContentIconGravity(int); + method public deprecated android.app.Notification.WearableExtender setContentIcon(int); + method public deprecated android.app.Notification.WearableExtender setContentIconGravity(int); method public android.app.Notification.WearableExtender setContentIntentAvailableOffline(boolean); - method public android.app.Notification.WearableExtender setCustomContentHeight(int); - method public android.app.Notification.WearableExtender setCustomSizePreset(int); + method public deprecated android.app.Notification.WearableExtender setCustomContentHeight(int); + method public deprecated android.app.Notification.WearableExtender setCustomSizePreset(int); method public android.app.Notification.WearableExtender setDismissalId(java.lang.String); method public android.app.Notification.WearableExtender setDisplayIntent(android.app.PendingIntent); - method public android.app.Notification.WearableExtender setGravity(int); + method public deprecated android.app.Notification.WearableExtender setGravity(int); method public android.app.Notification.WearableExtender setHintAmbientBigPicture(boolean); - method public android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean); + method public deprecated android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean); method public android.app.Notification.WearableExtender setHintContentIntentLaunchesActivity(boolean); - method public android.app.Notification.WearableExtender setHintHideIcon(boolean); - method public android.app.Notification.WearableExtender setHintScreenTimeout(int); - method public android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean); + method public deprecated android.app.Notification.WearableExtender setHintHideIcon(boolean); + method public deprecated android.app.Notification.WearableExtender setHintScreenTimeout(int); + method public deprecated android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean); method public android.app.Notification.WearableExtender setStartScrollBottom(boolean); field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0 @@ -6595,7 +6595,7 @@ package android.app.admin { method public void uninstallCaCert(android.content.ComponentName, byte[]); method public boolean updateOverrideApn(android.content.ComponentName, int, android.telephony.data.ApnSetting); method public void wipeData(int); - method public void wipeDataWithReason(int, java.lang.CharSequence); + method public void wipeData(int, java.lang.CharSequence); field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN"; field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED"; field public static final java.lang.String ACTION_DEVICE_ADMIN_SERVICE = "android.app.action.DEVICE_ADMIN_SERVICE"; @@ -6678,7 +6678,7 @@ package android.app.admin { field public static final int LOCK_TASK_FEATURE_KEYGUARD = 32; // 0x20 field public static final int LOCK_TASK_FEATURE_NONE = 0; // 0x0 field public static final int LOCK_TASK_FEATURE_NOTIFICATIONS = 2; // 0x2 - field public static final int LOCK_TASK_FEATURE_RECENTS = 8; // 0x8 + field public static final int LOCK_TASK_FEATURE_OVERVIEW = 8; // 0x8 field public static final int LOCK_TASK_FEATURE_SYSTEM_INFO = 1; // 0x1 field public static final int MAKE_USER_EPHEMERAL = 2; // 0x2 field public static final java.lang.String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning"; @@ -7267,6 +7267,7 @@ package android.app.slice { method public void registerSliceCallback(android.net.Uri, java.util.List<android.app.slice.SliceSpec>, java.util.concurrent.Executor, android.app.slice.SliceManager.SliceCallback); method public void unpinSlice(android.net.Uri); method public void unregisterSliceCallback(android.net.Uri, android.app.slice.SliceManager.SliceCallback); + field public static final java.lang.String SLICE_METADATA_KEY = "android.metadata.SLICE_URI"; } public static abstract interface SliceManager.SliceCallback { @@ -14509,7 +14510,9 @@ package android.graphics.drawable { ctor public AnimatedImageDrawable(); method public void clearAnimationCallbacks(); method public void draw(android.graphics.Canvas); + method public int getLoopCount(); method public int getOpacity(); + method public final boolean isAutoMirrored(); method public boolean isRunning(); method public void registerAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback); method public void setAlpha(int); @@ -16275,9 +16278,7 @@ package android.hardware.camera2 { field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP; field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE; field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE; - field public static final android.hardware.camera2.CaptureResult.Key<long[]> STATISTICS_OIS_TIMESTAMPS; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> STATISTICS_OIS_X_SHIFTS; - field public static final android.hardware.camera2.CaptureResult.Key<float[]> STATISTICS_OIS_Y_SHIFTS; + field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES; field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER; field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE; field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA; @@ -16373,6 +16374,13 @@ package android.hardware.camera2.params { field public static final int METERING_WEIGHT_MIN = 0; // 0x0 } + public final class OisSample { + ctor public OisSample(long, float, float); + method public long getTimestamp(); + method public float getXshift(); + method public float getYshift(); + } + public final class OutputConfiguration implements android.os.Parcelable { ctor public OutputConfiguration(android.view.Surface); ctor public OutputConfiguration(int, android.view.Surface); @@ -16574,7 +16582,7 @@ package android.hardware.fingerprint { field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8 } - public static abstract class FingerprintManager.AuthenticationCallback { + public static abstract deprecated class FingerprintManager.AuthenticationCallback { ctor public FingerprintManager.AuthenticationCallback(); method public void onAuthenticationError(int, java.lang.CharSequence); method public void onAuthenticationFailed(); @@ -16582,11 +16590,11 @@ package android.hardware.fingerprint { method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult); } - public static class FingerprintManager.AuthenticationResult { + public static deprecated class FingerprintManager.AuthenticationResult { method public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject(); } - public static final class FingerprintManager.CryptoObject { + public static final deprecated class FingerprintManager.CryptoObject { ctor public FingerprintManager.CryptoObject(java.security.Signature); ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher); ctor public FingerprintManager.CryptoObject(javax.crypto.Mac); @@ -22834,6 +22842,27 @@ package android.media { field public static final int STOP_VIDEO_RECORDING = 3; // 0x3 } + public class MediaBrowser2 extends android.media.MediaController2 { + ctor public MediaBrowser2(android.content.Context, android.media.SessionToken2, java.util.concurrent.Executor, android.media.MediaBrowser2.BrowserCallback); + method public void getChildren(java.lang.String, int, int, android.os.Bundle); + method public void getItem(java.lang.String); + method public void getLibraryRoot(android.os.Bundle); + method public void getSearchResult(java.lang.String, int, int, android.os.Bundle); + method public void search(java.lang.String, android.os.Bundle); + method public void subscribe(java.lang.String, android.os.Bundle); + method public void unsubscribe(java.lang.String); + } + + public static class MediaBrowser2.BrowserCallback extends android.media.MediaController2.ControllerCallback { + ctor public MediaBrowser2.BrowserCallback(); + method public void onChildrenChanged(java.lang.String, int, android.os.Bundle); + method public void onGetChildrenDone(java.lang.String, int, int, java.util.List<android.media.MediaItem2>, android.os.Bundle); + method public void onGetItemDone(java.lang.String, android.media.MediaItem2); + method public void onGetLibraryRootDone(android.os.Bundle, java.lang.String, android.os.Bundle); + method public void onGetSearchResultDone(java.lang.String, int, int, java.util.List<android.media.MediaItem2>, android.os.Bundle); + method public void onSearchResultChanged(java.lang.String, int, android.os.Bundle); + } + public final class MediaCas implements java.lang.AutoCloseable { ctor public MediaCas(int) throws android.media.MediaCasException.UnsupportedCasException; method public void close(); @@ -23310,6 +23339,73 @@ package android.media { field public static final int REGULAR_CODECS = 0; // 0x0 } + public class MediaController2 implements java.lang.AutoCloseable { + ctor public MediaController2(android.content.Context, android.media.SessionToken2, java.util.concurrent.Executor, android.media.MediaController2.ControllerCallback); + method public void addPlaylistItem(int, android.media.MediaItem2); + method public void adjustVolume(int, int); + method public void close(); + method public void fastForward(); + method public long getBufferedPosition(); + method public android.media.MediaItem2 getCurrentPlaylistItem(); + method public android.media.MediaController2.PlaybackInfo getPlaybackInfo(); + method public float getPlaybackSpeed(); + method public int getPlayerState(); + method public java.util.List<android.media.MediaItem2> getPlaylist(); + method public android.media.MediaSession2.PlaylistParams getPlaylistParams(); + method public long getPosition(); + method public android.app.PendingIntent getSessionActivity(); + method public android.media.SessionToken2 getSessionToken(); + method public boolean isConnected(); + method public void pause(); + method public void play(); + method public void playFromMediaId(java.lang.String, android.os.Bundle); + method public void playFromSearch(java.lang.String, android.os.Bundle); + method public void playFromUri(android.net.Uri, android.os.Bundle); + method public void prepare(); + method public void prepareFromMediaId(java.lang.String, android.os.Bundle); + method public void prepareFromSearch(java.lang.String, android.os.Bundle); + method public void prepareFromUri(android.net.Uri, android.os.Bundle); + method public void removePlaylistItem(android.media.MediaItem2); + method public void rewind(); + method public void seekTo(long); + method public void sendCustomCommand(android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); + method public void setPlaylistParams(android.media.MediaSession2.PlaylistParams); + method public void setRating(java.lang.String, android.media.Rating2); + method public void setVolumeTo(int, int); + method public void skipToNext(); + method public void skipToPlaylistItem(android.media.MediaItem2); + method public void skipToPrevious(); + method public void stop(); + } + + public static abstract class MediaController2.ControllerCallback { + ctor public MediaController2.ControllerCallback(); + method public void onAllowedCommandsChanged(android.media.MediaSession2.CommandGroup); + method public void onBufferedPositionChanged(long); + method public void onConnected(android.media.MediaSession2.CommandGroup); + method public void onCurrentPlaylistItemChanged(android.media.MediaItem2); + method public void onCustomCommand(android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); + method public void onCustomLayoutChanged(java.util.List<android.media.MediaSession2.CommandButton>); + method public void onDisconnected(); + method public void onError(int, int); + method public void onPlaybackInfoChanged(android.media.MediaController2.PlaybackInfo); + method public void onPlaybackSpeedChanged(float); + method public void onPlayerStateChanged(int); + method public void onPlaylistChanged(java.util.List<android.media.MediaItem2>); + method public void onPlaylistParamsChanged(android.media.MediaSession2.PlaylistParams); + method public void onPositionUpdated(long, long); + } + + public static final class MediaController2.PlaybackInfo { + method public android.media.AudioAttributes getAudioAttributes(); + method public int getControlType(); + method public int getCurrentVolume(); + method public int getMaxVolume(); + method public int getPlaybackType(); + field public static final int PLAYBACK_TYPE_LOCAL = 1; // 0x1 + field public static final int PLAYBACK_TYPE_REMOTE = 2; // 0x2 + } + public final class MediaCrypto { ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException; method protected void finalize(); @@ -23705,6 +23801,69 @@ package android.media { field public static final java.lang.String MIMETYPE_VIDEO_VP9 = "video/x-vnd.on2.vp9"; } + public class MediaItem2 { + method public static android.media.MediaItem2 fromBundle(android.content.Context, android.os.Bundle); + method public android.media.DataSourceDesc getDataSourceDesc(); + method public int getFlags(); + method public java.lang.String getMediaId(); + method public android.media.MediaMetadata2 getMetadata(); + method public boolean isBrowsable(); + method public boolean isPlayable(); + method public void setMetadata(android.media.MediaMetadata2); + method public android.os.Bundle toBundle(); + field public static final int FLAG_BROWSABLE = 1; // 0x1 + field public static final int FLAG_PLAYABLE = 2; // 0x2 + } + + public static final class MediaItem2.Builder { + ctor public MediaItem2.Builder(android.content.Context, int); + method public android.media.MediaItem2 build(); + method public android.media.MediaItem2.Builder setDataSourceDesc(android.media.DataSourceDesc); + method public android.media.MediaItem2.Builder setMediaId(java.lang.String); + method public android.media.MediaItem2.Builder setMetadata(android.media.MediaMetadata2); + } + + public abstract class MediaLibraryService2 extends android.media.MediaSessionService2 { + ctor public MediaLibraryService2(); + method public abstract android.media.MediaLibraryService2.MediaLibrarySession onCreateSession(java.lang.String); + field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaLibraryService2"; + } + + public static final class MediaLibraryService2.LibraryRoot { + ctor public MediaLibraryService2.LibraryRoot(android.content.Context, java.lang.String, android.os.Bundle); + method public android.os.Bundle getExtras(); + method public java.lang.String getRootId(); + field public static final java.lang.String EXTRA_OFFLINE = "android.media.extra.OFFLINE"; + field public static final java.lang.String EXTRA_RECENT = "android.media.extra.RECENT"; + field public static final java.lang.String EXTRA_SUGGESTED = "android.media.extra.SUGGESTED"; + } + + public static final class MediaLibraryService2.MediaLibrarySession extends android.media.MediaSession2 { + method public void notifyChildrenChanged(android.media.MediaSession2.ControllerInfo, java.lang.String, int, android.os.Bundle); + method public void notifyChildrenChanged(java.lang.String, int, android.os.Bundle); + method public void notifySearchResultChanged(android.media.MediaSession2.ControllerInfo, java.lang.String, int, android.os.Bundle); + } + + public static final class MediaLibraryService2.MediaLibrarySession.Builder { + ctor public MediaLibraryService2.MediaLibrarySession.Builder(android.media.MediaLibraryService2, android.media.MediaPlayerBase, java.util.concurrent.Executor, android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback); + method public android.media.MediaLibraryService2.MediaLibrarySession build(); + method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setId(java.lang.String); + method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionActivity(android.app.PendingIntent); + method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback); + method public android.media.MediaLibraryService2.MediaLibrarySession.Builder setVolumeProvider(android.media.VolumeProvider2); + } + + public static class MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback extends android.media.MediaSession2.SessionCallback { + ctor public MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback(android.content.Context); + method public java.util.List<android.media.MediaItem2> onGetChildren(android.media.MediaSession2.ControllerInfo, java.lang.String, int, int, android.os.Bundle); + method public android.media.MediaItem2 onGetItem(android.media.MediaSession2.ControllerInfo, java.lang.String); + method public android.media.MediaLibraryService2.LibraryRoot onGetLibraryRoot(android.media.MediaSession2.ControllerInfo, android.os.Bundle); + method public java.util.List<android.media.MediaItem2> onGetSearchResult(android.media.MediaSession2.ControllerInfo, java.lang.String, int, int, android.os.Bundle); + method public void onSearch(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onSubscribe(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onUnsubscribe(android.media.MediaSession2.ControllerInfo, java.lang.String); + } + public final class MediaMetadata implements android.os.Parcelable { method public boolean containsKey(java.lang.String); method public int describeContents(); @@ -23760,6 +23919,79 @@ package android.media { method public android.media.MediaMetadata.Builder putText(java.lang.String, java.lang.CharSequence); } + public final class MediaMetadata2 { + method public boolean containsKey(java.lang.String); + method public static android.media.MediaMetadata2 fromBundle(android.content.Context, android.os.Bundle); + method public android.graphics.Bitmap getBitmap(java.lang.String); + method public android.os.Bundle getExtras(); + method public float getFloat(java.lang.String); + method public long getLong(java.lang.String); + method public java.lang.String getMediaId(); + method public android.media.Rating2 getRating(java.lang.String); + method public java.lang.String getString(java.lang.String); + method public java.lang.CharSequence getText(java.lang.String); + method public java.util.Set<java.lang.String> keySet(); + method public int size(); + method public android.os.Bundle toBundle(); + field public static final long BT_FOLDER_TYPE_ALBUMS = 2L; // 0x2L + field public static final long BT_FOLDER_TYPE_ARTISTS = 3L; // 0x3L + field public static final long BT_FOLDER_TYPE_GENRES = 4L; // 0x4L + field public static final long BT_FOLDER_TYPE_MIXED = 0L; // 0x0L + field public static final long BT_FOLDER_TYPE_PLAYLISTS = 5L; // 0x5L + field public static final long BT_FOLDER_TYPE_TITLES = 1L; // 0x1L + field public static final long BT_FOLDER_TYPE_YEARS = 6L; // 0x6L + field public static final java.lang.String METADATA_KEY_ADVERTISEMENT = "android.media.metadata.ADVERTISEMENT"; + field public static final java.lang.String METADATA_KEY_ALBUM = "android.media.metadata.ALBUM"; + field public static final java.lang.String METADATA_KEY_ALBUM_ART = "android.media.metadata.ALBUM_ART"; + field public static final java.lang.String METADATA_KEY_ALBUM_ARTIST = "android.media.metadata.ALBUM_ARTIST"; + field public static final java.lang.String METADATA_KEY_ALBUM_ART_URI = "android.media.metadata.ALBUM_ART_URI"; + field public static final java.lang.String METADATA_KEY_ART = "android.media.metadata.ART"; + field public static final java.lang.String METADATA_KEY_ARTIST = "android.media.metadata.ARTIST"; + field public static final java.lang.String METADATA_KEY_ART_URI = "android.media.metadata.ART_URI"; + field public static final java.lang.String METADATA_KEY_AUTHOR = "android.media.metadata.AUTHOR"; + field public static final java.lang.String METADATA_KEY_BT_FOLDER_TYPE = "android.media.metadata.BT_FOLDER_TYPE"; + field public static final java.lang.String METADATA_KEY_COMPILATION = "android.media.metadata.COMPILATION"; + field public static final java.lang.String METADATA_KEY_COMPOSER = "android.media.metadata.COMPOSER"; + field public static final java.lang.String METADATA_KEY_DATE = "android.media.metadata.DATE"; + field public static final java.lang.String METADATA_KEY_DISC_NUMBER = "android.media.metadata.DISC_NUMBER"; + field public static final java.lang.String METADATA_KEY_DISPLAY_DESCRIPTION = "android.media.metadata.DISPLAY_DESCRIPTION"; + field public static final java.lang.String METADATA_KEY_DISPLAY_ICON = "android.media.metadata.DISPLAY_ICON"; + field public static final java.lang.String METADATA_KEY_DISPLAY_ICON_URI = "android.media.metadata.DISPLAY_ICON_URI"; + field public static final java.lang.String METADATA_KEY_DISPLAY_SUBTITLE = "android.media.metadata.DISPLAY_SUBTITLE"; + field public static final java.lang.String METADATA_KEY_DISPLAY_TITLE = "android.media.metadata.DISPLAY_TITLE"; + field public static final java.lang.String METADATA_KEY_DOWNLOAD_STATUS = "android.media.metadata.DOWNLOAD_STATUS"; + field public static final java.lang.String METADATA_KEY_DURATION = "android.media.metadata.DURATION"; + field public static final java.lang.String METADATA_KEY_EXTRAS = "android.media.metadata.EXTRAS"; + field public static final java.lang.String METADATA_KEY_GENRE = "android.media.metadata.GENRE"; + field public static final java.lang.String METADATA_KEY_MEDIA_ID = "android.media.metadata.MEDIA_ID"; + field public static final java.lang.String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI"; + field public static final java.lang.String METADATA_KEY_NUM_TRACKS = "android.media.metadata.NUM_TRACKS"; + field public static final java.lang.String METADATA_KEY_RADIO_CALLSIGN = "android.media.metadata.RADIO_CALLSIGN"; + field public static final java.lang.String METADATA_KEY_RADIO_FREQUENCY = "android.media.metadata.RADIO_FREQUENCY"; + field public static final java.lang.String METADATA_KEY_RATING = "android.media.metadata.RATING"; + field public static final java.lang.String METADATA_KEY_TITLE = "android.media.metadata.TITLE"; + field public static final java.lang.String METADATA_KEY_TRACK_NUMBER = "android.media.metadata.TRACK_NUMBER"; + field public static final java.lang.String METADATA_KEY_USER_RATING = "android.media.metadata.USER_RATING"; + field public static final java.lang.String METADATA_KEY_WRITER = "android.media.metadata.WRITER"; + field public static final java.lang.String METADATA_KEY_YEAR = "android.media.metadata.YEAR"; + field public static final long STATUS_DOWNLOADED = 2L; // 0x2L + field public static final long STATUS_DOWNLOADING = 1L; // 0x1L + field public static final long STATUS_NOT_DOWNLOADED = 0L; // 0x0L + } + + public static final class MediaMetadata2.Builder { + ctor public MediaMetadata2.Builder(android.content.Context); + ctor public MediaMetadata2.Builder(android.content.Context, android.media.MediaMetadata2); + method public android.media.MediaMetadata2 build(); + method public android.media.MediaMetadata2.Builder putBitmap(java.lang.String, android.graphics.Bitmap); + method public android.media.MediaMetadata2.Builder putFloat(java.lang.String, float); + method public android.media.MediaMetadata2.Builder putLong(java.lang.String, long); + method public android.media.MediaMetadata2.Builder putRating(java.lang.String, android.media.Rating2); + method public android.media.MediaMetadata2.Builder putString(java.lang.String, java.lang.String); + method public android.media.MediaMetadata2.Builder putText(java.lang.String, java.lang.CharSequence); + method public android.media.MediaMetadata2.Builder setExtras(android.os.Bundle); + } + public abstract deprecated class MediaMetadataEditor { method public synchronized void addEditableKey(int); method public abstract void apply(); @@ -24075,13 +24307,14 @@ package android.media { method public static final android.media.MediaPlayer2 create(); method public abstract void deselectTrack(int); method public abstract android.media.DataSourceDesc editPlaylistItem(int, android.media.DataSourceDesc); + method public abstract android.media.AudioAttributes getAudioAttributes(); method public abstract int getAudioSessionId(); method public abstract android.media.DataSourceDesc getCurrentDataSource(); method public abstract int getCurrentPlaylistItemIndex(); - method public abstract int getCurrentPosition(); + method public abstract long getCurrentPosition(); method public abstract android.media.MediaPlayer2.DrmInfo getDrmInfo(); method public abstract java.lang.String getDrmPropertyString(java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException; - method public abstract int getDuration(); + method public abstract long getDuration(); method public abstract android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.Map<java.lang.String, java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException; method public abstract int getLoopingMode(); method public abstract android.os.PersistableBundle getMetrics(); @@ -24167,8 +24400,8 @@ package android.media { public static abstract class MediaPlayer2.DrmEventCallback { ctor public MediaPlayer2.DrmEventCallback(); - method public void onDrmInfo(android.media.MediaPlayer2, android.media.MediaPlayer2.DrmInfo); - method public void onDrmPrepared(android.media.MediaPlayer2, int); + method public void onDrmInfo(android.media.MediaPlayer2, long, android.media.MediaPlayer2.DrmInfo); + method public void onDrmPrepared(android.media.MediaPlayer2, long, int); } public static abstract class MediaPlayer2.DrmInfo { @@ -24206,7 +24439,7 @@ package android.media { } public static abstract interface MediaPlayer2.OnDrmConfigHelper { - method public abstract void onDrmConfig(android.media.MediaPlayer2); + method public abstract void onDrmConfig(android.media.MediaPlayer2, long); } public static abstract class MediaPlayer2.ProvisioningNetworkErrorException extends android.media.MediaDrmException { @@ -24230,6 +24463,19 @@ package android.media { field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1 } + public abstract class MediaPlayerBase implements java.lang.AutoCloseable { + ctor public MediaPlayerBase(); + method public abstract android.media.AudioAttributes getAudioAttributes(); + method public abstract int getPlayerState(); + method public abstract void pause(); + method public abstract void play(); + method public abstract void setAudioAttributes(android.media.AudioAttributes); + field public static final int STATE_ERROR = 0; // 0x0 + field public static final int STATE_IDLE = 0; // 0x0 + field public static final int STATE_PAUSED = 0; // 0x0 + field public static final int STATE_PLAYING = 0; // 0x0 + } + public class MediaRecorder implements android.media.AudioRouting { ctor public MediaRecorder(); method public void addOnRoutingChangedListener(android.media.AudioRouting.OnRoutingChangedListener, android.os.Handler); @@ -24506,6 +24752,172 @@ package android.media { method public abstract void onScanCompleted(java.lang.String, android.net.Uri); } + public class MediaSession2 implements java.lang.AutoCloseable { + method public void addPlaylistItem(int, android.media.MediaItem2); + method public void close(); + method public void editPlaylistItem(android.media.MediaItem2); + method public void fastForward(); + method public java.util.List<android.media.MediaSession2.ControllerInfo> getConnectedControllers(); + method public android.media.MediaItem2 getCurrentPlaylistItem(); + method public android.media.MediaPlayerBase getPlayer(); + method public java.util.List<android.media.MediaItem2> getPlaylist(); + method public android.media.MediaSession2.PlaylistParams getPlaylistParams(); + method public android.media.SessionToken2 getToken(); + method public void notifyError(int, int); + method public void pause(); + method public void play(); + method public void prepare(); + method public void removePlaylistItem(android.media.MediaItem2); + method public void rewind(); + method public void seekTo(long); + method public void sendCustomCommand(android.media.MediaSession2.Command, android.os.Bundle); + method public void sendCustomCommand(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); + method public void setAllowedCommands(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.CommandGroup); + method public void setCustomLayout(android.media.MediaSession2.ControllerInfo, java.util.List<android.media.MediaSession2.CommandButton>); + method public void setPlayer(android.media.MediaPlayerBase); + method public void setPlayer(android.media.MediaPlayerBase, android.media.VolumeProvider2); + method public void setPlaylist(java.util.List<android.media.MediaItem2>); + method public void setPlaylistParams(android.media.MediaSession2.PlaylistParams); + method public void skipToNext(); + method public void skipToPlaylistItem(android.media.MediaItem2); + method public void skipToPrevious(); + method public void stop(); + field public static final int COMMAND_CODE_BROWSER = 22; // 0x16 + field public static final int COMMAND_CODE_CUSTOM = 0; // 0x0 + field public static final int COMMAND_CODE_PLAYBACK_FAST_FORWARD = 7; // 0x7 + field public static final int COMMAND_CODE_PLAYBACK_PAUSE = 2; // 0x2 + field public static final int COMMAND_CODE_PLAYBACK_PLAY = 1; // 0x1 + field public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6; // 0x6 + field public static final int COMMAND_CODE_PLAYBACK_REWIND = 8; // 0x8 + field public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9; // 0x9 + field public static final int COMMAND_CODE_PLAYBACK_SET_CURRENT_PLAYLIST_ITEM = 10; // 0xa + field public static final int COMMAND_CODE_PLAYBACK_SET_PLAYLIST_PARAMS = 11; // 0xb + field public static final int COMMAND_CODE_PLAYBACK_SKIP_NEXT_ITEM = 4; // 0x4 + field public static final int COMMAND_CODE_PLAYBACK_SKIP_PREV_ITEM = 5; // 0x5 + field public static final int COMMAND_CODE_PLAYBACK_STOP = 3; // 0x3 + field public static final int COMMAND_CODE_PLAYLIST_ADD = 12; // 0xc + field public static final int COMMAND_CODE_PLAYLIST_GET = 14; // 0xe + field public static final int COMMAND_CODE_PLAYLIST_REMOVE = 13; // 0xd + field public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 16; // 0x10 + field public static final int COMMAND_CODE_PLAY_FROM_SEARCH = 18; // 0x12 + field public static final int COMMAND_CODE_PLAY_FROM_URI = 17; // 0x11 + field public static final int COMMAND_CODE_PREPARE_FROM_MEDIA_ID = 19; // 0x13 + field public static final int COMMAND_CODE_PREPARE_FROM_SEARCH = 21; // 0x15 + field public static final int COMMAND_CODE_PREPARE_FROM_URI = 20; // 0x14 + field public static final int COMMAND_CODE_SET_VOLUME = 15; // 0xf + field public static final int ERROR_CODE_ACTION_ABORTED = 10; // 0xa + field public static final int ERROR_CODE_APP_ERROR = 1; // 0x1 + field public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; // 0x3 + field public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; // 0x5 + field public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; // 0x8 + field public static final int ERROR_CODE_END_OF_QUEUE = 11; // 0xb + field public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; // 0x7 + field public static final int ERROR_CODE_NOT_SUPPORTED = 2; // 0x2 + field public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; // 0x6 + field public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; // 0x4 + field public static final int ERROR_CODE_SETUP_REQUIRED = 12; // 0xc + field public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; // 0x9 + field public static final int ERROR_CODE_UNKNOWN_ERROR = 0; // 0x0 + } + + public static final class MediaSession2.Builder { + ctor public MediaSession2.Builder(android.content.Context, android.media.MediaPlayerBase); + method public android.media.MediaSession2 build(); + method public android.media.MediaSession2.Builder setId(java.lang.String); + method public android.media.MediaSession2.Builder setSessionActivity(android.app.PendingIntent); + method public android.media.MediaSession2.Builder setSessionCallback(java.util.concurrent.Executor, android.media.MediaSession2.SessionCallback); + method public android.media.MediaSession2.Builder setVolumeProvider(android.media.VolumeProvider2); + } + + public static final class MediaSession2.Command { + ctor public MediaSession2.Command(android.content.Context, int); + ctor public MediaSession2.Command(android.content.Context, java.lang.String, android.os.Bundle); + method public int getCommandCode(); + method public java.lang.String getCustomCommand(); + method public android.os.Bundle getExtra(); + } + + public static final class MediaSession2.CommandButton { + method public android.media.MediaSession2.Command getCommand(); + method public java.lang.String getDisplayName(); + method public android.os.Bundle getExtra(); + method public int getIconResId(); + method public boolean isEnabled(); + } + + public static final class MediaSession2.CommandButton.Builder { + ctor public MediaSession2.CommandButton.Builder(android.content.Context); + method public android.media.MediaSession2.CommandButton build(); + method public android.media.MediaSession2.CommandButton.Builder setCommand(android.media.MediaSession2.Command); + method public android.media.MediaSession2.CommandButton.Builder setDisplayName(java.lang.String); + method public android.media.MediaSession2.CommandButton.Builder setEnabled(boolean); + method public android.media.MediaSession2.CommandButton.Builder setExtra(android.os.Bundle); + method public android.media.MediaSession2.CommandButton.Builder setIconResId(int); + } + + public static final class MediaSession2.CommandGroup { + ctor public MediaSession2.CommandGroup(android.content.Context); + ctor public MediaSession2.CommandGroup(android.content.Context, android.media.MediaSession2.CommandGroup); + method public void addAllPredefinedCommands(); + method public void addCommand(android.media.MediaSession2.Command); + method public boolean hasCommand(android.media.MediaSession2.Command); + method public boolean hasCommand(int); + method public void removeCommand(android.media.MediaSession2.Command); + } + + public static final class MediaSession2.ControllerInfo { + method public java.lang.String getPackageName(); + method public int getUid(); + method public boolean isTrusted(); + } + + public static final class MediaSession2.PlaylistParams { + ctor public MediaSession2.PlaylistParams(android.content.Context, int, int, android.media.MediaMetadata2); + method public static android.media.MediaSession2.PlaylistParams fromBundle(android.content.Context, android.os.Bundle); + method public android.media.MediaMetadata2 getPlaylistMetadata(); + method public int getRepeatMode(); + method public int getShuffleMode(); + method public android.os.Bundle toBundle(); + field public static final int REPEAT_MODE_ALL = 2; // 0x2 + field public static final int REPEAT_MODE_GROUP = 3; // 0x3 + field public static final int REPEAT_MODE_NONE = 0; // 0x0 + field public static final int REPEAT_MODE_ONE = 1; // 0x1 + field public static final int SHUFFLE_MODE_ALL = 1; // 0x1 + field public static final int SHUFFLE_MODE_GROUP = 2; // 0x2 + field public static final int SHUFFLE_MODE_NONE = 0; // 0x0 + } + + public static abstract class MediaSession2.SessionCallback { + ctor public MediaSession2.SessionCallback(android.content.Context); + method public boolean onCommandRequest(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command); + method public android.media.MediaSession2.CommandGroup onConnect(android.media.MediaSession2.ControllerInfo); + method public void onCustomCommand(android.media.MediaSession2.ControllerInfo, android.media.MediaSession2.Command, android.os.Bundle, android.os.ResultReceiver); + method public void onDisconnected(android.media.MediaSession2.ControllerInfo); + method public void onPlayFromMediaId(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onPlayFromSearch(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onPlayFromUri(android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); + method public void onPrepareFromMediaId(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onPrepareFromSearch(android.media.MediaSession2.ControllerInfo, java.lang.String, android.os.Bundle); + method public void onPrepareFromUri(android.media.MediaSession2.ControllerInfo, android.net.Uri, android.os.Bundle); + method public void onSetRating(android.media.MediaSession2.ControllerInfo, java.lang.String, android.media.Rating2); + } + + public abstract class MediaSessionService2 extends android.app.Service { + ctor public MediaSessionService2(); + method public final android.media.MediaSession2 getSession(); + method public android.os.IBinder onBind(android.content.Intent); + method public abstract android.media.MediaSession2 onCreateSession(java.lang.String); + method public android.media.MediaSessionService2.MediaNotification onUpdateNotification(); + field public static final java.lang.String SERVICE_INTERFACE = "android.media.MediaSessionService2"; + field public static final java.lang.String SERVICE_META_DATA = "android.media.session"; + } + + public static class MediaSessionService2.MediaNotification { + ctor public MediaSessionService2.MediaNotification(android.content.Context, int, android.app.Notification); + method public android.app.Notification getNotification(); + method public int getNotificationId(); + } + public final class MediaSync { ctor public MediaSync(); method public android.view.Surface createInputSurface(); @@ -24573,13 +24985,19 @@ package android.media { field public static final int DIRECTIONALITY_OMNI = 1; // 0x1 field public static final int DIRECTIONALITY_SUPER_CARDIOID = 5; // 0x5 field public static final int DIRECTIONALITY_UNKNOWN = 0; // 0x0 + field public static final int GROUP_UNKNOWN = -1; // 0xffffffff + field public static final int INDEX_IN_THE_GROUP_UNKNOWN = -1; // 0xffffffff field public static final int LOCATION_MAINBODY = 1; // 0x1 field public static final int LOCATION_MAINBODY_MOVABLE = 2; // 0x2 field public static final int LOCATION_PERIPHERAL = 3; // 0x3 field public static final int LOCATION_UNKNOWN = 0; // 0x0 + field public static final android.media.MicrophoneInfo.Coordinate3F ORIENTATION_UNKNOWN; + field public static final android.media.MicrophoneInfo.Coordinate3F POSITION_UNKNOWN; + field public static final float SENSITIVITY_UNKNOWN = -3.4028235E38f; + field public static final float SPL_UNKNOWN = -3.4028235E38f; } - public class MicrophoneInfo.Coordinate3F { + public static final class MicrophoneInfo.Coordinate3F { field public final float x; field public final float y; field public final float z; @@ -24630,6 +25048,29 @@ package android.media { field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2 } + public final class Rating2 { + method public static android.media.Rating2 fromBundle(android.content.Context, android.os.Bundle); + method public float getPercentRating(); + method public int getRatingStyle(); + method public float getStarRating(); + method public boolean hasHeart(); + method public boolean isRated(); + method public boolean isThumbUp(); + method public static android.media.Rating2 newHeartRating(android.content.Context, boolean); + method public static android.media.Rating2 newPercentageRating(android.content.Context, float); + method public static android.media.Rating2 newStarRating(android.content.Context, int, float); + method public static android.media.Rating2 newThumbRating(android.content.Context, boolean); + method public static android.media.Rating2 newUnratedRating(android.content.Context, int); + method public android.os.Bundle toBundle(); + field public static final int RATING_3_STARS = 3; // 0x3 + field public static final int RATING_4_STARS = 4; // 0x4 + field public static final int RATING_5_STARS = 5; // 0x5 + field public static final int RATING_HEART = 1; // 0x1 + field public static final int RATING_NONE = 0; // 0x0 + field public static final int RATING_PERCENTAGE = 6; // 0x6 + field public static final int RATING_THUMB_UP_DOWN = 2; // 0x2 + } + public deprecated class RemoteControlClient { ctor public RemoteControlClient(android.app.PendingIntent); ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper); @@ -24765,6 +25206,22 @@ package android.media { field public static final int URI_COLUMN_INDEX = 2; // 0x2 } + public final class SessionToken2 { + ctor public SessionToken2(android.content.Context, java.lang.String, java.lang.String); + method public static android.media.SessionToken2 fromBundle(android.content.Context, android.os.Bundle); + method public java.lang.String getId(); + method public java.lang.String getPackageName(); + method public int getType(); + method public int getUid(); + method public android.os.Bundle toBundle(); + field public static final int TYPE_LIBRARY_SERVICE = 2; // 0x2 + field public static final int TYPE_SESSION = 0; // 0x0 + field public static final int TYPE_SESSION_SERVICE = 1; // 0x1 + } + + public static abstract class SessionToken2.TokenType implements java.lang.annotation.Annotation { + } + public class SoundPool { ctor public deprecated SoundPool(int, int, int); method public final void autoPause(); @@ -24968,6 +25425,19 @@ package android.media { field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1 } + public abstract class VolumeProvider2 { + ctor public VolumeProvider2(android.content.Context, int, int, int); + method public final int getControlType(); + method public final int getCurrentVolume(); + method public final int getMaxVolume(); + method public void onAdjustVolume(int); + method public void onSetVolumeTo(int); + method public final void setCurrentVolume(int); + field public static final int VOLUME_CONTROL_ABSOLUTE = 2; // 0x2 + field public static final int VOLUME_CONTROL_FIXED = 0; // 0x0 + field public static final int VOLUME_CONTROL_RELATIVE = 1; // 0x1 + } + public final class VolumeShaper implements java.lang.AutoCloseable { method public void apply(android.media.VolumeShaper.Operation); method public void close(); @@ -25714,14 +26184,23 @@ package android.media.session { public final class MediaSessionManager { method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName); method public void addOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener, android.content.ComponentName, android.os.Handler); + method public void addOnSessionTokensChangedListener(java.util.concurrent.Executor, android.media.session.MediaSessionManager.OnSessionTokensChangedListener); + method public java.util.List<android.media.SessionToken2> getActiveSessionTokens(); method public java.util.List<android.media.session.MediaController> getActiveSessions(android.content.ComponentName); + method public java.util.List<android.media.SessionToken2> getAllSessionTokens(); + method public java.util.List<android.media.SessionToken2> getSessionServiceTokens(); method public void removeOnActiveSessionsChangedListener(android.media.session.MediaSessionManager.OnActiveSessionsChangedListener); + method public void removeOnSessionTokensChangedListener(android.media.session.MediaSessionManager.OnSessionTokensChangedListener); } public static abstract interface MediaSessionManager.OnActiveSessionsChangedListener { method public abstract void onActiveSessionsChanged(java.util.List<android.media.session.MediaController>); } + public static abstract interface MediaSessionManager.OnSessionTokensChangedListener { + method public abstract void onSessionTokensChanged(java.util.List<android.media.SessionToken2>); + } + public final class PlaybackState implements android.os.Parcelable { method public int describeContents(); method public long getActions(); @@ -32980,7 +33459,7 @@ package android.os { method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyDropBox(); method public android.os.StrictMode.ThreadPolicy.Builder penaltyFlashScreen(); - method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(android.os.StrictMode.OnThreadViolationListener, java.util.concurrent.Executor); + method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnThreadViolationListener); method public android.os.StrictMode.ThreadPolicy.Builder penaltyLog(); method public android.os.StrictMode.ThreadPolicy.Builder permitAll(); method public android.os.StrictMode.ThreadPolicy.Builder permitCustomSlowCalls(); @@ -33012,7 +33491,7 @@ package android.os { method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnCleartextNetwork(); method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnFileUriExposure(); method public android.os.StrictMode.VmPolicy.Builder penaltyDropBox(); - method public android.os.StrictMode.VmPolicy.Builder penaltyListener(android.os.StrictMode.OnVmViolationListener, java.util.concurrent.Executor); + method public android.os.StrictMode.VmPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnVmViolationListener); method public android.os.StrictMode.VmPolicy.Builder penaltyLog(); method public android.os.StrictMode.VmPolicy.Builder setClassInstanceLimit(java.lang.Class, int); } @@ -34622,10 +35101,9 @@ package android.provider { field public static final java.lang.String DURATION = "duration"; field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER"; field public static final java.lang.String FEATURES = "features"; - field public static final int FEATURES_ASSISTED_DIALING_USED = 16; // 0x10 field public static final int FEATURES_HD_CALL = 4; // 0x4 field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2 - field public static final int FEATURES_RTT = 32; // 0x20 + field public static final int FEATURES_RTT = 16; // 0x10 field public static final int FEATURES_VIDEO = 1; // 0x1 field public static final int FEATURES_WIFI = 8; // 0x8 field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location"; @@ -38246,17 +38724,6 @@ package android.se.omapi { method public byte[] transmit(byte[]) throws java.io.IOException; } - public abstract interface ISecureElementListener implements android.os.IInterface { - method public abstract void serviceConnected() throws android.os.RemoteException; - } - - public static abstract class ISecureElementListener.Stub extends android.os.Binder implements android.se.omapi.ISecureElementListener { - ctor public ISecureElementListener.Stub(); - method public android.os.IBinder asBinder(); - method public static android.se.omapi.ISecureElementListener asInterface(android.os.IBinder); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - } - public class Reader { method public void closeSessions(); method public java.lang.String getName(); @@ -38266,13 +38733,19 @@ package android.se.omapi { } public class SEService { - ctor public SEService(android.content.Context, android.se.omapi.ISecureElementListener); + ctor public SEService(android.content.Context, android.se.omapi.SEService.SecureElementListener); method public android.se.omapi.Reader[] getReaders(); method public java.lang.String getVersion(); method public boolean isConnected(); method public void shutdown(); } + public static abstract class SEService.SecureElementListener extends android.os.Binder { + ctor public SEService.SecureElementListener(); + method public android.os.IBinder asBinder(); + method public void serviceConnected(); + } + public class Session { method public void close(); method public void closeChannels(); @@ -38432,7 +38905,6 @@ package android.security.keystore { method public boolean isRandomizedEncryptionRequired(); method public boolean isStrongBoxBacked(); method public boolean isTrustedUserPresenceRequired(); - method public boolean isUnlockedDeviceRequired(); method public boolean isUserAuthenticationRequired(); method public boolean isUserAuthenticationValidWhileOnBody(); method public boolean isUserConfirmationRequired(); @@ -38460,7 +38932,6 @@ package android.security.keystore { method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean); method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...); method public android.security.keystore.KeyGenParameterSpec.Builder setTrustedUserPresenceRequired(boolean); - method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean); method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean); method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean); method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int); @@ -38552,8 +39023,6 @@ package android.security.keystore { method public boolean isDigestsSpecified(); method public boolean isInvalidatedByBiometricEnrollment(); method public boolean isRandomizedEncryptionRequired(); - method public boolean isTrustedUserPresenceRequired(); - method public boolean isUnlockedDeviceRequired(); method public boolean isUserAuthenticationRequired(); method public boolean isUserAuthenticationValidWhileOnBody(); method public boolean isUserConfirmationRequired(); @@ -38572,8 +39041,6 @@ package android.security.keystore { method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date); method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean); method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...); - method public android.security.keystore.KeyProtection.Builder setTrustedUserPresenceRequired(boolean); - method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean); method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean); method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean); method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int); @@ -40626,7 +41093,6 @@ package android.telecom { field public static final int CAPABILITY_SUPPORT_DEFLECT = 16777216; // 0x1000000 field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2 field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8 - field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200 field public static final int PROPERTY_CONFERENCE = 1; // 0x1 field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4 field public static final int PROPERTY_ENTERPRISE_CALL = 32; // 0x20 @@ -40851,7 +41317,6 @@ package android.telecom { field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT"; field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS"; field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER"; - field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200 field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 32; // 0x20 field public static final int PROPERTY_IS_EXTERNAL_CALL = 16; // 0x10 field public static final int PROPERTY_IS_RTT = 256; // 0x100 @@ -41268,14 +41733,12 @@ package android.telecom { field public static final deprecated java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL"; field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED"; field public static final java.lang.String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED"; - field public static final java.lang.String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS"; field public static final java.lang.String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS"; field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS"; field public static final java.lang.String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION"; field public static final java.lang.String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS"; field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ',' field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';' - field public static final java.lang.String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO = "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO"; field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE"; field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE"; @@ -41291,7 +41754,6 @@ package android.telecom { field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT"; field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE"; field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE"; - field public static final java.lang.String EXTRA_USE_ASSISTED_DIALING = "android.telecom.extra.USE_ASSISTED_DIALING"; field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; @@ -41304,18 +41766,6 @@ package android.telecom { field public static final int PRESENTATION_UNKNOWN = 3; // 0x3 } - public final class TransformationInfo implements android.os.Parcelable { - ctor public TransformationInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String, int); - method public int describeContents(); - method public java.lang.String getOriginalNumber(); - method public java.lang.String getTransformedNumber(); - method public int getTransformedNumberCountryCallingCode(); - method public java.lang.String getUserHomeCountryCode(); - method public java.lang.String getUserRoamingCountryCode(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.telecom.TransformationInfo> CREATOR; - } - public class VideoProfile implements android.os.Parcelable { ctor public VideoProfile(int); ctor public VideoProfile(int, int); @@ -41482,7 +41932,6 @@ package android.telephony { field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool"; field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool"; field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool"; - field public static final java.lang.String KEY_ASSISTED_DIALING_ENABLED_BOOL = "assisted_dialing_enabled_bool"; field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool"; field public static final java.lang.String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = "call_forwarding_blocks_while_roaming_string_array"; field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool"; @@ -41821,12 +42270,12 @@ package android.telephony { public class MbmsDownloadSession implements java.lang.AutoCloseable { method public int cancelDownload(android.telephony.mbms.DownloadRequest); method public void close(); - method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler); - method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler); + method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsDownloadSessionCallback); + method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsDownloadSessionCallback); method public int download(android.telephony.mbms.DownloadRequest); method public java.io.File getTempFileRootDirectory(); method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads(); - method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler); + method public int registerStateCallback(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStateCallback); method public void requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo); method public void requestUpdateFileServices(java.util.List<java.lang.String>); method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest); @@ -41854,10 +42303,10 @@ package android.telephony { public class MbmsStreamingSession implements java.lang.AutoCloseable { method public void close(); - method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, int, android.os.Handler); - method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, android.os.Handler); + method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsStreamingSessionCallback); + method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsStreamingSessionCallback); method public void requestUpdateStreamingServices(java.util.List<java.lang.String>); - method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler); + method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, java.util.concurrent.Executor, android.telephony.mbms.StreamingServiceCallback); } public class NeighboringCellInfo implements android.os.Parcelable { @@ -42730,20 +43179,23 @@ package android.telephony.gsm { package android.telephony.mbms { public final class DownloadRequest implements android.os.Parcelable { - method public static android.telephony.mbms.DownloadRequest copy(android.telephony.mbms.DownloadRequest); method public int describeContents(); + method public android.net.Uri getDestinationUri(); method public java.lang.String getFileServiceId(); method public static int getMaxAppIntentSize(); method public static int getMaxDestinationUriSize(); method public android.net.Uri getSourceUri(); method public int getSubscriptionId(); + method public byte[] toByteArray(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.telephony.mbms.DownloadRequest> CREATOR; } public static class DownloadRequest.Builder { - ctor public DownloadRequest.Builder(android.net.Uri); + ctor public DownloadRequest.Builder(android.net.Uri, android.net.Uri); method public android.telephony.mbms.DownloadRequest build(); + method public static android.telephony.mbms.DownloadRequest.Builder fromDownloadRequest(android.telephony.mbms.DownloadRequest); + method public static android.telephony.mbms.DownloadRequest.Builder fromSerializedRequest(byte[]); method public android.telephony.mbms.DownloadRequest.Builder setAppIntent(android.content.Intent); method public android.telephony.mbms.DownloadRequest.Builder setServiceInfo(android.telephony.mbms.FileServiceInfo); method public android.telephony.mbms.DownloadRequest.Builder setSubscriptionId(int); @@ -42839,10 +43291,10 @@ package android.telephony.mbms { method public java.util.Date getSessionStartTime(); } - public class StreamingService { + public class StreamingService implements java.lang.AutoCloseable { + method public void close(); method public android.telephony.mbms.StreamingServiceInfo getInfo(); method public android.net.Uri getPlaybackUri(); - method public void stopStreaming(); field public static final int BROADCAST_METHOD = 1; // 0x1 field public static final int REASON_BY_USER_REQUEST = 1; // 0x1 field public static final int REASON_END_OF_SESSION = 2; // 0x2 @@ -47618,6 +48070,7 @@ package android.view { method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); method public void setAutofillHints(java.lang.String...); + method public void setAutofillId(android.view.autofill.AutofillId); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable); @@ -49781,6 +50234,7 @@ package android.view.autofill { method public android.content.ComponentName getAutofillServiceComponentName(); method public java.util.List<java.lang.String> getAvailableFieldClassificationAlgorithms(); method public java.lang.String getDefaultFieldClassificationAlgorithm(); + method public android.view.autofill.AutofillId getNextAutofillId(); method public android.service.autofill.UserData getUserData(); method public java.lang.String getUserDataId(); method public boolean hasEnabledAutofillServices(); diff --git a/api/removed.txt b/api/removed.txt index 55022f36a016..79c54fde5477 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -257,6 +257,14 @@ package android.os { ctor public RecoverySystem(); } + public static final class StrictMode.ThreadPolicy.Builder { + method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(android.os.StrictMode.OnThreadViolationListener, java.util.concurrent.Executor); + } + + public static final class StrictMode.VmPolicy.Builder { + method public android.os.StrictMode.VmPolicy.Builder penaltyListener(android.os.StrictMode.OnVmViolationListener, java.util.concurrent.Executor); + } + public final class SystemClock { method public static java.time.Clock elapsedRealtimeClock(); method public static java.time.Clock uptimeClock(); diff --git a/api/system-current.txt b/api/system-current.txt index e0c447a1f506..3aca59a5724d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -125,6 +125,7 @@ package android { field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION"; field public static final java.lang.String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE"; field public static final java.lang.String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT"; + field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES"; field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS"; field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE"; field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER"; @@ -203,6 +204,7 @@ package android { field public static final int isVrOnly = 16844152; // 0x1010578 field public static final int requiredSystemPropertyName = 16844133; // 0x1010565 field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566 + field public static final int userRestriction = 16844165; // 0x1010585 } public static final class R.raw { @@ -469,7 +471,11 @@ package android.app.backup { method public android.app.backup.RestoreSession beginRestoreSession(); method public void cancelBackups(); method public long getAvailableRestoreToken(java.lang.String); + method public android.content.Intent getConfigurationIntent(java.lang.String); method public java.lang.String getCurrentTransport(); + method public android.content.Intent getDataManagementIntent(java.lang.String); + method public java.lang.String getDataManagementLabel(java.lang.String); + method public java.lang.String getDestinationString(java.lang.String); method public boolean isAppEligibleForBackup(java.lang.String); method public boolean isBackupEnabled(); method public boolean isBackupServiceActive(android.os.UserHandle); @@ -4171,6 +4177,8 @@ package android.provider { method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean); method public static void resetToDefaults(android.content.ContentResolver, java.lang.String); field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages"; + field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names"; + field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist"; field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus"; field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent"; field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis"; @@ -4266,7 +4274,7 @@ package android.security.keystore.recovery { method public int getMaxAttempts(); method public byte[] getServerParams(); method public int getSnapshotVersion(); - method public byte[] getTrustedHardwarePublicKey(); + method public java.security.cert.CertPath getTrustedHardwareCertPath(); method public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR; @@ -4287,21 +4295,21 @@ package android.security.keystore.recovery { } public class RecoveryController { + method public android.security.keystore.recovery.RecoverySession createRecoverySession(); method public byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException; - method public java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; + method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException; + method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException; method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context); method public int[] getPendingRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException; method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; + method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; method public void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; method public void recoverySecretAvailable(android.security.keystore.recovery.KeyChainProtectionParams) throws android.security.keystore.recovery.InternalRecoveryServiceException; method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException; + method public void setRecoveryStatus(java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException; method public void setServerParams(byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException; method public void setSnapshotCreatedPendingIntent(android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException; - field public static final int RECOVERY_STATUS_MISSING_ACCOUNT = 2; // 0x2 field public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3; // 0x3 field public static final int RECOVERY_STATUS_SYNCED = 0; // 0x0 field public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1; // 0x1 @@ -4310,7 +4318,7 @@ package android.security.keystore.recovery { public class RecoverySession implements java.lang.AutoCloseable { method public void close(); method public java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException; - method public byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; + method public byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; } public class SessionExpiredException extends java.security.GeneralSecurityException { @@ -4319,7 +4327,6 @@ package android.security.keystore.recovery { public final class WrappedApplicationKey implements android.os.Parcelable { method public int describeContents(); - method public byte[] getAccount(); method public java.lang.String getAlias(); method public byte[] getEncryptedKeyMaterial(); method public void writeToParcel(android.os.Parcel, int); @@ -4329,7 +4336,6 @@ package android.security.keystore.recovery { public static class WrappedApplicationKey.Builder { ctor public WrappedApplicationKey.Builder(); method public android.security.keystore.recovery.WrappedApplicationKey build(); - method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]); method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String); method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]); } @@ -5215,6 +5221,7 @@ package android.telephony { method public int describeContents(); method public int getCarrierPrivilegeStatus(android.content.pm.PackageInfo); method public int getCarrierPrivilegeStatus(android.content.pm.Signature, java.lang.String); + method public java.lang.String getCertificateHexString(); method public java.lang.String getPackageName(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR; @@ -6123,7 +6130,9 @@ package android.telephony.ims.stub { method public final void onSmsReceived(int, java.lang.String, byte[]) throws java.lang.RuntimeException; method public final void onSmsStatusReportReceived(int, int, java.lang.String, byte[]) throws java.lang.RuntimeException; method public void sendSms(int, int, java.lang.String, java.lang.String, boolean, byte[]); - field public static final int DELIVER_STATUS_ERROR = 2; // 0x2 + field public static final int DELIVER_STATUS_ERROR_GENERIC = 2; // 0x2 + field public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; // 0x3 + field public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; // 0x4 field public static final int DELIVER_STATUS_OK = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_ERROR_FALLBACK = 4; // 0x4 @@ -6160,12 +6169,7 @@ package android.telephony.ims.stub { package android.telephony.mbms { - public final class DownloadRequest implements android.os.Parcelable { - method public byte[] getOpaqueData(); - } - public static class DownloadRequest.Builder { - method public android.telephony.mbms.DownloadRequest.Builder setOpaqueData(byte[]); method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String); } diff --git a/api/system-removed.txt b/api/system-removed.txt index 48f43e0880da..58652a297bd8 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -91,6 +91,34 @@ package android.os { } +package android.security.keystore.recovery { + + public final class KeyChainSnapshot implements android.os.Parcelable { + method public deprecated byte[] getTrustedHardwarePublicKey(); + } + + public class RecoveryController { + method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException; + method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; + method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException; + method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; + method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException; + } + + public class RecoverySession implements java.lang.AutoCloseable { + method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; + } + + public final class WrappedApplicationKey implements android.os.Parcelable { + method public deprecated byte[] getAccount(); + } + + public static class WrappedApplicationKey.Builder { + method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]); + } + +} + package android.service.notification { public abstract class NotificationListenerService extends android.app.Service { diff --git a/api/test-current.txt b/api/test-current.txt index 049211dedce7..d5b43115c125 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -167,6 +167,17 @@ package android.app.admin { } +package android.app.backup { + + public class BackupManager { + method public android.content.Intent getConfigurationIntent(java.lang.String); + method public android.content.Intent getDataManagementIntent(java.lang.String); + method public java.lang.String getDataManagementLabel(java.lang.String); + method public java.lang.String getDestinationString(java.lang.String); + } + +} + package android.app.usage { public class StorageStatsManager { @@ -721,6 +732,10 @@ package android.telephony { field public static final java.lang.String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override"; } + public class ServiceState implements android.os.Parcelable { + method public void setSystemAndNetworkId(int, int); + } + } package android.telephony.mbms { @@ -1097,6 +1112,11 @@ package android.widget { method public android.graphics.Bitmap getContent(); method public static android.graphics.PointF getMagnifierDefaultSize(); method public android.graphics.Rect getWindowPositionOnScreen(); + method public void setOnOperationCompleteCallback(android.widget.Magnifier.Callback); + } + + public static abstract interface Magnifier.Callback { + method public abstract void onOperationComplete(); } public class NumberPicker extends android.widget.LinearLayout { diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk index 244fbce132ac..d7ce352d4b78 100644 --- a/cmds/statsd/Android.mk +++ b/cmds/statsd/Android.mk @@ -36,6 +36,7 @@ statsd_common_src := \ src/external/StatsCompanionServicePuller.cpp \ src/external/SubsystemSleepStatePuller.cpp \ src/external/ResourceHealthManagerPuller.cpp \ + src/external/ResourceThermalManagerPuller.cpp \ src/external/CpuTimePerUidPuller.cpp \ src/external/CpuTimePerUidFreqPuller.cpp \ src/external/KernelUidCpuActiveTimeReader.cpp \ @@ -99,6 +100,7 @@ statsd_common_shared_libraries := \ android.hardware.health@2.0 \ android.hardware.power@1.0 \ android.hardware.power@1.1 \ + android.hardware.thermal@1.0 \ libmemunreachable # ========= @@ -249,7 +251,8 @@ LOCAL_SRC_FILES := $(statsd_common_src) \ benchmark/main.cpp \ benchmark/hello_world_benchmark.cpp \ benchmark/log_event_benchmark.cpp \ - benchmark/stats_write_benchmark.cpp + benchmark/stats_write_benchmark.cpp \ + benchmark/filter_value_benchmark.cpp LOCAL_C_INCLUDES := $(statsd_common_c_includes) diff --git a/cmds/statsd/benchmark/filter_value_benchmark.cpp b/cmds/statsd/benchmark/filter_value_benchmark.cpp new file mode 100644 index 000000000000..b9ddf36d8295 --- /dev/null +++ b/cmds/statsd/benchmark/filter_value_benchmark.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ +#include <vector> +#include "benchmark/benchmark.h" +#include "FieldValue.h" +#include "HashableDimensionKey.h" +#include "logd/LogEvent.h" + +namespace android { +namespace os { +namespace statsd { + +using std::vector; + +static void BM_FilterValue(benchmark::State& state) { + LogEvent event(1, 100000); + event.write(3.2f); + event.write("LOCATION"); + event.write((int64_t)990); + event.init(); + + FieldMatcher field_matcher; + field_matcher.set_field(1); + field_matcher.add_child()->set_field(2); + field_matcher.add_child()->set_field(3); + + std::vector<Matcher> matchers; + translateFieldMatcher(field_matcher, &matchers); + + while (state.KeepRunning()) { + vector<HashableDimensionKey> output; + filterValues(matchers, event.getValues(), &output); + } +} + +BENCHMARK(BM_FilterValue); + +} // namespace statsd +} // namespace os +} // namespace android diff --git a/cmds/statsd/src/FieldValue.cpp b/cmds/statsd/src/FieldValue.cpp index 6894bcf53e79..b541612f73df 100644 --- a/cmds/statsd/src/FieldValue.cpp +++ b/cmds/statsd/src/FieldValue.cpp @@ -135,6 +135,8 @@ Value::Value(const Value& from) { case STRING: str_value = from.str_value; break; + default: + break; } } @@ -148,6 +150,8 @@ std::string Value::toString() const { return std::to_string(float_value) + "[F]"; case STRING: return str_value + "[S]"; + default: + return "[UNKNOWN]"; } } @@ -163,6 +167,8 @@ bool Value::operator==(const Value& that) const { return float_value == that.float_value; case STRING: return str_value == that.str_value; + default: + return false; } } @@ -177,6 +183,8 @@ bool Value::operator!=(const Value& that) const { return float_value != that.float_value; case STRING: return str_value != that.str_value; + default: + return false; } } diff --git a/cmds/statsd/src/FieldValue.h b/cmds/statsd/src/FieldValue.h index d17dded8d691..21f30e288c25 100644 --- a/cmds/statsd/src/FieldValue.h +++ b/cmds/statsd/src/FieldValue.h @@ -31,7 +31,7 @@ const int32_t kMaxLogDepth = 2; const int32_t kLastBitMask = 0x80; const int32_t kClearLastBitDeco = 0x7f; -enum Type { INT, LONG, FLOAT, STRING }; +enum Type { UNKNOWN, INT, LONG, FLOAT, STRING }; int32_t getEncodedField(int32_t pos[], int32_t depth, bool includeDepth); @@ -82,6 +82,8 @@ private: int32_t mField; public: + Field() {} + Field(int32_t tag, int32_t pos[], int32_t depth) : mTag(tag) { mField = getEncodedField(pos, depth, true); } @@ -229,6 +231,8 @@ struct Matcher { * */ struct Value { + Value() : type(UNKNOWN) {} + Value(int32_t v) { int_value = v; type = INT; @@ -280,15 +284,13 @@ struct Value { bool operator!=(const Value& that) const; bool operator<(const Value& that) const; - -private: - Value(){}; }; /** * Represents a log item, or a dimension item (They are essentially the same). */ struct FieldValue { + FieldValue() {} FieldValue(const Field& field, const Value& value) : mField(field), mValue(value) { } bool operator==(const FieldValue& that) const { diff --git a/cmds/statsd/src/HashableDimensionKey.cpp b/cmds/statsd/src/HashableDimensionKey.cpp index 3c69f9ed683f..1502a00abee9 100644 --- a/cmds/statsd/src/HashableDimensionKey.cpp +++ b/cmds/statsd/src/HashableDimensionKey.cpp @@ -16,6 +16,8 @@ #define DEBUG false // STOPSHIP if true #include "Log.h" +#include <mutex> + #include "HashableDimensionKey.h" #include "FieldValue.h" @@ -46,10 +48,12 @@ android::hash_t hashDimension(const HashableDimensionKey& value) { fieldValue.mValue.str_value))); break; case FLOAT: { - float floatVal = fieldValue.mValue.float_value; - hash = android::JenkinsHashMixBytes(hash, (uint8_t*)&floatVal, sizeof(float)); + hash = android::JenkinsHashMix(hash, + android::hash_type(fieldValue.mValue.float_value)); break; } + default: + break; } } return JenkinsHashWhiten(hash); @@ -64,26 +68,32 @@ bool filterValues(const vector<Matcher>& matcherFields, const vector<FieldValue> int prevAnyMatcherPrefix = 0; size_t prevPrevFanout = 0; size_t prevFanout = 0; + // For each matcher get matched results. + vector<FieldValue> matchedResults(2); for (const auto& matcher : matcherFields) { - vector<FieldValue> matchedResults; + size_t num_matches = 0; for (const auto& value : values) { // TODO: potential optimization here to break early because all fields are naturally // sorted. if (value.mField.matches(matcher)) { - matchedResults.push_back(FieldValue( - Field(value.mField.getTag(), (value.mField.getField() & matcher.mMask)), - value.mValue)); + if (num_matches >= matchedResults.size()) { + matchedResults.resize(num_matches * 2); + } + matchedResults[num_matches].mField.setTag(value.mField.getTag()); + matchedResults[num_matches].mField.setField(value.mField.getField() & matcher.mMask); + matchedResults[num_matches].mValue = value.mValue; + num_matches++; } } - if (matchedResults.size() == 0) { + if (num_matches == 0) { VLOG("We can't find a dimension value for matcher (%d)%#x.", matcher.mMatcher.getTag(), matcher.mMatcher.getField()); continue; } - if (matchedResults.size() == 1) { + if (num_matches == 1) { for (auto& dimension : *output) { dimension.addValue(matchedResults[0]); } @@ -119,23 +129,23 @@ bool filterValues(const vector<Matcher>& matcherFields, const vector<FieldValue> // First create fanout (fanout size is matchedResults.Size which could be one, // which means we do nothing here) oldSize = output->size(); - for (size_t i = 1; i < matchedResults.size(); i++) { + for (size_t i = 1; i < num_matches; i++) { output->insert(output->end(), output->begin(), output->begin() + oldSize); } prevPrevFanout = oldSize; - prevFanout = matchedResults.size(); + prevFanout = num_matches; } else { // If we should not create fanout, e.g., uid tag from same position should be remain // together. oldSize = prevPrevFanout; - if (prevFanout != matchedResults.size()) { + if (prevFanout != num_matches) { // sanity check. ALOGE("2 Any matcher result in different output"); return false; } } // now add the matched field value to output - for (size_t i = 0; i < matchedResults.size(); i++) { + for (size_t i = 0; i < num_matches; i++) { for (int j = 0; j < oldSize; j++) { (*output)[i * oldSize + j].addValue(matchedResults[i]); } diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 87dec5d1656d..3c9dd68c1cc2 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -316,7 +316,7 @@ void StatsLogProcessor::flushIfNecessaryLocked( StatsdStats::kMaxMetricsBytesPerConfig) { // Too late. We need to start clearing data. // TODO(b/70571383): By 12/15/2017 add API to drop data directly ProtoOutputStream proto; - metricsManager.onDumpReport(time(nullptr) * NS_PER_SEC, &proto); + metricsManager.onDumpReport(timestampNs, &proto); StatsdStats::getInstance().noteDataDropped(key); VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str()); } else if (totalBytes > .9 * StatsdStats::kMaxMetricsBytesPerConfig) { @@ -340,7 +340,7 @@ void StatsLogProcessor::WriteDataToDisk() { for (auto& pair : mMetricsManagers) { const ConfigKey& key = pair.first; vector<uint8_t> data; - onDumpReportLocked(key, time(nullptr) * NS_PER_SEC, &data); + onDumpReportLocked(key, getElapsedRealtimeNs(), &data); // TODO: Add a guardrail to prevent accumulation of file on disk. string file_name = StringPrintf("%s/%ld_%d_%lld", STATS_DATA_DIR, (long)getWallClockSec(), key.GetUid(), (long long)key.GetId()); diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 26db3af7d41a..c27b130678cd 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -493,7 +493,7 @@ status_t StatsService::cmd_dump_report(FILE* out, FILE* err, const Vector<String } if (good) { vector<uint8_t> data; - mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), time(nullptr) * NS_PER_SEC, + mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), getElapsedRealtimeNs(), &data); // TODO: print the returned StatsLogReport to file instead of printing to logcat. if (proto) { @@ -786,7 +786,7 @@ Status StatsService::getData(int64_t key, vector<uint8_t>* output) { VLOG("StatsService::getData with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid()); if (checkCallingPermission(String16(kPermissionDump))) { ConfigKey configKey(ipc->getCallingUid(), key); - mProcessor->onDumpReport(configKey, time(nullptr) * NS_PER_SEC, output); + mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(), output); return Status::ok(); } else { return Status::fromExceptionCode(binder::Status::EX_SECURITY); diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp index babe0fc36fb5..c40eb812f949 100644 --- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp +++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp @@ -233,11 +233,19 @@ bool AnomalyTracker::isInRefractoryPeriod(const uint64_t& timestampNs, void AnomalyTracker::informSubscribers(const MetricDimensionKey& key) { VLOG("informSubscribers called."); if (mSubscriptions.empty()) { - ALOGE("Attempt to call with no subscribers."); + // The config just wanted to log the anomaly. That's fine. + VLOG("No Subscriptions were associated with the alert."); return; } for (const Subscription& subscription : mSubscriptions) { + if (subscription.probability_of_informing() < 1 + && ((float)rand() / RAND_MAX) >= subscription.probability_of_informing()) { + // Note that due to float imprecision, 0.0 and 1.0 might not truly mean never/always. + // The config writer was advised to use -0.1 and 1.1 for never/always. + ALOGI("Fate decided that a subscriber would not be informed."); + continue; + } switch (subscription.subscriber_information_case()) { case Subscription::SubscriberInformationCase::kIncidentdDetails: if (!GenerateIncidentReport(subscription.incidentd_details(), mAlert, mConfigKey)) { diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 2b02025f0a73..7159b9b24a6a 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -72,7 +72,7 @@ message Atom { BatteryLevelChanged battery_level_changed = 30; ChargingStateChanged charging_state_changed = 31; PluggedStateChanged plugged_state_changed = 32; - DeviceTemperatureReported device_temperature_reported = 33; + // TODO: 33 is blank, but is available for use. DeviceOnStatusChanged device_on_status_changed = 34; WakeupAlarmOccurred wakeup_alarm_occurred = 35; KernelWakeupReported kernel_wakeup_reported = 36; @@ -105,7 +105,7 @@ message Atom { } // Pulled events will start at field 10000. - // Next: 10021 + // Next: 10022 oneof pulled { WifiBytesTransfer wifi_bytes_transfer = 10000; WifiBytesTransferByFgBg wifi_bytes_transfer_by_fg_bg = 10001; @@ -128,6 +128,7 @@ message Atom { DiskSpace disk_space = 10018; RemainingBatteryCapacity remaining_battery_capacity = 10019; FullBatteryCapacity full_battery_capacity = 10020; + Temperature temperature = 10021; } } @@ -536,17 +537,6 @@ message PluggedStateChanged { optional android.os.BatteryPluggedStateEnum state = 1; } -/** - * Logs the temperature of the device, in tenths of a degree Celsius. - * - * Logged from: - * frameworks/base/core/java/com/android/internal/os/BatteryStatsImpl.java - */ -message DeviceTemperatureReported { - // Temperature in tenths of a degree C. - optional int32 temperature = 1; -} - // TODO: Define this more precisely. // TODO: Log the ON state somewhere. It isn't currently logged anywhere. /** @@ -940,6 +930,11 @@ message AppStartChanged { // Empty if not set. optional string launch_token = 13; + // The compiler filter used when when the package was optimized. + optional string package_optimization_compilation_filter = 14; + + // The reason why the package was optimized. + optional string package_optimization_compilation_reason = 15; } message AppStartCancelChanged { @@ -1503,7 +1498,8 @@ message DiskSpace { /** * Pulls battery coulomb counter, which is the remaining battery charge in uAh. - * Logged from: frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp + * Pulled from: + * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp */ message RemainingBatteryCapacity { optional int32 charge_uAh = 1; @@ -1511,8 +1507,26 @@ message RemainingBatteryCapacity { /** * Pulls battery capacity, which is the battery capacity when full in uAh. - * Logged from: frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp + * Pulled from: + * frameworks/base/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp */ message FullBatteryCapacity { optional int32 capacity_uAh = 1; +} + +/** + * Pulls the temperature of various parts of the device, in Celsius. + * + * Pulled from: + * frameworks/base/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp + */ +message Temperature { + // The type of temperature being reported. Eg. CPU, GPU, SKIN, BATTERY. + optional android.os.TemperatureTypeEnum sensor_location = 1; + + // The name of the temperature source. Eg. CPU0 + optional string sensor_name = 2; + + // Temperature in degrees C. + optional float temperature_C = 3; }
\ No newline at end of file diff --git a/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp b/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp index 261cb4332dd6..3741202763b3 100644 --- a/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp +++ b/cmds/statsd/src/external/ResourceHealthManagerPuller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -14,7 +14,7 @@ * limitations under the License. */ -#define DEBUG true // STOPSHIP if true +#define DEBUG false // STOPSHIP if true #include "Log.h" #include <android/hardware/health/2.0/IHealth.h> @@ -47,7 +47,6 @@ sp<android::hardware::health::V2_0::IHealth> gHealthHal = nullptr; bool getHealthHal() { if (gHealthHal == nullptr) { gHealthHal = get_health_service(); - } return gHealthHal != nullptr; } diff --git a/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp new file mode 100644 index 000000000000..b3acdfcfce33 --- /dev/null +++ b/cmds/statsd/src/external/ResourceThermalManagerPuller.cpp @@ -0,0 +1,144 @@ +/* + * 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. + */ + +#define DEBUG false // STOPSHIP if true +#include "Log.h" + +#include <android/hardware/thermal/1.0/IThermal.h> +#include "external/ResourceThermalManagerPuller.h" +#include "external/StatsPuller.h" + +#include "ResourceThermalManagerPuller.h" +#include "logd/LogEvent.h" +#include "statslog.h" +#include "stats_log_util.h" + +#include <chrono> + +using android::hardware::hidl_death_recipient; +using android::hardware::hidl_vec; +using android::hidl::base::V1_0::IBase; +using android::hardware::thermal::V1_0::IThermal; +using android::hardware::thermal::V1_0::Temperature; +using android::hardware::thermal::V1_0::ThermalStatus; +using android::hardware::thermal::V1_0::ThermalStatusCode; +using android::hardware::Return; +using android::hardware::Void; + +using std::chrono::duration_cast; +using std::chrono::nanoseconds; +using std::chrono::system_clock; +using std::make_shared; +using std::shared_ptr; + +namespace android { +namespace os { +namespace statsd { + +bool getThermalHalLocked(); +sp<android::hardware::thermal::V1_0::IThermal> gThermalHal = nullptr; +std::mutex gThermalHalMutex; + +struct ThermalHalDeathRecipient : virtual public hidl_death_recipient { + virtual void serviceDied(uint64_t cookie, const wp<IBase>& who) override { + std::lock_guard<std::mutex> lock(gThermalHalMutex); + ALOGE("ThermalHAL just died"); + gThermalHal = nullptr; + getThermalHalLocked(); + } +}; + +sp<ThermalHalDeathRecipient> gThermalHalDeathRecipient = nullptr; + +// The caller must be holding gThermalHalMutex. +bool getThermalHalLocked() { + if (gThermalHal == nullptr) { + gThermalHal = IThermal::getService(); + if (gThermalHal == nullptr) { + ALOGE("Unable to get Thermal service."); + } else { + if (gThermalHalDeathRecipient == nullptr) { + gThermalHalDeathRecipient = new ThermalHalDeathRecipient(); + } + hardware::Return<bool> linked = gThermalHal->linkToDeath( + gThermalHalDeathRecipient, 0x451F /* cookie */); + if (!linked.isOk()) { + ALOGE("Transaction error in linking to ThermalHAL death: %s", + linked.description().c_str()); + gThermalHal = nullptr; + } else if (!linked) { + ALOGW("Unable to link to ThermalHal death notifications"); + gThermalHal = nullptr; + } else { + ALOGD("Link to death notification successful"); + } + } + } + return gThermalHal != nullptr; +} + +ResourceThermalManagerPuller::ResourceThermalManagerPuller() : + StatsPuller(android::util::TEMPERATURE) { +} + +bool ResourceThermalManagerPuller::PullInternal(vector<shared_ptr<LogEvent>>* data) { + std::lock_guard<std::mutex> lock(gThermalHalMutex); + if (!getThermalHalLocked()) { + ALOGE("Thermal Hal not loaded"); + return false; + } + + int64_t wallClockTimestampNs = getWallClockNs(); + int64_t elapsedTimestampNs = getElapsedRealtimeNs(); + + data->clear(); + bool resultSuccess = true; + + Return<void> ret = gThermalHal->getTemperatures( + [&](ThermalStatus status, const hidl_vec<Temperature>& temps) { + if (status.code != ThermalStatusCode::SUCCESS) { + ALOGE("Failed to get temperatures from ThermalHAL. Status: %d", status.code); + resultSuccess = false; + return; + } + if (mTagId == android::util::TEMPERATURE) { + for (size_t i = 0; i < temps.size(); ++i) { + auto ptr = make_shared<LogEvent>(android::util::TEMPERATURE, + wallClockTimestampNs, elapsedTimestampNs); + ptr->write((static_cast<int>(temps[i].type))); + ptr->write(temps[i].name); + ptr->write(temps[i].currentValue); + ptr->init(); + data->push_back(ptr); + } + } else { + ALOGE("Unsupported tag in ResourceThermalManagerPuller: %d", mTagId); + } + }); + if (!ret.isOk()) { + ALOGE("getThermalHalLocked() failed: thermal HAL service not available. Description: %s", + ret.description().c_str()); + if (ret.isDeadObject()) { + gThermalHal = nullptr; + } + return false; + } + return resultSuccess; +} + +} // namespace statsd +} // namespace os +} // namespace android diff --git a/cmds/statsd/src/external/ResourceThermalManagerPuller.h b/cmds/statsd/src/external/ResourceThermalManagerPuller.h new file mode 100644 index 000000000000..13c675aad680 --- /dev/null +++ b/cmds/statsd/src/external/ResourceThermalManagerPuller.h @@ -0,0 +1,37 @@ +/* + * 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. + */ + +#pragma once + +#include <utils/String16.h> +#include "StatsPuller.h" + +namespace android { +namespace os { +namespace statsd { + +/** + * Reads IThermal.hal + */ +class ResourceThermalManagerPuller : public StatsPuller { +public: + ResourceThermalManagerPuller(); + bool PullInternal(vector<std::shared_ptr<LogEvent>>* data) override; +}; + +} // namespace statsd +} // namespace os +} // namespace android
\ No newline at end of file diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp index bee99396126d..880dfd1cd6c7 100644 --- a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp +++ b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp @@ -23,10 +23,10 @@ #include <climits> #include "CpuTimePerUidFreqPuller.h" #include "CpuTimePerUidPuller.h" -#include "ResourceHealthManagerPuller.h" #include "KernelUidCpuActiveTimeReader.h" #include "KernelUidCpuClusterTimeReader.h" -#include "SubsystemSleepStatePuller.h" +#include "ResourceHealthManagerPuller.h" +#include "ResourceThermalManagerPuller.h" #include "StatsCompanionServicePuller.h" #include "StatsPullerManagerImpl.h" #include "StatsService.h" @@ -118,7 +118,9 @@ const std::map<int, PullAtomInfo> StatsPullerManagerImpl::kAllPullAtomInfo = { {{}, {}, 1, new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}}, // process_memory_state {android::util::PROCESS_MEMORY_STATE, - {{4,5,6,7,8}, {2,3}, 0, new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}}}; + {{4,5,6,7,8}, {2,3}, 0, new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}}, + // temperature + {android::util::TEMPERATURE, {{}, {}, 1, new ResourceThermalManagerPuller()}}}; StatsPullerManagerImpl::StatsPullerManagerImpl() : mCurrentPullingInterval(LONG_MAX) { diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 2c7b9190f9d0..78ebe3380b8e 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -183,6 +183,8 @@ void writeFieldValueTreeToStreamHelper(const std::vector<FieldValue>& dims, size case STRING: protoOutput->write(FIELD_TYPE_STRING | fieldNum, dim.mValue.str_value); break; + default: + break; } (*index)++; } else if (valueDepth > depth && valuePrefix == prefix) { diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto index 875027564546..a31385470c9f 100644 --- a/cmds/statsd/src/statsd_config.proto +++ b/cmds/statsd/src/statsd_config.proto @@ -307,6 +307,8 @@ message Subscription { PerfettoDetails perfetto_details = 5; BroadcastSubscriberDetails broadcast_subscriber_details = 6; } + + optional float probability_of_informing = 7 [default = 1.1]; } message StatsdConfig { diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index dac03cdabc3d..752b662e050d 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -1691,10 +1691,12 @@ Landroid/view/accessibility/IAccessibilityManager$Stub;->asInterface(Landroid/os Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V Landroid/view/ActionMode;->isUiFocusable()Z Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener; +Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V Landroid/view/Choreographer;->doFrame(JI)V Landroid/view/Choreographer;->getFrameTime()J Landroid/view/Choreographer;->mCallbackQueues:[Landroid/view/Choreographer$CallbackQueue; Landroid/view/Choreographer;->mLastFrameTimeNanos:J +Landroid/view/Choreographer;->mLock:Ljava/lang/Object; Landroid/view/Choreographer;->postCallback(ILjava/lang/Runnable;Ljava/lang/Object;)V Landroid/view/Choreographer;->removeCallbacks(ILjava/lang/Runnable;Ljava/lang/Object;)V Landroid/view/Choreographer;->scheduleVsyncLocked()V diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 83fe4dd0038a..3d04e2c64bee 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -751,6 +751,14 @@ public class Activity extends ContextThemeWrapper private static final String KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME = "com.android.systemui"; + private static final int LOG_AM_ON_CREATE_CALLED = 30057; + private static final int LOG_AM_ON_START_CALLED = 30059; + private static final int LOG_AM_ON_RESUME_CALLED = 30022; + private static final int LOG_AM_ON_PAUSE_CALLED = 30021; + private static final int LOG_AM_ON_STOP_CALLED = 30049; + private static final int LOG_AM_ON_RESTART_CALLED = 30058; + private static final int LOG_AM_ON_DESTROY_CALLED = 30060; + private static class ManagedDialog { Dialog mDialog; Bundle mArgs; @@ -1392,6 +1400,7 @@ public class Activity extends ContextThemeWrapper * * {@hide} */ + @Override public int getNextAutofillId() { if (mLastAutofillId == Integer.MAX_VALUE - 1) { mLastAutofillId = View.LAST_APP_AUTOFILL_ID; @@ -1403,6 +1412,14 @@ public class Activity extends ContextThemeWrapper } /** + * @hide + */ + @Override + public AutofillId autofillClientGetNextAutofillId() { + return new AutofillId(getNextAutofillId()); + } + + /** * Check whether this activity is running as part of a voice interaction with the user. * If true, it should perform its interaction with the user through the * {@link VoiceInteractor} returned by {@link #getVoiceInteractor}. @@ -4144,9 +4161,10 @@ public class Activity extends ContextThemeWrapper * <p>You can override this function to force global search, e.g. in response to a dedicated * search key, or to block search entirely (by simply returning false). * - * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_TELEVISION}, the default - * implementation changes to simply return false and you must supply your own custom - * implementation if you want to support search.</p> + * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_TELEVISION} or + * {@link Configuration#UI_MODE_TYPE_WATCH}, the default implementation changes to simply + * return false and you must supply your own custom implementation if you want to support + * search. * * @param searchEvent The {@link SearchEvent} that signaled this search. * @return Returns {@code true} if search launched, and {@code false} if the activity does @@ -4166,8 +4184,10 @@ public class Activity extends ContextThemeWrapper * @see #onSearchRequested(SearchEvent) */ public boolean onSearchRequested() { - if ((getResources().getConfiguration().uiMode&Configuration.UI_MODE_TYPE_MASK) - != Configuration.UI_MODE_TYPE_TELEVISION) { + final int uiMode = getResources().getConfiguration().uiMode + & Configuration.UI_MODE_TYPE_MASK; + if (uiMode != Configuration.UI_MODE_TYPE_TELEVISION + && uiMode != Configuration.UI_MODE_TYPE_WATCH) { startSearch(null, false, null, false); return true; } else { @@ -4196,6 +4216,9 @@ public class Activity extends ContextThemeWrapper * is to inject specific data such as context data, it is preferred to <i>override</i> * onSearchRequested(), so that any callers to it will benefit from the override. * + * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_WATCH}, use of this API is + * not supported. + * * @param initialQuery Any non-null non-empty string will be inserted as * pre-entered text in the search query box. * @param selectInitialQuery If true, the initial query will be preselected, which means that @@ -5553,13 +5576,7 @@ public class Activity extends ContextThemeWrapper if (mParent != null) { throw new IllegalStateException("Can only be called on top-level activity"); } - if (Looper.myLooper() != mMainThread.getLooper()) { - throw new IllegalStateException("Must be called from main thread"); - } - try { - ActivityManager.getService().requestActivityRelaunch(mToken); - } catch (RemoteException e) { - } + mMainThread.handleRelaunchActivityLocally(mToken); } /** @@ -7103,6 +7120,7 @@ public class Activity extends ContextThemeWrapper } else { onCreate(icicle); } + writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate"); mActivityTransitionState.readState(icicle); mVisibleFromClient = !mWindow.getWindowStyle().getBoolean( @@ -7116,12 +7134,14 @@ public class Activity extends ContextThemeWrapper onNewIntent(intent); } - final void performStart() { + final void performStart(String reason) { mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions()); mFragments.noteStateNotSaved(); mCalled = false; mFragments.execPendingActions(); mInstrumentation.callActivityOnStart(this); + writeEventLog(LOG_AM_ON_START_CALLED, reason); + if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + @@ -7190,7 +7210,7 @@ public class Activity extends ContextThemeWrapper * The option to not start immediately is needed in case a transaction with * multiple lifecycle transitions is in progress. */ - final void performRestart(boolean start) { + final void performRestart(boolean start, String reason) { mCanEnterPictureInPicture = true; mFragments.noteStateNotSaved(); @@ -7223,19 +7243,20 @@ public class Activity extends ContextThemeWrapper mCalled = false; mInstrumentation.callActivityOnRestart(this); + writeEventLog(LOG_AM_ON_RESTART_CALLED, reason); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + " did not call through to super.onRestart()"); } if (start) { - performStart(); + performStart(reason); } } } - final void performResume(boolean followedByPause) { - performRestart(true /* start */); + final void performResume(boolean followedByPause, String reason) { + performRestart(true /* start */, reason); mFragments.execPendingActions(); @@ -7254,6 +7275,7 @@ public class Activity extends ContextThemeWrapper mCalled = false; // mResumed is set by the instrumentation mInstrumentation.callActivityOnResume(this); + writeEventLog(LOG_AM_ON_RESUME_CALLED, reason); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + @@ -7290,6 +7312,7 @@ public class Activity extends ContextThemeWrapper mFragments.dispatchPause(); mCalled = false; onPause(); + writeEventLog(LOG_AM_ON_PAUSE_CALLED, "performPause"); mResumed = false; if (!mCalled && getApplicationInfo().targetSdkVersion >= android.os.Build.VERSION_CODES.GINGERBREAD) { @@ -7297,7 +7320,6 @@ public class Activity extends ContextThemeWrapper "Activity " + mComponent.toShortString() + " did not call through to super.onPause()"); } - mResumed = false; } final void performUserLeaving() { @@ -7305,7 +7327,7 @@ public class Activity extends ContextThemeWrapper onUserLeaveHint(); } - final void performStop(boolean preserveWindow) { + final void performStop(boolean preserveWindow, String reason) { mDoReportFullyDrawn = false; mFragments.doLoaderStop(mChangingConfigurations /*retain*/); @@ -7328,6 +7350,7 @@ public class Activity extends ContextThemeWrapper mCalled = false; mInstrumentation.callActivityOnStop(this); + writeEventLog(LOG_AM_ON_STOP_CALLED, reason); if (!mCalled) { throw new SuperNotCalledException( "Activity " + mComponent.toShortString() + @@ -7355,6 +7378,7 @@ public class Activity extends ContextThemeWrapper mWindow.destroy(); mFragments.dispatchDestroy(); onDestroy(); + writeEventLog(LOG_AM_ON_DESTROY_CALLED, "performDestroy"); mFragments.doLoaderDestroy(); if (mVoiceInteractor != null) { mVoiceInteractor.detachActivity(); @@ -7615,6 +7639,19 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override + public final void autofillClientDispatchUnhandledKey(@NonNull View anchor, + @NonNull KeyEvent keyEvent) { + ViewRootImpl rootImpl = anchor.getViewRootImpl(); + if (rootImpl != null) { + // dont care if anchorView is current focus, for example a custom view may only receive + // touchEvent, not focusable but can still trigger autofill window. The Key handling + // might be inside parent of the custom view. + rootImpl.dispatchKeyFromAutofill(keyEvent); + } + } + + /** @hide */ + @Override public final boolean autofillClientRequestHideFillUi() { if (mAutofillPopupWindow == null) { return false; @@ -7730,7 +7767,7 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override - public final boolean autofillIsCompatibilityModeEnabled() { + public final boolean autofillClientIsCompatibilityModeEnabled() { return isAutofillCompatibilityEnabled(); } @@ -7829,6 +7866,12 @@ public class Activity extends ContextThemeWrapper } } + /** Log a lifecycle event for current user id and component class. */ + private void writeEventLog(int event, String reason) { + EventLog.writeEvent(event, UserHandle.myUserId(), getComponentName().getClassName(), + reason); + } + class HostCallbacks extends FragmentHostCallback<Activity> { public HostCallbacks() { super(Activity.this /*activity*/); diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java index d5430f05d65b..09dcbf213459 100644 --- a/core/java/android/app/ActivityOptions.java +++ b/core/java/android/app/ActivityOptions.java @@ -164,7 +164,7 @@ public class ActivityOptions { /** * Whether the activity should be launched into LockTask mode. - * @see #setLockTaskMode(boolean) + * @see #setLockTaskEnabled(boolean) */ private static final String KEY_LOCK_TASK_MODE = "android:activity.lockTaskMode"; @@ -1148,7 +1148,7 @@ public class ActivityOptions { * @see Activity#startLockTask() * @see android.app.admin.DevicePolicyManager#setLockTaskPackages(ComponentName, String[]) */ - public ActivityOptions setLockTaskMode(boolean lockTaskMode) { + public ActivityOptions setLockTaskEnabled(boolean lockTaskMode) { mLockTaskMode = lockTaskMode; return this; } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index a69b0ee70f4d..21d146a5500a 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -208,9 +208,6 @@ public final class ActivityThread extends ClientTransactionHandler { public static final boolean DEBUG_ORDER = false; private static final long MIN_TIME_BETWEEN_GCS = 5*1000; private static final int SQLITE_MEM_RELEASED_EVENT_LOG_TAG = 75003; - private static final int LOG_AM_ON_PAUSE_CALLED = 30021; - private static final int LOG_AM_ON_RESUME_CALLED = 30022; - private static final int LOG_AM_ON_STOP_CALLED = 30049; /** Type for IActivityManager.serviceDoneExecuting: anonymous operation */ public static final int SERVICE_DONE_EXECUTING_ANON = 0; @@ -2924,7 +2921,7 @@ public final class ActivityThread extends ClientTransactionHandler { } // Start - activity.performStart(); + activity.performStart("handleStartActivity"); r.setState(ON_START); if (pendingActions == null) { @@ -3113,7 +3110,7 @@ public final class ActivityThread extends ClientTransactionHandler { checkAndBlockForNetworkAccess(); deliverNewIntents(r, intents); if (resumed) { - r.activity.performResume(false); + r.activity.performResume(false, "performNewIntents"); r.activity.mTemporaryPause = false; } @@ -3735,10 +3732,7 @@ public final class ActivityThread extends ClientTransactionHandler { deliverResults(r, r.pendingResults); r.pendingResults = null; } - r.activity.performResume(r.startsNotResumed); - - EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, UserHandle.myUserId(), - r.activity.getComponentName().getClassName(), reason); + r.activity.performResume(r.startsNotResumed, reason); r.state = null; r.persistentState = null; @@ -3906,7 +3900,8 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, - int configChanges, boolean dontReport, PendingTransactionActions pendingActions) { + int configChanges, boolean dontReport, PendingTransactionActions pendingActions, + String reason) { ActivityClientRecord r = mActivities.get(token); if (r != null) { if (userLeaving) { @@ -3914,7 +3909,7 @@ public final class ActivityThread extends ClientTransactionHandler { } r.activity.mConfigChangeFlags |= configChanges; - performPauseActivity(r, finished, "handlePauseActivity", pendingActions); + performPauseActivity(r, finished, reason, pendingActions); // Make sure any pending writes are now committed. if (r.isPreHoneycomb()) { @@ -4007,8 +4002,6 @@ public final class ActivityThread extends ClientTransactionHandler { try { r.activity.mCalled = false; mInstrumentation.callActivityOnPause(r.activity); - EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(), - r.activity.getComponentName().getClassName(), reason); if (!r.activity.mCalled) { throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent) + " did not call through to super.onPause()"); @@ -4119,7 +4112,7 @@ public final class ActivityThread extends ClientTransactionHandler { } try { - r.activity.performStop(false /*preserveWindow*/); + r.activity.performStop(false /*preserveWindow*/, reason); } catch (SuperNotCalledException e) { throw e; } catch (Exception e) { @@ -4131,8 +4124,6 @@ public final class ActivityThread extends ClientTransactionHandler { } } r.setState(ON_STOP); - EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(), - r.activity.getComponentName().getClassName(), reason); if (shouldSaveState && !isPreP) { callActivityOnSaveInstanceState(r); @@ -4169,12 +4160,12 @@ public final class ActivityThread extends ClientTransactionHandler { @Override public void handleStopActivity(IBinder token, boolean show, int configChanges, - PendingTransactionActions pendingActions) { + PendingTransactionActions pendingActions, String reason) { final ActivityClientRecord r = mActivities.get(token); r.activity.mConfigChangeFlags |= configChanges; final StopInfo stopInfo = new StopInfo(); - performStopActivityInner(r, stopInfo, show, true, "handleStopActivity"); + performStopActivityInner(r, stopInfo, show, true, reason); if (localLOGV) Slog.v( TAG, "Finishing stop of " + r + ": show=" + show @@ -4209,7 +4200,7 @@ public final class ActivityThread extends ClientTransactionHandler { public void performRestartActivity(IBinder token, boolean start) { ActivityClientRecord r = mActivities.get(token); if (r.stopped) { - r.activity.performRestart(start); + r.activity.performRestart(start, "performRestartActivity"); if (start) { r.setState(ON_START); } @@ -4232,7 +4223,7 @@ public final class ActivityThread extends ClientTransactionHandler { // we are back active so skip it. unscheduleGcIdler(); - r.activity.performRestart(true /* start */); + r.activity.performRestart(true /* start */, "handleWindowVisibility"); r.setState(ON_START); } if (r.activity.mDecor != null) { @@ -4272,7 +4263,7 @@ public final class ActivityThread extends ClientTransactionHandler { } } else { if (r.stopped && r.activity.mVisibleFromServer) { - r.activity.performRestart(true /* start */); + r.activity.performRestart(true /* start */, "handleSleeping"); r.setState(ON_START); } } @@ -4292,19 +4283,15 @@ public final class ActivityThread extends ClientTransactionHandler { View.mDebugViewAttributes = debugViewAttributes; // request all activities to relaunch for the changes to take place - requestRelaunchAllActivities(); + relaunchAllActivities(); } } - private void requestRelaunchAllActivities() { + private void relaunchAllActivities() { for (Map.Entry<IBinder, ActivityClientRecord> entry : mActivities.entrySet()) { final Activity activity = entry.getValue().activity; if (!activity.mFinished) { - try { - ActivityManager.getService().requestActivityRelaunch(entry.getKey()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + handleRelaunchActivityLocally(entry.getKey()); } } } @@ -4384,7 +4371,7 @@ public final class ActivityThread extends ClientTransactionHandler { checkAndBlockForNetworkAccess(); deliverResults(r, results); if (resumed) { - r.activity.performResume(false); + r.activity.performResume(false, "handleSendResult"); r.activity.mTemporaryPause = false; } } @@ -4679,42 +4666,81 @@ public final class ActivityThread extends ClientTransactionHandler { throw e.rethrowFromSystemServer(); } + handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents, + pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity"); + + if (pendingActions != null) { + // Only report a successful relaunch to WindowManager. + pendingActions.setReportRelaunchToWindowManager(true); + } + } + + /** Performs the activity relaunch locally vs. requesting from system-server. */ + void handleRelaunchActivityLocally(IBinder token) { + if (Looper.myLooper() != getLooper()) { + throw new IllegalStateException("Must be called from main thread"); + } + + final ActivityClientRecord r = mActivities.get(token); + if (r == null) { + return; + } + + final int prevState = r.getLifecycleState(); + + if (prevState < ON_RESUME) { + Log.w(TAG, "Activity needs to be already resumed in other to be relaunched."); + return; + } + + // TODO(b/73747058): Investigate converting this to use transaction to relaunch. + handleRelaunchActivityInner(r, 0 /* configChanges */, null /* pendingResults */, + null /* pendingIntents */, null /* pendingActions */, prevState != ON_RESUME, + r.overrideConfig, "handleRelaunchActivityLocally"); + + // Restore back to the previous state before relaunch if needed. + if (prevState != r.getLifecycleState()) { + mTransactionExecutor.cycleToPath(r, prevState); + } + } + + private void handleRelaunchActivityInner(ActivityClientRecord r, int configChanges, + List<ResultInfo> pendingResults, List<ReferrerIntent> pendingIntents, + PendingTransactionActions pendingActions, boolean startsNotResumed, + Configuration overrideConfig, String reason) { // Need to ensure state is saved. if (!r.paused) { - performPauseActivity(r, false, "handleRelaunchActivity", - null /* pendingActions */); + performPauseActivity(r, false, reason, null /* pendingActions */); } if (!r.stopped) { - callActivityOnStop(r, true /* saveState */, "handleRelaunchActivity"); + callActivityOnStop(r, true /* saveState */, reason); } - handleDestroyActivity(r.token, false, configChanges, true, "handleRelaunchActivity"); + handleDestroyActivity(r.token, false, configChanges, true, reason); r.activity = null; r.window = null; r.hideForNow = false; r.nextIdle = null; // Merge any pending results and pending intents; don't just replace them - if (tmp.pendingResults != null) { + if (pendingResults != null) { if (r.pendingResults == null) { - r.pendingResults = tmp.pendingResults; + r.pendingResults = pendingResults; } else { - r.pendingResults.addAll(tmp.pendingResults); + r.pendingResults.addAll(pendingResults); } } - if (tmp.pendingIntents != null) { + if (pendingIntents != null) { if (r.pendingIntents == null) { - r.pendingIntents = tmp.pendingIntents; + r.pendingIntents = pendingIntents; } else { - r.pendingIntents.addAll(tmp.pendingIntents); + r.pendingIntents.addAll(pendingIntents); } } - r.startsNotResumed = tmp.startsNotResumed; - r.overrideConfig = tmp.overrideConfig; + r.startsNotResumed = startsNotResumed; + r.overrideConfig = overrideConfig; handleLaunchActivity(r, pendingActions); - // Only report a successful relaunch to WindowManager. - pendingActions.setReportRelaunchToWindowManager(true); } @Override @@ -5117,7 +5143,7 @@ public final class ActivityThread extends ClientTransactionHandler { newConfig.assetsSeq = (mConfiguration != null ? mConfiguration.assetsSeq : 0) + 1; handleConfigurationChanged(newConfig, null); - requestRelaunchAllActivities(); + relaunchAllActivities(); } static void freeTextLayoutCachesIfNeeded(int configDiff) { diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java index 310965e475b8..cb52a855e7ca 100644 --- a/core/java/android/app/ClientTransactionHandler.java +++ b/core/java/android/app/ClientTransactionHandler.java @@ -65,7 +65,8 @@ public abstract class ClientTransactionHandler { /** Pause the activity. */ public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving, - int configChanges, boolean dontReport, PendingTransactionActions pendingActions); + int configChanges, boolean dontReport, PendingTransactionActions pendingActions, + String reason); /** Resume the activity. */ public abstract void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward, @@ -73,7 +74,7 @@ public abstract class ClientTransactionHandler { /** Stop the activity. */ public abstract void handleStopActivity(IBinder token, boolean show, int configChanges, - PendingTransactionActions pendingActions); + PendingTransactionActions pendingActions, String reason); /** Report that activity was stopped to server. */ public abstract void reportStop(PendingTransactionActions pendingActions); diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index eb260265c15f..4a168fe11c20 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -291,7 +291,10 @@ public class Dialog implements DialogInterface, Window.Callback, if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) { mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR); } - mDecor.setVisibility(View.VISIBLE); + if (mDecor.getVisibility() != View.VISIBLE) { + mDecor.setVisibility(View.VISIBLE); + sendShowMessage(); + } } return; } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 54fd0c45a811..ac301b3cc595 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -630,7 +630,6 @@ interface IActivityManager { void setHasTopUi(boolean hasTopUi); // Start of O transactions - void requestActivityRelaunch(in IBinder token); /** * Updates override configuration applied to specific display. * @param values Update values for display configuration. If null is passed it will request the diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 83617118740d..233e09d90f9b 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1825,6 +1825,7 @@ public class Notification implements Parcelable * @param label the label to display while the action is being prepared to execute * @return this object for method chaining */ + @Deprecated public WearableExtender setInProgressLabel(CharSequence label) { mInProgressLabel = label; return this; @@ -1836,6 +1837,7 @@ public class Notification implements Parcelable * * @return the label to display while the action is being prepared to execute */ + @Deprecated public CharSequence getInProgressLabel() { return mInProgressLabel; } @@ -1847,6 +1849,7 @@ public class Notification implements Parcelable * @param label the label to confirm the action should be executed * @return this object for method chaining */ + @Deprecated public WearableExtender setConfirmLabel(CharSequence label) { mConfirmLabel = label; return this; @@ -1858,6 +1861,7 @@ public class Notification implements Parcelable * * @return the label to confirm the action should be executed */ + @Deprecated public CharSequence getConfirmLabel() { return mConfirmLabel; } @@ -1869,6 +1873,7 @@ public class Notification implements Parcelable * @param label the label to display to cancel the action * @return this object for method chaining */ + @Deprecated public WearableExtender setCancelLabel(CharSequence label) { mCancelLabel = label; return this; @@ -1880,6 +1885,7 @@ public class Notification implements Parcelable * * @return the label to display to cancel the action */ + @Deprecated public CharSequence getCancelLabel() { return mCancelLabel; } @@ -8082,6 +8088,7 @@ public class Notification implements Parcelable /** * Set an icon that goes with the content of this notification. */ + @Deprecated public WearableExtender setContentIcon(int icon) { mContentIcon = icon; return this; @@ -8090,6 +8097,7 @@ public class Notification implements Parcelable /** * Get an icon that goes with the content of this notification. */ + @Deprecated public int getContentIcon() { return mContentIcon; } @@ -8100,6 +8108,7 @@ public class Notification implements Parcelable * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}. * @see #setContentIcon */ + @Deprecated public WearableExtender setContentIconGravity(int contentIconGravity) { mContentIconGravity = contentIconGravity; return this; @@ -8111,6 +8120,7 @@ public class Notification implements Parcelable * {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}. * @see #getContentIcon */ + @Deprecated public int getContentIconGravity() { return mContentIconGravity; } @@ -8158,6 +8168,7 @@ public class Notification implements Parcelable * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}. * The default value is {@link android.view.Gravity#BOTTOM}. */ + @Deprecated public WearableExtender setGravity(int gravity) { mGravity = gravity; return this; @@ -8169,6 +8180,7 @@ public class Notification implements Parcelable * {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}. * The default value is {@link android.view.Gravity#BOTTOM}. */ + @Deprecated public int getGravity() { return mGravity; } @@ -8182,6 +8194,7 @@ public class Notification implements Parcelable * documentation for the preset in question. See also * {@link #setCustomContentHeight} and {@link #getCustomSizePreset}. */ + @Deprecated public WearableExtender setCustomSizePreset(int sizePreset) { mCustomSizePreset = sizePreset; return this; @@ -8195,6 +8208,7 @@ public class Notification implements Parcelable * using {@link #setDisplayIntent}. Check the documentation for the preset in question. * See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}. */ + @Deprecated public int getCustomSizePreset() { return mCustomSizePreset; } @@ -8206,6 +8220,7 @@ public class Notification implements Parcelable * {@link android.app.Notification.WearableExtender#setCustomSizePreset} and * {@link #getCustomContentHeight}. */ + @Deprecated public WearableExtender setCustomContentHeight(int height) { mCustomContentHeight = height; return this; @@ -8217,6 +8232,7 @@ public class Notification implements Parcelable * using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and * {@link #setCustomContentHeight}. */ + @Deprecated public int getCustomContentHeight() { return mCustomContentHeight; } @@ -8267,6 +8283,7 @@ public class Notification implements Parcelable * @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise. * @return this object for method chaining */ + @Deprecated public WearableExtender setHintHideIcon(boolean hintHideIcon) { setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon); return this; @@ -8277,6 +8294,7 @@ public class Notification implements Parcelable * @return {@code true} if this icon should not be displayed, false otherwise. * The default value is {@code false} if this was never set. */ + @Deprecated public boolean getHintHideIcon() { return (mFlags & FLAG_HINT_HIDE_ICON) != 0; } @@ -8286,6 +8304,7 @@ public class Notification implements Parcelable * displayed, and other semantic content should be hidden. This hint is only applicable * to sub-pages added using {@link #addPage}. */ + @Deprecated public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) { setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly); return this; @@ -8296,6 +8315,7 @@ public class Notification implements Parcelable * displayed, and other semantic content should be hidden. This hint is only applicable * to sub-pages added using {@link android.app.Notification.WearableExtender#addPage}. */ + @Deprecated public boolean getHintShowBackgroundOnly() { return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0; } @@ -8307,6 +8327,7 @@ public class Notification implements Parcelable * @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible. * @return this object for method chaining */ + @Deprecated public WearableExtender setHintAvoidBackgroundClipping( boolean hintAvoidBackgroundClipping) { setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping); @@ -8320,6 +8341,7 @@ public class Notification implements Parcelable * @return {@code true} if it's ok if the background is clipped on the screen, false * otherwise. The default value is {@code false} if this was never set. */ + @Deprecated public boolean getHintAvoidBackgroundClipping() { return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0; } @@ -8331,6 +8353,7 @@ public class Notification implements Parcelable * {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}. * @return this object for method chaining */ + @Deprecated public WearableExtender setHintScreenTimeout(int timeout) { mHintScreenTimeout = timeout; return this; @@ -8342,6 +8365,7 @@ public class Notification implements Parcelable * @return the duration in milliseconds if > 0, or either one of the sentinel values * {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}. */ + @Deprecated public int getHintScreenTimeout() { return mHintScreenTimeout; } diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index ea990ad2924e..4e2cb646e714 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -48,6 +48,9 @@ import java.util.List; * and the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH} * {@link android.content.Intent Intent}. * + * <p> + * {@link Configuration#UI_MODE_TYPE_WATCH} does not support this system service. + * * <div class="special reference"> * <h3>Developer Guides</h3> * <p>For more information about using the search dialog and adding search diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 542c1d2f37a1..16e36bc54ef2 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -1646,11 +1646,15 @@ public class DevicePolicyManager { public static final int LOCK_TASK_FEATURE_HOME = 1 << 2; /** - * Enable the Recents button and the Recents screen during LockTask mode. + * Enable the Overview button and the Overview screen during LockTask mode. This feature flag + * can only be used in combination with {@link #LOCK_TASK_FEATURE_HOME}, and + * {@link #setLockTaskFeatures(ComponentName, int)} will throw an + * {@link IllegalArgumentException} if this feature flag is defined without + * {@link #LOCK_TASK_FEATURE_HOME}. * * @see #setLockTaskFeatures(ComponentName, int) */ - public static final int LOCK_TASK_FEATURE_RECENTS = 1 << 3; + public static final int LOCK_TASK_FEATURE_OVERVIEW = 1 << 3; /** * Enable the global actions dialog during LockTask mode. This is the dialog that shows up when @@ -1682,7 +1686,7 @@ public class DevicePolicyManager { LOCK_TASK_FEATURE_SYSTEM_INFO, LOCK_TASK_FEATURE_NOTIFICATIONS, LOCK_TASK_FEATURE_HOME, - LOCK_TASK_FEATURE_RECENTS, + LOCK_TASK_FEATURE_OVERVIEW, LOCK_TASK_FEATURE_GLOBAL_ACTIONS, LOCK_TASK_FEATURE_KEYGUARD }) @@ -2854,8 +2858,8 @@ public class DevicePolicyManager { * When called by a profile owner of a managed profile returns true if the profile uses unified * challenge with its parent user. * - * <strong>Note: This method is not concerned with password quality and will return false if - * the profile has empty password as a separate challenge. + * <strong>Note</strong>: This method is not concerned with password quality and will return + * false if the profile has empty password as a separate challenge. * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @throws SecurityException if {@code admin} is not a profile owner of a managed profile. @@ -3491,18 +3495,18 @@ public class DevicePolicyManager { * that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA} * @throws IllegalArgumentException if the input reason string is null or empty. */ - public void wipeDataWithReason(int flags, @NonNull CharSequence reason) { - throwIfParentInstance("wipeDataWithReason"); + public void wipeData(int flags, @NonNull CharSequence reason) { + throwIfParentInstance("wipeData"); Preconditions.checkNotNull(reason, "CharSequence is null"); wipeDataInternal(flags, reason.toString()); } /** * Internal function for both {@link #wipeData(int)} and - * {@link #wipeDataWithReason(int, CharSequence)} to call. + * {@link #wipeData(int, CharSequence)} to call. * * @see #wipeData(int) - * @see #wipeDataWithReason(int, CharSequence) + * @see #wipeData(int, CharSequence) * @hide */ private void wipeDataInternal(int flags, @NonNull String wipeReasonForUser) { @@ -7193,7 +7197,7 @@ public class DevicePolicyManager { * {@link #LOCK_TASK_FEATURE_SYSTEM_INFO}, * {@link #LOCK_TASK_FEATURE_NOTIFICATIONS}, * {@link #LOCK_TASK_FEATURE_HOME}, - * {@link #LOCK_TASK_FEATURE_RECENTS}, + * {@link #LOCK_TASK_FEATURE_OVERVIEW}, * {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS}, * {@link #LOCK_TASK_FEATURE_KEYGUARD} * @throws SecurityException if {@code admin} is not the device owner, the profile owner of an @@ -9550,12 +9554,19 @@ public class DevicePolicyManager { /** * Returns the data passed from the current administrator to the new administrator during an * ownership transfer. This is the same {@code bundle} passed in - * {@link #transferOwnership(ComponentName, ComponentName, PersistableBundle)}. + * {@link #transferOwnership(ComponentName, ComponentName, PersistableBundle)}. The bundle is + * persisted until the profile owner or device owner is removed. + * + * <p>This is the same <code>bundle</code> received in the + * {@link DeviceAdminReceiver#onTransferOwnershipComplete(Context, PersistableBundle)}. + * Use this method to retrieve it after the transfer as long as the new administrator is the + * active device or profile owner. * * <p>Returns <code>null</code> if no ownership transfer was started for the calling user. * * @see #transferOwnership * @see DeviceAdminReceiver#onTransferOwnershipComplete(Context, PersistableBundle) + * @throws SecurityException if the caller is not a device or profile owner. */ @Nullable public PersistableBundle getTransferOwnershipBundle() { diff --git a/core/java/android/app/admin/SecurityLog.java b/core/java/android/app/admin/SecurityLog.java index faaa0043cce8..38b4f8ff8d67 100644 --- a/core/java/android/app/admin/SecurityLog.java +++ b/core/java/android/app/admin/SecurityLog.java @@ -295,7 +295,7 @@ public class SecurityLog { * <li> [1] admin user ID ({@code Integer}) * <li> [2] target user ID ({@code Integer}) * <li> [3] new maximum number of failed password attempts ({@code Integer}) - * @see DevicePolicyManager#setMaximumTimeToLock(ComponentName, long) + * @see DevicePolicyManager#setMaximumFailedPasswordsForWipe(ComponentName, int) */ public static final int TAG_MAX_PASSWORD_ATTEMPTS_SET = SecurityLogTags.SECURITY_MAX_PASSWORD_ATTEMPTS_SET; @@ -370,7 +370,7 @@ public class SecurityLog { SecurityLogTags.SECURITY_CERT_AUTHORITY_INSTALLED; /** - * Indicates that a new oot certificate has been removed from system's trusted credential + * Indicates that a new root certificate has been removed from system's trusted credential * storage. The log entry contains the following information about the event, encapsulated in an * {@link Object} array and accessible via {@link SecurityEvent#getData()}: * <li> [0] result ({@code Integer}, 0 if operation failed, 1 if succeeded) diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java index d36a794ac046..d1c957b8fedc 100644 --- a/core/java/android/app/backup/BackupAgent.java +++ b/core/java/android/app/backup/BackupAgent.java @@ -18,6 +18,7 @@ package android.app.backup; import android.app.IBackupAgent; import android.app.QueuedWork; +import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.ApplicationInfo; @@ -343,8 +344,8 @@ public abstract class BackupAgent extends ContextWrapper { return; } - Map<String, Set<String>> manifestIncludeMap; - ArraySet<String> manifestExcludeSet; + Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap; + ArraySet<PathWithRequiredFlags> manifestExcludeSet; try { manifestIncludeMap = backupScheme.maybeParseAndGetCanonicalIncludePaths(); @@ -514,14 +515,13 @@ public abstract class BackupAgent extends ContextWrapper { /** * Check whether the xml yielded any <include/> tag for the provided <code>domainToken</code>. * If so, perform a {@link #fullBackupFileTree} which backs up the file or recurses if the path - * is a directory. + * is a directory, but only if all the required flags of the include rule are satisfied by + * the transport. */ private void applyXmlFiltersAndDoFullBackupForDomain(String packageName, String domainToken, - Map<String, Set<String>> includeMap, - ArraySet<String> filterSet, - ArraySet<String> traversalExcludeSet, - FullBackupDataOutput data) - throws IOException { + Map<String, Set<PathWithRequiredFlags>> includeMap, + ArraySet<PathWithRequiredFlags> filterSet, ArraySet<String> traversalExcludeSet, + FullBackupDataOutput data) throws IOException { if (includeMap == null || includeMap.size() == 0) { // Do entire sub-tree for the provided token. fullBackupFileTree(packageName, domainToken, @@ -530,13 +530,22 @@ public abstract class BackupAgent extends ContextWrapper { } else if (includeMap.get(domainToken) != null) { // This will be null if the xml parsing didn't yield any rules for // this domain (there may still be rules for other domains). - for (String includeFile : includeMap.get(domainToken)) { - fullBackupFileTree(packageName, domainToken, includeFile, filterSet, - traversalExcludeSet, data); + for (PathWithRequiredFlags includeFile : includeMap.get(domainToken)) { + if (areIncludeRequiredTransportFlagsSatisfied(includeFile.getRequiredFlags(), + data.getTransportFlags())) { + fullBackupFileTree(packageName, domainToken, includeFile.getPath(), filterSet, + traversalExcludeSet, data); + } } } } + private boolean areIncludeRequiredTransportFlagsSatisfied(int includeFlags, + int transportFlags) { + // all bits that are set in includeFlags must also be set in transportFlags + return (transportFlags & includeFlags) == includeFlags; + } + /** * Write an entire file as part of a full-backup operation. The file's contents * will be delivered to the backup destination along with the metadata necessary @@ -683,7 +692,7 @@ public abstract class BackupAgent extends ContextWrapper { * @hide */ protected final void fullBackupFileTree(String packageName, String domain, String startingPath, - ArraySet<String> manifestExcludes, + ArraySet<PathWithRequiredFlags> manifestExcludes, ArraySet<String> systemExcludes, FullBackupDataOutput output) { // Pull out the domain and set it aside to use when making the tarball. @@ -714,7 +723,8 @@ public abstract class BackupAgent extends ContextWrapper { filePath = file.getCanonicalPath(); // prune this subtree? - if (manifestExcludes != null && manifestExcludes.contains(filePath)) { + if (manifestExcludes != null + && manifestExcludesContainFilePath(manifestExcludes, filePath)) { continue; } if (systemExcludes != null && systemExcludes.contains(filePath)) { @@ -750,6 +760,17 @@ public abstract class BackupAgent extends ContextWrapper { } } + private boolean manifestExcludesContainFilePath( + ArraySet<PathWithRequiredFlags> manifestExcludes, String filePath) { + for (PathWithRequiredFlags exclude : manifestExcludes) { + String excludePath = exclude.getPath(); + if (excludePath != null && excludePath.equals(filePath)) { + return true; + } + } + return false; + } + /** * Handle the data delivered via the given file descriptor during a full restore * operation. The agent is given the path to the file's original location as well @@ -796,8 +817,8 @@ public abstract class BackupAgent extends ContextWrapper { return false; } - Map<String, Set<String>> includes = null; - ArraySet<String> excludes = null; + Map<String, Set<PathWithRequiredFlags>> includes = null; + ArraySet<PathWithRequiredFlags> excludes = null; final String destinationCanonicalPath = destination.getCanonicalPath(); try { includes = bs.maybeParseAndGetCanonicalIncludePaths(); @@ -826,7 +847,7 @@ public abstract class BackupAgent extends ContextWrapper { // Rather than figure out the <include/> domain based on the path (a lot of code, and // it's a small list), we'll go through and look for it. boolean explicitlyIncluded = false; - for (Set<String> domainIncludes : includes.values()) { + for (Set<PathWithRequiredFlags> domainIncludes : includes.values()) { explicitlyIncluded |= isFileSpecifiedInPathList(destination, domainIncludes); if (explicitlyIncluded) { break; @@ -849,9 +870,10 @@ public abstract class BackupAgent extends ContextWrapper { * @return True if the provided file is either directly in the provided list, or the provided * file is within a directory in the list. */ - private boolean isFileSpecifiedInPathList(File file, Collection<String> canonicalPathList) - throws IOException { - for (String canonicalPath : canonicalPathList) { + private boolean isFileSpecifiedInPathList(File file, + Collection<PathWithRequiredFlags> canonicalPathList) throws IOException { + for (PathWithRequiredFlags canonical : canonicalPathList) { + String canonicalPath = canonical.getPath(); File fileFromList = new File(canonicalPath); if (fileFromList.isDirectory()) { if (file.isDirectory()) { diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java index 6ec0969771c6..debc32bd83eb 100644 --- a/core/java/android/app/backup/BackupManager.java +++ b/core/java/android/app/backup/BackupManager.java @@ -19,6 +19,7 @@ package android.app.backup; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -715,6 +716,92 @@ public class BackupManager { } } + /** + * Returns an {@link Intent} for the specified transport's configuration UI. + * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, + * Intent, String)}. + * @param transportName The name of the registered transport. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(android.Manifest.permission.BACKUP) + public Intent getConfigurationIntent(String transportName) { + if (sService != null) { + try { + return sService.getConfigurationIntent(transportName); + } catch (RemoteException e) { + Log.e(TAG, "getConfigurationIntent() couldn't connect"); + } + } + return null; + } + + /** + * Returns a {@link String} describing where the specified transport is sending data. + * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, + * Intent, String)}. + * @param transportName The name of the registered transport. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(android.Manifest.permission.BACKUP) + public String getDestinationString(String transportName) { + if (sService != null) { + try { + return sService.getDestinationString(transportName); + } catch (RemoteException e) { + Log.e(TAG, "getDestinationString() couldn't connect"); + } + } + return null; + } + + /** + * Returns an {@link Intent} for the specified transport's data management UI. + * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, + * Intent, String)}. + * @param transportName The name of the registered transport. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(android.Manifest.permission.BACKUP) + public Intent getDataManagementIntent(String transportName) { + if (sService != null) { + try { + return sService.getDataManagementIntent(transportName); + } catch (RemoteException e) { + Log.e(TAG, "getDataManagementIntent() couldn't connect"); + } + } + return null; + } + + /** + * Returns a {@link String} describing what the specified transport's data management intent is + * used for. + * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String, + * Intent, String)}. + * + * @param transportName The name of the registered transport. + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(android.Manifest.permission.BACKUP) + public String getDataManagementLabel(String transportName) { + if (sService != null) { + try { + return sService.getDataManagementLabel(transportName); + } catch (RemoteException e) { + Log.e(TAG, "getDataManagementLabel() couldn't connect"); + } + } + return null; + } + /* * We wrap incoming binder calls with a private class implementation that * redirects them into main-thread actions. This serializes the backup diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index a5dd5bd30d63..fb1c2d085df6 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -82,6 +82,9 @@ public class FullBackup { public static final String FULL_RESTORE_INTENT_ACTION = "fullrest"; public static final String CONF_TOKEN_INTENT_EXTRA = "conftoken"; + public static final String FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION = "clientSideEncryption"; + public static final String FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER = "deviceToDeviceTransfer"; + /** * @hide */ @@ -224,6 +227,9 @@ public class FullBackup { private final File EXTERNAL_DIR; + private final static String TAG_INCLUDE = "include"; + private final static String TAG_EXCLUDE = "exclude"; + final int mFullBackupContent; final PackageManager mPackageManager; final StorageManager mStorageManager; @@ -303,15 +309,45 @@ public class FullBackup { } /** - * A map of domain -> list of canonical file names in that domain that are to be included. - * We keep track of the domain so that we can go through the file system in order later on. - */ - Map<String, Set<String>> mIncludes; - /**e - * List that will be populated with the canonical names of each file or directory that is - * to be excluded. + * Represents a path attribute specified in an <include /> rule along with optional + * transport flags required from the transport to include file(s) under that path as + * specified by requiredFlags attribute. If optional requiredFlags attribute is not + * provided, default requiredFlags to 0. + * Note: since our parsing codepaths were the same for <include /> and <exclude /> tags, + * this structure is also used for <exclude /> tags to preserve that, however you can expect + * the getRequiredFlags() to always return 0 for exclude rules. + */ + public static class PathWithRequiredFlags { + private final String mPath; + private final int mRequiredFlags; + + public PathWithRequiredFlags(String path, int requiredFlags) { + mPath = path; + mRequiredFlags = requiredFlags; + } + + public String getPath() { + return mPath; + } + + public int getRequiredFlags() { + return mRequiredFlags; + } + } + + /** + * A map of domain -> set of pairs (canonical file; required transport flags) in that + * domain that are to be included if the transport has decared the required flags. + * We keep track of the domain so that we can go through the file system in order later on. + */ + Map<String, Set<PathWithRequiredFlags>> mIncludes; + + /** + * Set that will be populated with pairs (canonical file; requiredFlags=0) for each file or + * directory that is to be excluded. Note that for excludes, the requiredFlags attribute is + * ignored and the value should be always set to 0. */ - ArraySet<String> mExcludes; + ArraySet<PathWithRequiredFlags> mExcludes; BackupScheme(Context context) { mFullBackupContent = context.getApplicationInfo().fullBackupContent; @@ -356,13 +392,14 @@ public class FullBackup { } /** - * @return A mapping of domain -> canonical paths within that domain. Each of these paths - * specifies a file that the client has explicitly included in their backup set. If this - * map is empty we will back up the entire data directory (including managed external - * storage). + * @return A mapping of domain -> set of pairs (canonical file; required transport flags) + * in that domain that are to be included if the transport has decared the required flags. + * Each of these paths specifies a file that the client has explicitly included in their + * backup set. If this map is empty we will back up the entire data directory (including + * managed external storage). */ - public synchronized Map<String, Set<String>> maybeParseAndGetCanonicalIncludePaths() - throws IOException, XmlPullParserException { + public synchronized Map<String, Set<PathWithRequiredFlags>> + maybeParseAndGetCanonicalIncludePaths() throws IOException, XmlPullParserException { if (mIncludes == null) { maybeParseBackupSchemeLocked(); } @@ -370,9 +407,10 @@ public class FullBackup { } /** - * @return A set of canonical paths that are to be excluded from the backup/restore set. + * @return A set of (canonical paths; requiredFlags=0) that are to be excluded from the + * backup/restore set. */ - public synchronized ArraySet<String> maybeParseAndGetCanonicalExcludePaths() + public synchronized ArraySet<PathWithRequiredFlags> maybeParseAndGetCanonicalExcludePaths() throws IOException, XmlPullParserException { if (mExcludes == null) { maybeParseBackupSchemeLocked(); @@ -382,8 +420,8 @@ public class FullBackup { private void maybeParseBackupSchemeLocked() throws IOException, XmlPullParserException { // This not being null is how we know that we've tried to parse the xml already. - mIncludes = new ArrayMap<String, Set<String>>(); - mExcludes = new ArraySet<String>(); + mIncludes = new ArrayMap<String, Set<PathWithRequiredFlags>>(); + mExcludes = new ArraySet<PathWithRequiredFlags>(); if (mFullBackupContent == 0) { // android:fullBackupContent="true" which means that we'll do everything. @@ -415,8 +453,8 @@ public class FullBackup { @VisibleForTesting public void parseBackupSchemeFromXmlLocked(XmlPullParser parser, - Set<String> excludes, - Map<String, Set<String>> includes) + Set<PathWithRequiredFlags> excludes, + Map<String, Set<PathWithRequiredFlags>> includes) throws IOException, XmlPullParserException { int event = parser.getEventType(); // START_DOCUMENT while (event != XmlPullParser.START_TAG) { @@ -441,8 +479,7 @@ public class FullBackup { case XmlPullParser.START_TAG: validateInnerTagContents(parser); final String domainFromXml = parser.getAttributeValue(null, "domain"); - final File domainDirectory = - getDirectoryForCriteriaDomain(domainFromXml); + final File domainDirectory = getDirectoryForCriteriaDomain(domainFromXml); if (domainDirectory == null) { if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...parsing \"" + parser.getName() + "\": " @@ -457,12 +494,23 @@ public class FullBackup { break; } - Set<String> activeSet = parseCurrentTagForDomain( + int requiredFlags = 0; // no transport flags are required by default + if (TAG_INCLUDE.equals(parser.getName())) { + // requiredFlags are only supported for <include /> tag, for <exclude /> + // we should always leave them as the default = 0 + requiredFlags = getRequiredFlagsFromString( + parser.getAttributeValue(null, "requireFlags")); + } + + // retrieve the include/exclude set we'll be adding this rule to + Set<PathWithRequiredFlags> activeSet = parseCurrentTagForDomain( parser, excludes, includes, domainFromXml); - activeSet.add(canonicalFile.getCanonicalPath()); + activeSet.add(new PathWithRequiredFlags(canonicalFile.getCanonicalPath(), + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...parsed " + canonicalFile.getCanonicalPath() - + " for domain \"" + domainFromXml + "\""); + + " for domain \"" + domainFromXml + "\", requiredFlags + \"" + + requiredFlags + "\""); } // Special case journal files (not dirs) for sqlite database. frowny-face. @@ -472,14 +520,16 @@ public class FullBackup { if ("database".equals(domainFromXml) && !canonicalFile.isDirectory()) { final String canonicalJournalPath = canonicalFile.getCanonicalPath() + "-journal"; - activeSet.add(canonicalJournalPath); + activeSet.add(new PathWithRequiredFlags(canonicalJournalPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalJournalPath + ". Ignore if nonexistent."); } final String canonicalWalPath = canonicalFile.getCanonicalPath() + "-wal"; - activeSet.add(canonicalWalPath); + activeSet.add(new PathWithRequiredFlags(canonicalWalPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalWalPath + ". Ignore if nonexistent."); @@ -491,7 +541,8 @@ public class FullBackup { !canonicalFile.getCanonicalPath().endsWith(".xml")) { final String canonicalXmlPath = canonicalFile.getCanonicalPath() + ".xml"; - activeSet.add(canonicalXmlPath); + activeSet.add(new PathWithRequiredFlags(canonicalXmlPath, + requiredFlags)); if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) { Log.v(TAG_XML_PARSER, "...automatically generated " + canonicalXmlPath + ". Ignore if nonexistent."); @@ -508,10 +559,12 @@ public class FullBackup { Log.v(TAG_XML_PARSER, " ...nothing specified (This means the entirety of app" + " data minus excludes)"); } else { - for (Map.Entry<String, Set<String>> entry : includes.entrySet()) { + for (Map.Entry<String, Set<PathWithRequiredFlags>> entry + : includes.entrySet()) { Log.v(TAG_XML_PARSER, " domain=" + entry.getKey()); - for (String includeData : entry.getValue()) { - Log.v(TAG_XML_PARSER, " " + includeData); + for (PathWithRequiredFlags includeData : entry.getValue()) { + Log.v(TAG_XML_PARSER, " path: " + includeData.getPath() + + " requiredFlags: " + includeData.getRequiredFlags()); } } } @@ -520,8 +573,9 @@ public class FullBackup { if (excludes.isEmpty()) { Log.v(TAG_XML_PARSER, " ...nothing to exclude."); } else { - for (String excludeData : excludes) { - Log.v(TAG_XML_PARSER, " " + excludeData); + for (PathWithRequiredFlags excludeData : excludes) { + Log.v(TAG_XML_PARSER, " path: " + excludeData.getPath() + + " requiredFlags: " + excludeData.getRequiredFlags()); } } @@ -531,20 +585,41 @@ public class FullBackup { } } - private Set<String> parseCurrentTagForDomain(XmlPullParser parser, - Set<String> excludes, - Map<String, Set<String>> includes, - String domain) + private int getRequiredFlagsFromString(String requiredFlags) { + int flags = 0; + if (requiredFlags == null || requiredFlags.length() == 0) { + // requiredFlags attribute was missing or empty in <include /> tag + return flags; + } + String[] flagsStr = requiredFlags.split("\\|"); + for (String f : flagsStr) { + switch (f) { + case FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION: + flags |= BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED; + break; + case FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER: + flags |= BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER; + break; + default: + Log.w(TAG, "Unrecognized requiredFlag provided, value: \"" + f + "\""); + } + } + return flags; + } + + private Set<PathWithRequiredFlags> parseCurrentTagForDomain(XmlPullParser parser, + Set<PathWithRequiredFlags> excludes, + Map<String, Set<PathWithRequiredFlags>> includes, String domain) throws XmlPullParserException { - if ("include".equals(parser.getName())) { + if (TAG_INCLUDE.equals(parser.getName())) { final String domainToken = getTokenForXmlDomain(domain); - Set<String> includeSet = includes.get(domainToken); + Set<PathWithRequiredFlags> includeSet = includes.get(domainToken); if (includeSet == null) { - includeSet = new ArraySet<String>(); + includeSet = new ArraySet<PathWithRequiredFlags>(); includes.put(domainToken, includeSet); } return includeSet; - } else if ("exclude".equals(parser.getName())) { + } else if (TAG_EXCLUDE.equals(parser.getName())) { return excludes; } else { // Unrecognised tag => hard failure. @@ -589,8 +664,8 @@ public class FullBackup { /** * * @param domain Directory where the specified file should exist. Not null. - * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may be - * null. + * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may + * be null. * @return The canonical path of the file specified or null if no such file exists. */ private File extractCanonicalFile(File domain, String filePathFromXml) { @@ -650,15 +725,27 @@ public class FullBackup { * Let's be strict about the type of xml the client can write. If we see anything untoward, * throw an XmlPullParserException. */ - private void validateInnerTagContents(XmlPullParser parser) - throws XmlPullParserException { - if (parser.getAttributeCount() > 2) { - throw new XmlPullParserException("At most 2 tag attributes allowed for \"" - + parser.getName() + "\" tag (\"domain\" & \"path\"."); + private void validateInnerTagContents(XmlPullParser parser) throws XmlPullParserException { + if (parser == null) { + return; } - if (!"include".equals(parser.getName()) && !"exclude".equals(parser.getName())) { - throw new XmlPullParserException("A valid tag is one of \"<include/>\" or" + - " \"<exclude/>. You provided \"" + parser.getName() + "\""); + switch (parser.getName()) { + case TAG_INCLUDE: + if (parser.getAttributeCount() > 3) { + throw new XmlPullParserException("At most 3 tag attributes allowed for " + + "\"include\" tag (\"domain\" & \"path\"" + + " & optional \"requiredFlags\")."); + } + break; + case TAG_EXCLUDE: + if (parser.getAttributeCount() > 2) { + throw new XmlPullParserException("At most 2 tag attributes allowed for " + + "\"exclude\" tag (\"domain\" & \"path\"."); + } + break; + default: + throw new XmlPullParserException("A valid tag is one of \"<include/>\" or" + + " \"<exclude/>. You provided \"" + parser.getName() + "\""); } } } diff --git a/core/java/android/app/servertransaction/PauseActivityItem.java b/core/java/android/app/servertransaction/PauseActivityItem.java index 91e73cd5b1cd..578f0e3d24cb 100644 --- a/core/java/android/app/servertransaction/PauseActivityItem.java +++ b/core/java/android/app/servertransaction/PauseActivityItem.java @@ -43,7 +43,7 @@ public class PauseActivityItem extends ActivityLifecycleItem { PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause"); client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, mDontReport, - pendingActions); + pendingActions, "PAUSE_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } diff --git a/core/java/android/app/servertransaction/StopActivityItem.java b/core/java/android/app/servertransaction/StopActivityItem.java index f955a903d649..0a61fab2a8ea 100644 --- a/core/java/android/app/servertransaction/StopActivityItem.java +++ b/core/java/android/app/servertransaction/StopActivityItem.java @@ -38,7 +38,8 @@ public class StopActivityItem extends ActivityLifecycleItem { public void execute(ClientTransactionHandler client, IBinder token, PendingTransactionActions pendingActions) { Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop"); - client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions); + client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions, + "STOP_ACTIVITY_ITEM"); Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); } diff --git a/core/java/android/app/servertransaction/TransactionExecutor.java b/core/java/android/app/servertransaction/TransactionExecutor.java index 840fef80a5ff..b66d61b76d5f 100644 --- a/core/java/android/app/servertransaction/TransactionExecutor.java +++ b/core/java/android/app/servertransaction/TransactionExecutor.java @@ -186,11 +186,11 @@ public class TransactionExecutor { case ON_PAUSE: mTransactionHandler.handlePauseActivity(r.token, false /* finished */, false /* userLeaving */, 0 /* configChanges */, - true /* dontReport */, mPendingActions); + true /* dontReport */, mPendingActions, "LIFECYCLER_PAUSE_ACTIVITY"); break; case ON_STOP: mTransactionHandler.handleStopActivity(r.token, false /* show */, - 0 /* configChanges */, mPendingActions); + 0 /* configChanges */, mPendingActions, "LIFECYCLER_STOP_ACTIVITY"); break; case ON_DESTROY: mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */, diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl index 38d9025cc82f..20ec75a36ad3 100644 --- a/core/java/android/app/slice/ISliceManager.aidl +++ b/core/java/android/app/slice/ISliceManager.aidl @@ -16,17 +16,13 @@ package android.app.slice; -import android.app.slice.ISliceListener; import android.app.slice.SliceSpec; import android.net.Uri; /** @hide */ interface ISliceManager { - void addSliceListener(in Uri uri, String pkg, in ISliceListener listener, - in SliceSpec[] specs); - void removeSliceListener(in Uri uri, String pkg, in ISliceListener listener); - void pinSlice(String pkg, in Uri uri, in SliceSpec[] specs); - void unpinSlice(String pkg, in Uri uri); + void pinSlice(String pkg, in Uri uri, in SliceSpec[] specs, in IBinder token); + void unpinSlice(String pkg, in Uri uri, in IBinder token); boolean hasSliceAccess(String pkg); SliceSpec[] getPinnedSpecs(in Uri uri, String pkg); int checkSlicePermission(in Uri uri, String pkg, int pid, int uid); diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java index 126deefae282..0a5795e471f5 100644 --- a/core/java/android/app/slice/Slice.java +++ b/core/java/android/app/slice/Slice.java @@ -71,16 +71,6 @@ public final class Slice implements Parcelable { public @interface SliceHint {} /** - * The meta-data key that allows an activity to easily be linked directly to a slice. - * <p> - * An activity can be statically linked to a slice uri by including a meta-data item - * for this key that contains a valid slice uri for the same application declaring - * the activity. - * @hide - */ - public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI"; - - /** * Hint that this content is a title of other content in the slice. This can also indicate that * the content should be used in the shortcut representation of the slice (icon, label, action), * normally this should be indicated by adding the hint on the action containing that content. diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java index 3f13fffb3857..ae1d8d79caf0 100644 --- a/core/java/android/app/slice/SliceManager.java +++ b/core/java/android/app/slice/SliceManager.java @@ -24,10 +24,13 @@ import android.content.ContentProviderClient; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; +import android.os.Binder; import android.os.Bundle; import android.os.Handler; +import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceManager.ServiceNotFoundException; @@ -60,10 +63,20 @@ public class SliceManager { public static final String ACTION_REQUEST_SLICE_PERMISSION = "android.intent.action.REQUEST_SLICE_PERMISSION"; + /** + * The meta-data key that allows an activity to easily be linked directly to a slice. + * <p> + * An activity can be statically linked to a slice uri by including a meta-data item + * for this key that contains a valid slice uri for the same application declaring + * the activity. + */ + public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI"; + private final ISliceManager mService; private final Context mContext; private final ArrayMap<Pair<Uri, SliceCallback>, ISliceListener> mListenerLookup = new ArrayMap<>(); + private final IBinder mToken = new Binder(); /** * Permission denied. @@ -96,7 +109,6 @@ public class SliceManager { @Deprecated public void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback, @NonNull List<SliceSpec> specs) { - registerSliceCallback(uri, specs, mContext.getMainExecutor(), callback); } /** @@ -105,7 +117,6 @@ public class SliceManager { @Deprecated public void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback, @NonNull List<SliceSpec> specs, Executor executor) { - registerSliceCallback(uri, specs, executor, callback); } /** @@ -123,7 +134,6 @@ public class SliceManager { */ public void registerSliceCallback(@NonNull Uri uri, @NonNull List<SliceSpec> specs, @NonNull SliceCallback callback) { - registerSliceCallback(uri, specs, mContext.getMainExecutor(), callback); } /** @@ -141,32 +151,7 @@ public class SliceManager { */ public void registerSliceCallback(@NonNull Uri uri, @NonNull List<SliceSpec> specs, @NonNull @CallbackExecutor Executor executor, @NonNull SliceCallback callback) { - try { - mService.addSliceListener(uri, mContext.getPackageName(), - getListener(uri, callback, new ISliceListener.Stub() { - @Override - public void onSliceUpdated(Slice s) throws RemoteException { - executor.execute(() -> callback.onSliceUpdated(s)); - } - }), specs.toArray(new SliceSpec[specs.size()])); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - private ISliceListener getListener(Uri uri, SliceCallback callback, - ISliceListener listener) { - Pair<Uri, SliceCallback> key = new Pair<>(uri, callback); - if (mListenerLookup.containsKey(key)) { - try { - mService.removeSliceListener(uri, mContext.getPackageName(), - mListenerLookup.get(key)); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - mListenerLookup.put(key, listener); - return listener; } /** @@ -180,12 +165,7 @@ public class SliceManager { * @see #registerSliceCallback */ public void unregisterSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback) { - try { - mService.removeSliceListener(uri, mContext.getPackageName(), - mListenerLookup.remove(new Pair<>(uri, callback))); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + } /** @@ -206,7 +186,7 @@ public class SliceManager { public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) { try { mService.pinSlice(mContext.getPackageName(), uri, - specs.toArray(new SliceSpec[specs.size()])); + specs.toArray(new SliceSpec[specs.size()]), mToken); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -228,7 +208,7 @@ public class SliceManager { */ public void unpinSlice(@NonNull Uri uri) { try { - mService.unpinSlice(mContext.getPackageName(), uri); + mService.unpinSlice(mContext.getPackageName(), uri, mToken); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -316,12 +296,10 @@ public class SliceManager { } /** - * Turns a slice intent into a slice uri. Expects an explicit intent. If there is no - * {@link android.content.ContentProvider} associated with the given intent this will throw - * {@link IllegalArgumentException}. + * Turns a slice intent into a slice uri. Expects an explicit intent. * * @param intent The intent associated with a slice. - * @return The Slice Uri provided by the app or null if none is given. + * @return The Slice Uri provided by the app or null if none exists. * @see Slice * @see SliceProvider#onMapIntentToUri(Intent) * @see Intent @@ -341,7 +319,16 @@ public class SliceManager { List<ResolveInfo> providers = mContext.getPackageManager().queryIntentContentProviders(intent, 0); if (providers == null || providers.isEmpty()) { - throw new IllegalArgumentException("Unable to resolve intent " + intent); + // There are no providers, see if this activity has a direct link. + ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent, + PackageManager.GET_META_DATA); + if (resolve != null && resolve.activityInfo != null + && resolve.activityInfo.metaData != null + && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) { + return Uri.parse( + resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY)); + } + return null; } String authority = providers.get(0).providerInfo.authority; Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) @@ -392,7 +379,16 @@ public class SliceManager { List<ResolveInfo> providers = mContext.getPackageManager().queryIntentContentProviders(intent, 0); if (providers == null || providers.isEmpty()) { - throw new IllegalArgumentException("Unable to resolve intent " + intent); + // There are no providers, see if this activity has a direct link. + ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent, + PackageManager.GET_META_DATA); + if (resolve != null && resolve.activityInfo != null + && resolve.activityInfo.metaData != null + && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) { + return bindSlice(Uri.parse(resolve.activityInfo.metaData + .getString(SLICE_METADATA_KEY)), supportedSpecs); + } + return null; } String authority = providers.get(0).providerInfo.authority; Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT) diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java index dc7925694176..fe83113b5d56 100644 --- a/core/java/android/app/timezone/RulesManager.java +++ b/core/java/android/app/timezone/RulesManager.java @@ -36,7 +36,7 @@ import java.util.Arrays; * <p>This interface is intended for use with the default APK-based time zone rules update * application but it can also be used by OEMs if that mechanism is turned off using configuration. * All callers must possess the {@link android.Manifest.permission#UPDATE_TIME_ZONE_RULES} system - * permission. + * permission unless otherwise stated. * * <p>When using the default mechanism, when properly configured the Android system will send a * {@link RulesUpdaterContract#ACTION_TRIGGER_RULES_UPDATE_CHECK} intent with a @@ -120,9 +120,12 @@ public final class RulesManager { /** * Returns information about the current time zone rules state such as the IANA version of - * the system and any currently installed distro. This method is intended to allow clients to - * determine if the current state can be improved; for example by passing the information to a - * server that may provide a new distro for download. + * the system and any currently installed distro. This method allows clients to determine the + * current device state, perhaps to see if it can be improved; for example by passing the + * information to a server that may provide a new distro for download. + * + * <p>Callers must possess the {@link android.Manifest.permission#QUERY_TIME_ZONE_RULES} system + * permission. */ public RulesState getRulesState() { try { diff --git a/core/java/android/app/usage/AppStandbyInfo.java b/core/java/android/app/usage/AppStandbyInfo.java new file mode 100644 index 000000000000..51fe0e2745be --- /dev/null +++ b/core/java/android/app/usage/AppStandbyInfo.java @@ -0,0 +1,64 @@ +/* + * 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.app.usage; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * A pair of {package, bucket} to denote the app standby bucket for a given package. + * Used as a vehicle of data across the binder IPC. + * @hide + */ +public final class AppStandbyInfo implements Parcelable { + + public String mPackageName; + public @UsageStatsManager.StandbyBuckets int mStandbyBucket; + + private AppStandbyInfo(Parcel in) { + mPackageName = in.readString(); + mStandbyBucket = in.readInt(); + } + + public AppStandbyInfo(String packageName, int bucket) { + mPackageName = packageName; + mStandbyBucket = bucket; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mPackageName); + dest.writeInt(mStandbyBucket); + } + + public static final Creator<AppStandbyInfo> CREATOR = new Creator<AppStandbyInfo>() { + @Override + public AppStandbyInfo createFromParcel(Parcel source) { + return new AppStandbyInfo(source); + } + + @Override + public AppStandbyInfo[] newArray(int size) { + return new AppStandbyInfo[size]; + } + }; +} diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index f089c127d03f..e72b84d24802 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -40,6 +40,6 @@ interface IUsageStatsManager { in String[] annotations, String action); int getAppStandbyBucket(String packageName, String callingPackage, int userId); void setAppStandbyBucket(String packageName, int bucket, int userId); - Map getAppStandbyBuckets(String callingPackage, int userId); - void setAppStandbyBuckets(in Map appBuckets, int userId); + ParceledListSlice getAppStandbyBuckets(String callingPackage, int userId); + void setAppStandbyBuckets(in ParceledListSlice appBuckets, int userId); } diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java index 6b573e99f1fa..521ab4edc4c5 100644 --- a/core/java/android/app/usage/UsageEvents.java +++ b/core/java/android/app/usage/UsageEvents.java @@ -109,7 +109,8 @@ public final class UsageEvents implements Parcelable { public static final int NOTIFICATION_SEEN = 10; /** - * An event type denoting a change in App Standby Bucket. + * An event type denoting a change in App Standby Bucket. Additional bucket information + * is contained in mBucketAndReason. * @hide */ @SystemApi @@ -180,11 +181,12 @@ public final class UsageEvents implements Parcelable { public String[] mContentAnnotations; /** - * The app standby bucket assigned. + * The app standby bucket assigned and reason. Bucket is the high order 16 bits, reason + * is the low order 16 bits. * Only present for {@link #STANDBY_BUCKET_CHANGED} event types * {@hide} */ - public int mBucket; + public int mBucketAndReason; /** @hide */ @EventFlags @@ -205,7 +207,7 @@ public final class UsageEvents implements Parcelable { mContentType = orig.mContentType; mContentAnnotations = orig.mContentAnnotations; mFlags = orig.mFlags; - mBucket = orig.mBucket; + mBucketAndReason = orig.mBucketAndReason; } /** @@ -268,7 +270,19 @@ public final class UsageEvents implements Parcelable { */ @SystemApi public int getStandbyBucket() { - return mBucket; + return (mBucketAndReason & 0xFFFF0000) >>> 16; + } + + /** + * Returns the reason for the bucketing, if the event is of type + * {@link #STANDBY_BUCKET_CHANGED}, otherwise returns 0. Reason values include + * the main reason which is one of REASON_MAIN_*, OR'ed with REASON_SUB_*, if there + * are sub-reasons for the main reason, such as REASON_SUB_USAGE_* when the main reason + * is REASON_MAIN_USAGE. + * @hide + */ + public int getStandbyReason() { + return mBucketAndReason & 0x0000FFFF; } /** @hide */ @@ -428,7 +442,7 @@ public final class UsageEvents implements Parcelable { p.writeStringArray(event.mContentAnnotations); break; case Event.STANDBY_BUCKET_CHANGED: - p.writeInt(event.mBucket); + p.writeInt(event.mBucketAndReason); break; } } @@ -474,7 +488,7 @@ public final class UsageEvents implements Parcelable { eventOut.mContentAnnotations = p.createStringArray(); break; case Event.STANDBY_BUCKET_CHANGED: - eventOut.mBucket = p.readInt(); + eventOut.mBucketAndReason = p.readInt(); break; } } diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index cf359026105d..5a57b067f2c4 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -28,6 +28,7 @@ import android.util.ArrayMap; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -131,24 +132,37 @@ public final class UsageStatsManager { @SystemApi public static final int STANDBY_BUCKET_NEVER = 50; - /** {@hide} Reason for bucketing -- default initial state */ - public static final String REASON_DEFAULT = "default"; - - /** {@hide} Reason for bucketing -- timeout */ - public static final String REASON_TIMEOUT = "timeout"; - - /** {@hide} Reason for bucketing -- usage */ - public static final String REASON_USAGE = "usage"; - - /** {@hide} Reason for bucketing -- forced by user / shell command */ - public static final String REASON_FORCED = "forced"; + /** @hide */ + public static final int REASON_MAIN_MASK = 0xFF00; + /** @hide */ + public static final int REASON_MAIN_DEFAULT = 0x0100; + /** @hide */ + public static final int REASON_MAIN_TIMEOUT = 0x0200; + /** @hide */ + public static final int REASON_MAIN_USAGE = 0x0300; + /** @hide */ + public static final int REASON_MAIN_FORCED = 0x0400; + /** @hide */ + public static final int REASON_MAIN_PREDICTED = 0x0500; - /** - * {@hide} - * Reason for bucketing -- predicted. This is a prefix and the UID of the bucketeer will - * be appended. - */ - public static final String REASON_PREDICTED = "predicted"; + /** @hide */ + public static final int REASON_SUB_MASK = 0x00FF; + /** @hide */ + public static final int REASON_SUB_USAGE_SYSTEM_INTERACTION = 0x0001; + /** @hide */ + public static final int REASON_SUB_USAGE_NOTIFICATION_SEEN = 0x0002; + /** @hide */ + public static final int REASON_SUB_USAGE_USER_INTERACTION = 0x0003; + /** @hide */ + public static final int REASON_SUB_USAGE_MOVE_TO_FOREGROUND = 0x0004; + /** @hide */ + public static final int REASON_SUB_USAGE_MOVE_TO_BACKGROUND = 0x0005; + /** @hide */ + public static final int REASON_SUB_USAGE_SYSTEM_UPDATE = 0x0006; + /** @hide */ + public static final int REASON_SUB_USAGE_ACTIVE_TIMEOUT = 0x0007; + /** @hide */ + public static final int REASON_SUB_USAGE_SYNC_ADAPTER = 0x0008; /** @hide */ @IntDef(flag = false, prefix = { "STANDBY_BUCKET_" }, value = { @@ -388,8 +402,16 @@ public final class UsageStatsManager { @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public Map<String, Integer> getAppStandbyBuckets() { try { - return (Map<String, Integer>) mService.getAppStandbyBuckets( + final ParceledListSlice<AppStandbyInfo> slice = mService.getAppStandbyBuckets( mContext.getOpPackageName(), mContext.getUserId()); + final List<AppStandbyInfo> bucketList = slice.getList(); + final ArrayMap<String, Integer> bucketMap = new ArrayMap<>(); + final int n = bucketList.size(); + for (int i = 0; i < n; i++) { + final AppStandbyInfo bucketInfo = bucketList.get(i); + bucketMap.put(bucketInfo.mPackageName, bucketInfo.mStandbyBucket); + } + return bucketMap; } catch (RemoteException e) { } return Collections.EMPTY_MAP; @@ -404,12 +426,69 @@ public final class UsageStatsManager { @SystemApi @RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE) public void setAppStandbyBuckets(Map<String, Integer> appBuckets) { + if (appBuckets == null) { + return; + } + final List<AppStandbyInfo> bucketInfoList = new ArrayList<>(appBuckets.size()); + for (Map.Entry<String, Integer> bucketEntry : appBuckets.entrySet()) { + bucketInfoList.add(new AppStandbyInfo(bucketEntry.getKey(), bucketEntry.getValue())); + } + final ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); try { - mService.setAppStandbyBuckets(appBuckets, mContext.getUserId()); + mService.setAppStandbyBuckets(slice, mContext.getUserId()); } catch (RemoteException e) { } } + /** @hide */ + public static String reasonToString(int standbyReason) { + StringBuilder sb = new StringBuilder(); + switch (standbyReason & REASON_MAIN_MASK) { + case REASON_MAIN_DEFAULT: + sb.append("d"); + break; + case REASON_MAIN_FORCED: + sb.append("f"); + break; + case REASON_MAIN_PREDICTED: + sb.append("p"); + break; + case REASON_MAIN_TIMEOUT: + sb.append("t"); + break; + case REASON_MAIN_USAGE: + sb.append("u-"); + switch (standbyReason & REASON_SUB_MASK) { + case REASON_SUB_USAGE_SYSTEM_INTERACTION: + sb.append("si"); + break; + case REASON_SUB_USAGE_NOTIFICATION_SEEN: + sb.append("ns"); + break; + case REASON_SUB_USAGE_USER_INTERACTION: + sb.append("ui"); + break; + case REASON_SUB_USAGE_MOVE_TO_FOREGROUND: + sb.append("mf"); + break; + case REASON_SUB_USAGE_MOVE_TO_BACKGROUND: + sb.append("mb"); + break; + case REASON_SUB_USAGE_SYSTEM_UPDATE: + sb.append("su"); + break; + case REASON_SUB_USAGE_ACTIVE_TIMEOUT: + sb.append("at"); + break; + case REASON_SUB_USAGE_SYNC_ADAPTER: + sb.append("sa"); + break; + } + break; + } + return sb.toString(); + } + /** * {@hide} * Temporarily whitelist the specified app for a short duration. This is to allow an app diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java index 5d6a989ffef8..b62b1ee0492b 100644 --- a/core/java/android/app/usage/UsageStatsManagerInternal.java +++ b/core/java/android/app/usage/UsageStatsManagerInternal.java @@ -139,7 +139,7 @@ public abstract class UsageStatsManagerInternal { /** Callback to inform listeners that the idle state has changed to a new bucket. */ public abstract void onAppIdleStateChanged(String packageName, @UserIdInt int userId, - boolean idle, int bucket); + boolean idle, int bucket, int reason); /** * Callback to inform listeners that the parole state has changed. This means apps are diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java index 0a0d21498032..605dbd21993f 100644 --- a/core/java/android/bluetooth/BluetoothUuid.java +++ b/core/java/android/bluetooth/BluetoothUuid.java @@ -79,9 +79,8 @@ public final class BluetoothUuid { ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB"); public static final ParcelUuid SAP = ParcelUuid.fromString("0000112D-0000-1000-8000-00805F9B34FB"); - /* TODO: b/69623109 update this value. It will change to 16bit UUID!! */ public static final ParcelUuid HearingAid = - ParcelUuid.fromString("7312C48F-22CC-497F-85FD-A0616A3B9E05"); + ParcelUuid.fromString("0000FDF0-0000-1000-8000-00805f9b34fb"); public static final ParcelUuid BASE_UUID = ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB"); diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index f184380fd36c..e1a00b146576 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3370,7 +3370,11 @@ public abstract class Context { * Use with {@link #getSystemService(String)} to retrieve a {@link * android.app.SearchManager} for handling searches. * - * @see #getSystemService(String) + * <p> + * {@link Configuration#UI_MODE_TYPE_WATCH} does not support + * {@link android.app.SearchManager}. + * + * @see #getSystemService * @see android.app.SearchManager */ public static final String SEARCH_SERVICE = "search"; diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index d0be6c854020..25af1a76700f 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -448,11 +448,17 @@ public class PackageInstaller { /** * Uninstall the given package, removing it completely from the device. This - * method is only available to the current "installer of record" for the - * package. + * method is available to: + * <ul> + * <li>the current "installer of record" for the package + * <li>the device owner + * <li>the affiliated profile owner + * </ul> * * @param packageName The package to uninstall. * @param statusReceiver Where to deliver the result. + * + * @see android.app.admin.DevicePolicyManager */ @RequiresPermission(anyOf = { Manifest.permission.DELETE_PACKAGES, @@ -480,14 +486,22 @@ public class PackageInstaller { /** * Uninstall the given package with a specific version code, removing it - * completely from the device. This method is only available to the current - * "installer of record" for the package. If the version code of the package + * completely from the device. If the version code of the package * does not match the one passed in the versioned package argument this * method is a no-op. Use {@link PackageManager#VERSION_CODE_HIGHEST} to * uninstall the latest version of the package. + * <p> + * This method is available to: + * <ul> + * <li>the current "installer of record" for the package + * <li>the device owner + * <li>the affiliated profile owner + * </ul> * * @param versionedPackage The versioned package to uninstall. * @param statusReceiver Where to deliver the result. + * + * @see android.app.admin.DevicePolicyManager */ @RequiresPermission(anyOf = { Manifest.permission.DELETE_PACKAGES, @@ -941,9 +955,14 @@ public class PackageInstaller { * Once this method is called, the session is sealed and no additional * mutations may be performed on the session. If the device reboots * before the session has been finalized, you may commit the session again. + * <p> + * If the installer is the device owner or the affiliated profile owner, there will be no + * user intervention. * * @throws SecurityException if streams opened through * {@link #openWrite(String, long, long)} are still open. + * + * @see android.app.admin.DevicePolicyManager */ public void commit(@NonNull IntentSender statusReceiver) { try { diff --git a/core/java/android/content/pm/dex/ArtManagerInternal.java b/core/java/android/content/pm/dex/ArtManagerInternal.java new file mode 100644 index 000000000000..62ab9e02f858 --- /dev/null +++ b/core/java/android/content/pm/dex/ArtManagerInternal.java @@ -0,0 +1,34 @@ +/** + * Copyright 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.content.pm.dex; + +import android.content.pm.ApplicationInfo; + +/** + * Art manager local system service interface. + * + * @hide Only for use within the system server. + */ +public abstract class ArtManagerInternal { + + /** + * Return optimization information about the application {@code info} when + * in executes using the specified {@code abi}. + */ + public abstract PackageOptimizationInfo getPackageOptimizationInfo( + ApplicationInfo info, String abi); +} diff --git a/core/java/android/content/pm/dex/PackageOptimizationInfo.java b/core/java/android/content/pm/dex/PackageOptimizationInfo.java new file mode 100644 index 000000000000..b65045794d35 --- /dev/null +++ b/core/java/android/content/pm/dex/PackageOptimizationInfo.java @@ -0,0 +1,47 @@ +/** + * Copyright 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.content.pm.dex; + +/** + * Encapsulates information about the optimizations performed on a package. + * + * @hide + */ +public class PackageOptimizationInfo { + private final String mCompilationFilter; + private final String mCompilationReason; + + public PackageOptimizationInfo(String compilerFilter, String compilationReason) { + this.mCompilationReason = compilationReason; + this.mCompilationFilter = compilerFilter; + } + + public String getCompilationReason() { + return mCompilationReason; + } + + public String getCompilationFilter() { + return mCompilationFilter; + } + + /** + * Create a default optimization info object for the case when we have no information. + */ + public static PackageOptimizationInfo createWithNoInfo() { + return new PackageOptimizationInfo("no-info", "no-info"); + } +} diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java index eb309799fe0f..93690bf3aef9 100644 --- a/core/java/android/content/res/Configuration.java +++ b/core/java/android/content/res/Configuration.java @@ -18,13 +18,27 @@ package android.content.res; import static android.content.ConfigurationProto.DENSITY_DPI; import static android.content.ConfigurationProto.FONT_SCALE; +import static android.content.ConfigurationProto.HARD_KEYBOARD_HIDDEN; +import static android.content.ConfigurationProto.HDR_COLOR_MODE; +import static android.content.ConfigurationProto.KEYBOARD_HIDDEN; +import static android.content.ConfigurationProto.LOCALES; +import static android.content.ConfigurationProto.MCC; +import static android.content.ConfigurationProto.MNC; +import static android.content.ConfigurationProto.NAVIGATION; +import static android.content.ConfigurationProto.NAVIGATION_HIDDEN; import static android.content.ConfigurationProto.ORIENTATION; import static android.content.ConfigurationProto.SCREEN_HEIGHT_DP; import static android.content.ConfigurationProto.SCREEN_LAYOUT; import static android.content.ConfigurationProto.SCREEN_WIDTH_DP; import static android.content.ConfigurationProto.SMALLEST_SCREEN_WIDTH_DP; +import static android.content.ConfigurationProto.TOUCHSCREEN; import static android.content.ConfigurationProto.UI_MODE; +import static android.content.ConfigurationProto.WIDE_COLOR_GAMUT; import static android.content.ConfigurationProto.WINDOW_CONFIGURATION; +import static android.content.ResourcesConfigurationProto.CONFIGURATION; +import static android.content.ResourcesConfigurationProto.SCREEN_HEIGHT_PX; +import static android.content.ResourcesConfigurationProto.SCREEN_WIDTH_PX; +import static android.content.ResourcesConfigurationProto.SDK_VERSION; import android.annotation.IntDef; import android.annotation.NonNull; @@ -38,6 +52,7 @@ import android.os.LocaleList; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; +import android.util.DisplayMetrics; import android.util.proto.ProtoOutputStream; import android.view.View; @@ -1076,7 +1091,19 @@ public final class Configuration implements Parcelable, Comparable<Configuration public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) { final long token = protoOutputStream.start(fieldId); protoOutputStream.write(FONT_SCALE, fontScale); + protoOutputStream.write(MCC, mcc); + protoOutputStream.write(MNC, mnc); + mLocaleList.writeToProto(protoOutputStream, LOCALES); protoOutputStream.write(SCREEN_LAYOUT, screenLayout); + protoOutputStream.write(HDR_COLOR_MODE, + (colorMode & Configuration.COLOR_MODE_HDR_MASK) >> COLOR_MODE_HDR_SHIFT); + protoOutputStream.write(WIDE_COLOR_GAMUT, + colorMode & Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_MASK); + protoOutputStream.write(TOUCHSCREEN, touchscreen); + protoOutputStream.write(KEYBOARD_HIDDEN, keyboardHidden); + protoOutputStream.write(HARD_KEYBOARD_HIDDEN, hardKeyboardHidden); + protoOutputStream.write(NAVIGATION, navigation); + protoOutputStream.write(NAVIGATION_HIDDEN, navigationHidden); protoOutputStream.write(ORIENTATION, orientation); protoOutputStream.write(UI_MODE, uiMode); protoOutputStream.write(SCREEN_WIDTH_DP, screenWidthDp); @@ -1088,6 +1115,36 @@ public final class Configuration implements Parcelable, Comparable<Configuration } /** + * Write full {@link android.content.ResourcesConfigurationProto} to protocol buffer output + * stream. + * + * @param protoOutputStream Stream to write the Configuration object to. + * @param fieldId Field Id of the Configuration as defined in the parent message + * @param metrics Current display information + * @hide + */ + public void writeResConfigToProto(ProtoOutputStream protoOutputStream, long fieldId, + DisplayMetrics metrics) { + final int width, height; + if (metrics.widthPixels >= metrics.heightPixels) { + width = metrics.widthPixels; + height = metrics.heightPixels; + } else { + //noinspection SuspiciousNameCombination + width = metrics.heightPixels; + //noinspection SuspiciousNameCombination + height = metrics.widthPixels; + } + + final long token = protoOutputStream.start(fieldId); + writeToProto(protoOutputStream, CONFIGURATION); + protoOutputStream.write(SDK_VERSION, Build.VERSION.RESOURCES_SDK_INT); + protoOutputStream.write(SCREEN_WIDTH_PX, width); + protoOutputStream.write(SCREEN_HEIGHT_PX, height); + protoOutputStream.end(token); + } + + /** * Convert the UI mode to a human readable format. * @hide */ @@ -1925,11 +1982,21 @@ public final class Configuration implements Parcelable, Comparable<Configuration /** * Returns a string representation of the configuration that can be parsed - * by build tools (like AAPT). + * by build tools (like AAPT), without display metrics included * * @hide */ public static String resourceQualifierString(Configuration config) { + return resourceQualifierString(config, null); + } + + /** + * Returns a string representation of the configuration that can be parsed + * by build tools (like AAPT). + * + * @hide + */ + public static String resourceQualifierString(Configuration config, DisplayMetrics metrics) { ArrayList<String> parts = new ArrayList<String>(); if (config.mcc != 0) { @@ -2177,6 +2244,20 @@ public final class Configuration implements Parcelable, Comparable<Configuration break; } + if (metrics != null) { + final int width, height; + if (metrics.widthPixels >= metrics.heightPixels) { + width = metrics.widthPixels; + height = metrics.heightPixels; + } else { + //noinspection SuspiciousNameCombination + width = metrics.heightPixels; + //noinspection SuspiciousNameCombination + height = metrics.widthPixels; + } + parts.add(width + "x" + height); + } + parts.add("v" + Build.VERSION.RESOURCES_SDK_INT); return TextUtils.join("-", parts); } diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index e558b7e29a20..52aefcc48304 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -2646,6 +2646,10 @@ public abstract class CameraMetadata<TKey> { /** * <p>Include OIS data in the capture result.</p> + * <p>{@link CaptureResult#STATISTICS_OIS_SAMPLES android.statistics.oisSamples} provides OIS sample data in the + * output result metadata.</p> + * + * @see CaptureResult#STATISTICS_OIS_SAMPLES * @see CaptureRequest#STATISTICS_OIS_DATA_MODE */ public static final int STATISTICS_OIS_DATA_MODE_ON = 1; diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 3ed533a4efcb..ada7ebf0f5da 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -24,6 +24,7 @@ import android.hardware.camera2.impl.SyntheticKey; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.utils.HashCodeHelpers; import android.hardware.camera2.utils.TypeReference; +import android.hardware.camera2.utils.SurfaceUtils; import android.os.Parcel; import android.os.Parcelable; import android.util.ArraySet; @@ -643,6 +644,30 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> break; } } + + if (!streamFound) { + // Check if we can match s by native object ID + long reqSurfaceId = SurfaceUtils.getSurfaceId(s); + for (int j = 0; j < configuredOutputs.size(); ++j) { + int streamId = configuredOutputs.keyAt(j); + OutputConfiguration outConfig = configuredOutputs.valueAt(j); + int surfaceId = 0; + for (Surface outSurface : outConfig.getSurfaces()) { + if (reqSurfaceId == SurfaceUtils.getSurfaceId(outSurface)) { + streamFound = true; + mStreamIdxArray[i] = streamId; + mSurfaceIdxArray[i] = surfaceId; + i++; + break; + } + surfaceId++; + } + if (streamFound) { + break; + } + } + } + if (!streamFound) { mStreamIdxArray = null; mSurfaceIdxArray = null; @@ -2759,9 +2784,6 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> /** * <p>A control for selecting whether OIS position information is included in output * result metadata.</p> - * <p>When set to ON, - * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}, android.statistics.oisShiftPixelX, - * and android.statistics.oisShiftPixelY provide OIS data in the output result metadata.</p> * <p><b>Possible values:</b> * <ul> * <li>{@link #STATISTICS_OIS_DATA_MODE_OFF OFF}</li> @@ -2770,8 +2792,6 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * <p><b>Available values for this device:</b><br> * android.Statistics.info.availableOisDataModes</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> - * - * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS * @see #STATISTICS_OIS_DATA_MODE_OFF * @see #STATISTICS_OIS_DATA_MODE_ON */ diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index c332d3028aed..8c2f8c1e8553 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -3911,9 +3911,6 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { /** * <p>A control for selecting whether OIS position information is included in output * result metadata.</p> - * <p>When set to ON, - * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}, android.statistics.oisShiftPixelX, - * and android.statistics.oisShiftPixelY provide OIS data in the output result metadata.</p> * <p><b>Possible values:</b> * <ul> * <li>{@link #STATISTICS_OIS_DATA_MODE_OFF OFF}</li> @@ -3922,8 +3919,6 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Available values for this device:</b><br> * android.Statistics.info.availableOisDataModes</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> - * - * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS * @see #STATISTICS_OIS_DATA_MODE_OFF * @see #STATISTICS_OIS_DATA_MODE_ON */ @@ -3939,8 +3934,8 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> * * @see CaptureResult#SENSOR_TIMESTAMP + * @hide */ - @PublicKey public static final Key<long[]> STATISTICS_OIS_TIMESTAMPS = new Key<long[]>("android.statistics.oisTimestamps", long[].class); @@ -3948,16 +3943,14 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>An array of shifts of OIS samples, in x direction.</p> * <p>The array contains the amount of shifts in x direction, in pixels, based on OIS samples. * A positive value is a shift from left to right in active array coordinate system. For - * example, if the optical center is (1000, 500) in active array coordinates, an shift of + * example, if the optical center is (1000, 500) in active array coordinates, a shift of * (3, 0) puts the new optical center at (1003, 500).</p> * <p>The number of shifts must match the number of timestamps in - * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}.</p> + * android.statistics.oisTimestamps.</p> * <p><b>Units</b>: Pixels in active array.</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> - * - * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS + * @hide */ - @PublicKey public static final Key<float[]> STATISTICS_OIS_X_SHIFTS = new Key<float[]>("android.statistics.oisXShifts", float[].class); @@ -3965,20 +3958,35 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * <p>An array of shifts of OIS samples, in y direction.</p> * <p>The array contains the amount of shifts in y direction, in pixels, based on OIS samples. * A positive value is a shift from top to bottom in active array coordinate system. For - * example, if the optical center is (1000, 500) in active array coordinates, an shift of + * example, if the optical center is (1000, 500) in active array coordinates, a shift of * (0, 5) puts the new optical center at (1000, 505).</p> * <p>The number of shifts must match the number of timestamps in - * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}.</p> + * android.statistics.oisTimestamps.</p> * <p><b>Units</b>: Pixels in active array.</p> * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> - * - * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS + * @hide */ - @PublicKey public static final Key<float[]> STATISTICS_OIS_Y_SHIFTS = new Key<float[]>("android.statistics.oisYShifts", float[].class); /** + * <p>An array of OIS samples.</p> + * <p>Each OIS sample contains the timestamp and the amount of shifts in x and y direction, + * in pixels, of the OIS sample.</p> + * <p>A positive value for a shift in x direction is a shift from left to right in active array + * coordinate system. For example, if the optical center is (1000, 500) in active array + * coordinates, a shift of (3, 0) puts the new optical center at (1003, 500).</p> + * <p>A positive value for a shift in y direction is a shift from top to bottom in active array + * coordinate system. For example, if the optical center is (1000, 500) in active array + * coordinates, a shift of (0, 5) puts the new optical center at (1000, 505).</p> + * <p><b>Optional</b> - This value may be {@code null} on some devices.</p> + */ + @PublicKey + @SyntheticKey + public static final Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES = + new Key<android.hardware.camera2.params.OisSample[]>("android.statistics.oisSamples", android.hardware.camera2.params.OisSample[].class); + + /** * <p>Tonemapping / contrast / gamma curve for the blue * channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is * CONTRAST_CURVE.</p> diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index ebe2fa17a7c2..e4b1339fd663 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -22,12 +22,12 @@ import android.graphics.Rect; import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; -import android.hardware.camera2.marshal.Marshaler; import android.hardware.camera2.marshal.MarshalQueryable; import android.hardware.camera2.marshal.MarshalRegistry; +import android.hardware.camera2.marshal.Marshaler; import android.hardware.camera2.marshal.impl.MarshalQueryableArray; -import android.hardware.camera2.marshal.impl.MarshalQueryableBoolean; import android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern; +import android.hardware.camera2.marshal.impl.MarshalQueryableBoolean; import android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform; import android.hardware.camera2.marshal.impl.MarshalQueryableEnum; import android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration; @@ -48,6 +48,7 @@ import android.hardware.camera2.marshal.impl.MarshalQueryableString; import android.hardware.camera2.params.Face; import android.hardware.camera2.params.HighSpeedVideoConfiguration; import android.hardware.camera2.params.LensShadingMap; +import android.hardware.camera2.params.OisSample; import android.hardware.camera2.params.ReprocessFormatsMap; import android.hardware.camera2.params.StreamConfiguration; import android.hardware.camera2.params.StreamConfigurationDuration; @@ -56,8 +57,8 @@ import android.hardware.camera2.params.TonemapCurve; import android.hardware.camera2.utils.TypeReference; import android.location.Location; import android.location.LocationManager; -import android.os.Parcelable; import android.os.Parcel; +import android.os.Parcelable; import android.os.ServiceSpecificException; import android.util.Log; import android.util.Size; @@ -614,6 +615,15 @@ public class CameraMetadataNative implements Parcelable { return (T) metadata.getLensShadingMap(); } }); + sGetCommandMap.put( + CaptureResult.STATISTICS_OIS_SAMPLES.getNativeKey(), + new GetCommand() { + @Override + @SuppressWarnings("unchecked") + public <T> T getValue(CameraMetadataNative metadata, Key<T> key) { + return (T) metadata.getOisSamples(); + } + }); } private int[] getAvailableFormats() { @@ -962,6 +972,50 @@ public class CameraMetadataNative implements Parcelable { return tc; } + private OisSample[] getOisSamples() { + long[] timestamps = getBase(CaptureResult.STATISTICS_OIS_TIMESTAMPS); + float[] xShifts = getBase(CaptureResult.STATISTICS_OIS_X_SHIFTS); + float[] yShifts = getBase(CaptureResult.STATISTICS_OIS_Y_SHIFTS); + + if (timestamps == null) { + if (xShifts != null) { + throw new AssertionError("timestamps is null but xShifts is not"); + } + + if (yShifts != null) { + throw new AssertionError("timestamps is null but yShifts is not"); + } + + return null; + } + + if (xShifts == null) { + throw new AssertionError("timestamps is not null but xShifts is"); + } + + if (yShifts == null) { + throw new AssertionError("timestamps is not null but yShifts is"); + } + + if (xShifts.length != timestamps.length) { + throw new AssertionError(String.format( + "timestamps has %d entries but xShifts has %d", timestamps.length, + xShifts.length)); + } + + if (yShifts.length != timestamps.length) { + throw new AssertionError(String.format( + "timestamps has %d entries but yShifts has %d", timestamps.length, + yShifts.length)); + } + + OisSample[] samples = new OisSample[timestamps.length]; + for (int i = 0; i < timestamps.length; i++) { + samples[i] = new OisSample(timestamps[i], xShifts[i], yShifts[i]); + } + return samples; + } + private <T> void setBase(CameraCharacteristics.Key<T> key, T value) { setBase(key.getNativeKey(), value); } diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java index e7f2134de0ee..71a361bd00c6 100644 --- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java +++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java @@ -730,7 +730,7 @@ public class LegacyCameraDevice implements AutoCloseable { LegacyExceptionUtils.throwOnError(nativeSetSurfaceDimens(surface, width, height)); } - static long getSurfaceId(Surface surface) throws BufferQueueAbandonedException { + public static long getSurfaceId(Surface surface) throws BufferQueueAbandonedException { checkNotNull(surface); try { return nativeGetSurfaceId(surface); diff --git a/core/java/android/hardware/camera2/params/OisSample.java b/core/java/android/hardware/camera2/params/OisSample.java new file mode 100644 index 000000000000..7ebaae35f3bf --- /dev/null +++ b/core/java/android/hardware/camera2/params/OisSample.java @@ -0,0 +1,137 @@ +/* + * 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.hardware.camera2.params; + +import android.hardware.camera2.CaptureResult; +import android.hardware.camera2.utils.HashCodeHelpers; + +import com.android.internal.util.Preconditions; + +/** + * Immutable class to store an + * {@link CaptureResult#STATISTICS_OIS_SAMPLES optical image stabilization sample}. + */ +public final class OisSample { + /** + * Create a new {@link OisSample}. + * + * <p>{@link OisSample} contains the timestamp and the amount of shifts in x and y direction, + * in pixels, of the OIS sample. + * + * <p>A positive value for a shift in x direction is a shift from left to right in active array + * coordinate system. For example, if the optical center is {@code (1000, 500)} in active array + * coordinates, a shift of {@code (3, 0)} puts the new optical center at {@code (1003, 500)}. + * </p> + * + * <p>A positive value for a shift in y direction is a shift from top to bottom in active array + * coordinate system. For example, if the optical center is {@code (1000, 500)} in active array + * coordinates, a shift of {@code (0, 5)} puts the new optical center at {@code (1000, 505)}. + * </p> + * + * <p>xShift and yShift must be finite; NaN and infinity is not allowed.</p> + * + * @param timestamp timestamp of the OIS sample. + * @param xShift shift of the OIS sample in x direction. + * @param yShift shift of the OIS sample in y direction. + * + * @throws IllegalArgumentException if xShift or yShift is not finite + */ + public OisSample(final long timestamp, final float xShift, final float yShift) { + mTimestampNs = timestamp; + mXShift = Preconditions.checkArgumentFinite(xShift, "xShift must be finite"); + mYShift = Preconditions.checkArgumentFinite(yShift, "yShift must be finite"); + } + + /** + * Get the timestamp in nanoseconds. + * + *<p>The timestamps are in the same timebase as and comparable to + *{@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p> + * + * @return a long value (guaranteed to be finite) + */ + public long getTimestamp() { + return mTimestampNs; + } + + /** + * Get the shift in x direction. + * + * @return a floating point value (guaranteed to be finite) + */ + public float getXshift() { + return mXShift; + } + + /** + * Get the shift in y direction. + * + * @return a floating point value (guaranteed to be finite) + */ + public float getYshift() { + return mYShift; + } + + /** + * Check if this {@link OisSample} is equal to another {@link OisSample}. + * + * <p>Two samples are only equal if and only if each of the OIS information is equal.</p> + * + * @return {@code true} if the objects were equal, {@code false} otherwise + */ + @Override + public boolean equals(final Object obj) { + if (obj == null) { + return false; + } else if (this == obj) { + return true; + } else if (obj instanceof OisSample) { + final OisSample other = (OisSample) obj; + return mTimestampNs == other.mTimestampNs + && mXShift == other.mXShift + && mYShift == other.mYShift; + } + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + int timestampHash = HashCodeHelpers.hashCode(mTimestampNs); + return HashCodeHelpers.hashCode(mXShift, mYShift, timestampHash); + } + + /** + * Return the OisSample as a string representation. + * + * <p> {@code "OisSample{timestamp:%l, shift_x:%f, shift_y:%f}"} represents the OIS sample's + * timestamp, shift in x direction, and shift in y direction.</p> + * + * @return string representation of {@link OisSample} + */ + @Override + public String toString() { + return String.format("OisSample{timestamp:%d, shift_x:%f, shift_y:%f}", mTimestampNs, + mXShift, mYShift); + } + + private final long mTimestampNs; + private final float mXShift; + private final float mYShift; +} diff --git a/core/java/android/hardware/camera2/utils/SurfaceUtils.java b/core/java/android/hardware/camera2/utils/SurfaceUtils.java index e1e1c4fd8018..92478441aea3 100644 --- a/core/java/android/hardware/camera2/utils/SurfaceUtils.java +++ b/core/java/android/hardware/camera2/utils/SurfaceUtils.java @@ -56,6 +56,20 @@ public class SurfaceUtils { } /** + * Get the native object id of a surface. + * + * @param surface The surface to be checked. + * @return the native object id of the surface, 0 if surface is not backed by a native object. + */ + public static long getSurfaceId(Surface surface) { + try { + return LegacyCameraDevice.getSurfaceId(surface); + } catch (BufferQueueAbandonedException e) { + return 0; + } + } + + /** * Get the Surface size. * * @param surface The surface to be queried for size. diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index bd54522719b2..8048099ca73b 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -108,7 +108,9 @@ public class FingerprintManager implements BiometricFingerprintConstants { /** * A wrapper class for the crypto objects supported by FingerprintManager. Currently the * framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects. + * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.CryptoObject} */ + @Deprecated public static final class CryptoObject extends android.hardware.biometrics.CryptoObject { public CryptoObject(@NonNull Signature signature) { super(signature); @@ -150,7 +152,9 @@ public class FingerprintManager implements BiometricFingerprintConstants { /** * Container for callback data from {@link FingerprintManager#authenticate(CryptoObject, * CancellationSignal, int, AuthenticationCallback, Handler)}. + * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationResult} */ + @Deprecated public static class AuthenticationResult { private Fingerprint mFingerprint; private CryptoObject mCryptoObject; @@ -197,7 +201,9 @@ public class FingerprintManager implements BiometricFingerprintConstants { * FingerprintManager#authenticate(CryptoObject, CancellationSignal, * int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to * fingerprint events. + * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback} */ + @Deprecated public static abstract class AuthenticationCallback extends BiometricAuthenticator.AuthenticationCallback { /** diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl index 90e3ffd550b4..381cfb61de88 100644 --- a/core/java/android/net/INetworkStatsService.aidl +++ b/core/java/android/net/INetworkStatsService.aidl @@ -39,9 +39,6 @@ interface INetworkStatsService { */ INetworkStatsSession openSessionForUsageStats(int flags, String callingPackage); - /** Return network layer usage total for traffic that matches template. */ - long getNetworkTotalBytes(in NetworkTemplate template, long start, long end); - /** Return data layer snapshot of UID network usage. */ NetworkStats getDataLayerSnapshotForUid(int uid); /** Return set of any ifaces associated with mobile networks since boot. */ @@ -50,17 +47,11 @@ interface INetworkStatsService { /** Increment data layer count of operations performed for UID and tag. */ void incrementOperationCount(int uid, int tag, int operationCount); - /** Mark given UID as being in foreground for stats purposes. */ - void setUidForeground(int uid, boolean uidForeground); - /** Force update of ifaces. */ void forceUpdateIfaces(in Network[] defaultNetworks); /** Force update of statistics. */ void forceUpdate(); - /** Advise persistance threshold; may be overridden internally. */ - void advisePersistThreshold(long thresholdBytes); - /** Registers a callback on data usage. */ DataUsageRequest registerUsageCallback(String callingPackage, in DataUsageRequest request, in Messenger messenger, in IBinder binder); diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java index 01b2b39213f9..16fb858a58c2 100644 --- a/core/java/android/net/NetworkStats.java +++ b/core/java/android/net/NetworkStats.java @@ -234,7 +234,7 @@ public class NetworkStats implements Parcelable { public NetworkStats(long elapsedRealtime, int initialSize) { this.elapsedRealtime = elapsedRealtime; this.size = 0; - if (initialSize >= 0) { + if (initialSize > 0) { this.capacity = initialSize; this.iface = new String[initialSize]; this.uid = new int[initialSize]; @@ -250,19 +250,7 @@ public class NetworkStats implements Parcelable { this.operations = new long[initialSize]; } else { // Special case for use by NetworkStatsFactory to start out *really* empty. - this.capacity = 0; - this.iface = EmptyArray.STRING; - this.uid = EmptyArray.INT; - this.set = EmptyArray.INT; - this.tag = EmptyArray.INT; - this.metered = EmptyArray.INT; - this.roaming = EmptyArray.INT; - this.defaultNetwork = EmptyArray.INT; - this.rxBytes = EmptyArray.LONG; - this.rxPackets = EmptyArray.LONG; - this.txBytes = EmptyArray.LONG; - this.txPackets = EmptyArray.LONG; - this.operations = EmptyArray.LONG; + clear(); } } @@ -314,6 +302,25 @@ public class NetworkStats implements Parcelable { return clone; } + /** + * Clear all data stored in this object. + */ + public void clear() { + this.capacity = 0; + this.iface = EmptyArray.STRING; + this.uid = EmptyArray.INT; + this.set = EmptyArray.INT; + this.tag = EmptyArray.INT; + this.metered = EmptyArray.INT; + this.roaming = EmptyArray.INT; + this.defaultNetwork = EmptyArray.INT; + this.rxBytes = EmptyArray.LONG; + this.rxPackets = EmptyArray.LONG; + this.txBytes = EmptyArray.LONG; + this.txPackets = EmptyArray.LONG; + this.operations = EmptyArray.LONG; + } + @VisibleForTesting public NetworkStats addIfaceValues( String iface, long rxBytes, long rxPackets, long txBytes, long txPackets) { diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java index 433f9410cc6e..a13ad659e767 100644 --- a/core/java/android/net/NetworkStatsHistory.java +++ b/core/java/android/net/NetworkStatsHistory.java @@ -39,6 +39,8 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.util.IndentingPrintWriter; +import libcore.util.EmptyArray; + import java.io.CharArrayWriter; import java.io.DataInputStream; import java.io.DataOutputStream; @@ -459,6 +461,21 @@ public class NetworkStatsHistory implements Parcelable { } /** + * Clear all data stored in this object. + */ + public void clear() { + bucketStart = EmptyArray.LONG; + if (activeTime != null) activeTime = EmptyArray.LONG; + if (rxBytes != null) rxBytes = EmptyArray.LONG; + if (rxPackets != null) rxPackets = EmptyArray.LONG; + if (txBytes != null) txBytes = EmptyArray.LONG; + if (txPackets != null) txPackets = EmptyArray.LONG; + if (operations != null) operations = EmptyArray.LONG; + bucketCount = 0; + totalBytes = 0; + } + + /** * Remove buckets older than requested cutoff. */ @Deprecated diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java index 8efd39a7a785..74233fd990dc 100644 --- a/core/java/android/net/NetworkTemplate.java +++ b/core/java/android/net/NetworkTemplate.java @@ -23,7 +23,6 @@ import static android.net.ConnectivityManager.TYPE_PROXY; import static android.net.ConnectivityManager.TYPE_WIFI; import static android.net.ConnectivityManager.TYPE_WIFI_P2P; import static android.net.ConnectivityManager.TYPE_WIMAX; -import static android.net.NetworkIdentity.COMBINE_SUBTYPE_ENABLED; import static android.net.NetworkStats.DEFAULT_NETWORK_ALL; import static android.net.NetworkStats.DEFAULT_NETWORK_NO; import static android.net.NetworkStats.DEFAULT_NETWORK_YES; @@ -34,11 +33,6 @@ import static android.net.NetworkStats.ROAMING_ALL; import static android.net.NetworkStats.ROAMING_NO; import static android.net.NetworkStats.ROAMING_YES; import static android.net.wifi.WifiInfo.removeDoubleQuotes; -import static android.telephony.TelephonyManager.NETWORK_CLASS_2_G; -import static android.telephony.TelephonyManager.NETWORK_CLASS_3_G; -import static android.telephony.TelephonyManager.NETWORK_CLASS_4_G; -import static android.telephony.TelephonyManager.NETWORK_CLASS_UNKNOWN; -import static android.telephony.TelephonyManager.getNetworkClass; import android.os.Parcel; import android.os.Parcelable; @@ -55,8 +49,8 @@ import java.util.Arrays; import java.util.Objects; /** - * Template definition used to generically match {@link NetworkIdentity}, - * usually when collecting statistics. + * Predicate used to match {@link NetworkIdentity}, usually when collecting + * statistics. (It should probably have been named {@code NetworkPredicate}.) * * @hide */ @@ -68,13 +62,7 @@ public class NetworkTemplate implements Parcelable { */ private static final int BACKUP_VERSION = 1; - public static final int MATCH_MOBILE_ALL = 1; - /** @deprecated don't use this any more */ - @Deprecated - public static final int MATCH_MOBILE_3G_LOWER = 2; - /** @deprecated don't use this any more */ - @Deprecated - public static final int MATCH_MOBILE_4G = 3; + public static final int MATCH_MOBILE = 1; public static final int MATCH_WIFI = 4; public static final int MATCH_ETHERNET = 5; public static final int MATCH_MOBILE_WILDCARD = 6; @@ -84,9 +72,7 @@ public class NetworkTemplate implements Parcelable { private static boolean isKnownMatchRule(final int rule) { switch (rule) { - case MATCH_MOBILE_ALL: - case MATCH_MOBILE_3G_LOWER: - case MATCH_MOBILE_4G: + case MATCH_MOBILE: case MATCH_WIFI: case MATCH_ETHERNET: case MATCH_MOBILE_WILDCARD: @@ -111,25 +97,7 @@ public class NetworkTemplate implements Parcelable { * the given IMSI. */ public static NetworkTemplate buildTemplateMobileAll(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_ALL, subscriberId, null); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with - * the given IMSI that roughly meet a "3G" definition, or lower. - */ - @Deprecated - public static NetworkTemplate buildTemplateMobile3gLower(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_3G_LOWER, subscriberId, null); - } - - /** - * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with - * the given IMSI that roughly meet a "4G" definition. - */ - @Deprecated - public static NetworkTemplate buildTemplateMobile4g(String subscriberId) { - return new NetworkTemplate(MATCH_MOBILE_4G, subscriberId, null); + return new NetworkTemplate(MATCH_MOBILE, subscriberId, null); } /** @@ -307,9 +275,7 @@ public class NetworkTemplate implements Parcelable { public boolean isMatchRuleMobile() { switch (mMatchRule) { - case MATCH_MOBILE_3G_LOWER: - case MATCH_MOBILE_4G: - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: case MATCH_MOBILE_WILDCARD: return true; default: @@ -348,12 +314,8 @@ public class NetworkTemplate implements Parcelable { if (!matchesDefaultNetwork(ident)) return false; switch (mMatchRule) { - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: return matchesMobile(ident); - case MATCH_MOBILE_3G_LOWER: - return matchesMobile3gLower(ident); - case MATCH_MOBILE_4G: - return matchesMobile4g(ident); case MATCH_WIFI: return matchesWifi(ident); case MATCH_ETHERNET: @@ -410,43 +372,6 @@ public class NetworkTemplate implements Parcelable { } /** - * Check if mobile network classified 3G or lower with matching IMSI. - */ - @Deprecated - private boolean matchesMobile3gLower(NetworkIdentity ident) { - ensureSubtypeAvailable(); - if (ident.mType == TYPE_WIMAX) { - return false; - } else if (matchesMobile(ident)) { - switch (getNetworkClass(ident.mSubType)) { - case NETWORK_CLASS_UNKNOWN: - case NETWORK_CLASS_2_G: - case NETWORK_CLASS_3_G: - return true; - } - } - return false; - } - - /** - * Check if mobile network classified 4G with matching IMSI. - */ - @Deprecated - private boolean matchesMobile4g(NetworkIdentity ident) { - ensureSubtypeAvailable(); - if (ident.mType == TYPE_WIMAX) { - // TODO: consider matching against WiMAX subscriber identity - return true; - } else if (matchesMobile(ident)) { - switch (getNetworkClass(ident.mSubType)) { - case NETWORK_CLASS_4_G: - return true; - } - } - return false; - } - - /** * Check if matches Wi-Fi network template. */ private boolean matchesWifi(NetworkIdentity ident) { @@ -506,12 +431,8 @@ public class NetworkTemplate implements Parcelable { private static String getMatchRuleName(int matchRule) { switch (matchRule) { - case MATCH_MOBILE_3G_LOWER: - return "MOBILE_3G_LOWER"; - case MATCH_MOBILE_4G: - return "MOBILE_4G"; - case MATCH_MOBILE_ALL: - return "MOBILE_ALL"; + case MATCH_MOBILE: + return "MOBILE"; case MATCH_WIFI: return "WIFI"; case MATCH_ETHERNET: @@ -529,13 +450,6 @@ public class NetworkTemplate implements Parcelable { } } - private static void ensureSubtypeAvailable() { - if (COMBINE_SUBTYPE_ENABLED) { - throw new IllegalArgumentException( - "Unable to enforce 3G_LOWER template on combined data."); - } - } - /** * Examine the given template and normalize if it refers to a "merged" * mobile subscriber. We pick the "lowest" merged subscriber as the primary diff --git a/core/java/android/net/metrics/NetworkMetrics.java b/core/java/android/net/metrics/NetworkMetrics.java index 2425bba9e668..66d92c48087c 100644 --- a/core/java/android/net/metrics/NetworkMetrics.java +++ b/core/java/android/net/metrics/NetworkMetrics.java @@ -98,6 +98,9 @@ public class NetworkMetrics { /** Accumulate a single netd sock_diag poll result reported by netd. */ public void addTcpStatsResult(int sent, int lost, int rttUs, int sentAckDiffMs) { + if (pendingSummary == null) { + pendingSummary = new Summary(netId, transports); + } pendingSummary.tcpLossRate.count(lost, sent); pendingSummary.roundTripTimeUs.count(rttUs); pendingSummary.sentAckTimeDiffenceMs.count(sentAckDiffMs); diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index dc46b7358072..5e9d39ce6af0 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -447,6 +447,11 @@ public abstract class BatteryStats implements Parcelable { */ public abstract LongCounter getScanTimeCounter(); + /** + * @return a non-null {@link LongCounter} representing time spent (milliseconds) in the + * sleep state. + */ + public abstract LongCounter getSleepTimeCounter(); /** * @return a non-null {@link LongCounter} representing time spent (milliseconds) in the @@ -3408,8 +3413,6 @@ public abstract class BatteryStats implements Parcelable { for (LongCounter txState : counter.getTxTimeCounters()) { totalTxTimeMs += txState.getCountLocked(which); } - final long sleepTimeMs - = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs); if (controllerName.equals(WIFI_CONTROLLER_NAME)) { final long scanTimeMs = counter.getScanTimeCounter().getCountLocked(which); @@ -3423,18 +3426,34 @@ public abstract class BatteryStats implements Parcelable { sb.append(formatRatioLocked(scanTimeMs, totalControllerActivityTimeMs)); sb.append(")"); pw.println(sb.toString()); + + final long sleepTimeMs + = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs); + sb.setLength(0); + sb.append(prefix); + sb.append(" "); + sb.append(controllerName); + sb.append(" Sleep time: "); + formatTimeMs(sb, sleepTimeMs); + sb.append("("); + sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs)); + sb.append(")"); + pw.println(sb.toString()); } - sb.setLength(0); - sb.append(prefix); - sb.append(" "); - sb.append(controllerName); - sb.append(" Sleep time: "); - formatTimeMs(sb, sleepTimeMs); - sb.append("("); - sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs)); - sb.append(")"); - pw.println(sb.toString()); + if (controllerName.equals(CELLULAR_CONTROLLER_NAME)) { + final long sleepTimeMs = counter.getSleepTimeCounter().getCountLocked(which); + sb.setLength(0); + sb.append(prefix); + sb.append(" "); + sb.append(controllerName); + sb.append(" Sleep time: "); + formatTimeMs(sb, sleepTimeMs); + sb.append("("); + sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs)); + sb.append(")"); + pw.println(sb.toString()); + } sb.setLength(0); sb.append(prefix); diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index fc88e9006639..0417ded829e8 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -683,6 +683,23 @@ public class Handler { return enqueueMessage(queue, msg, 0); } + /** + * Executes the message synchronously if called on the same thread this handler corresponds to, + * or {@link #sendMessage pushes it to the queue} otherwise + * + * @return Returns true if the message was successfully ran or placed in to the + * message queue. Returns false on failure, usually because the + * looper processing the message queue is exiting. + * @hide + */ + public final boolean executeOrSendMessage(Message msg) { + if (mLooper == Looper.myLooper()) { + dispatchMessage(msg); + return true; + } + return sendMessage(msg); + } + private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { msg.target = this; if (mAsynchronous) { diff --git a/core/java/android/os/HardwarePropertiesManager.java b/core/java/android/os/HardwarePropertiesManager.java index eae7d7014bb1..3d072c5c4f5e 100644 --- a/core/java/android/os/HardwarePropertiesManager.java +++ b/core/java/android/os/HardwarePropertiesManager.java @@ -63,6 +63,8 @@ public class HardwarePropertiesManager { /** * Device temperature types. */ + // These constants are also defined in android/os/enums.proto. + // Any change to the types here or in the thermal hal should be made in the proto as well. /** Temperature of CPUs in Celsius. */ public static final int DEVICE_TEMPERATURE_CPU = Constants.TemperatureType.CPU; diff --git a/core/java/android/os/LocaleList.java b/core/java/android/os/LocaleList.java index ca9cbec99cde..87e1b7d21f53 100644 --- a/core/java/android/os/LocaleList.java +++ b/core/java/android/os/LocaleList.java @@ -20,7 +20,9 @@ import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; +import android.content.LocaleProto; import android.icu.util.ULocale; +import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; @@ -140,6 +142,25 @@ public final class LocaleList implements Parcelable { } /** + * Helper to write LocaleList to a protocol buffer output stream. Assumes the parent + * protobuf has declared the locale as repeated. + * + * @param protoOutputStream Stream to write the locale to. + * @param fieldId Field Id of the Locale as defined in the parent message. + * @hide + */ + public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) { + for (int i = 0; i < mList.length; i++) { + final Locale locale = mList[i]; + final long token = protoOutputStream.start(fieldId); + protoOutputStream.write(LocaleProto.LANGUAGE, locale.getLanguage()); + protoOutputStream.write(LocaleProto.COUNTRY, locale.getCountry()); + protoOutputStream.write(LocaleProto.VARIANT, locale.getVariant()); + protoOutputStream.end(token); + } + } + + /** * Retrieves a String representation of the language tags in this list. */ @NonNull diff --git a/core/java/android/os/StatsLogEventWrapper.java b/core/java/android/os/StatsLogEventWrapper.java index 3e8161f229c4..d4d3dc838d91 100644 --- a/core/java/android/os/StatsLogEventWrapper.java +++ b/core/java/android/os/StatsLogEventWrapper.java @@ -46,16 +46,17 @@ public final class StatsLogEventWrapper implements Parcelable { * @param tag The integer representing the tag for this event. * @param fields The number of fields specified in this event. */ - public StatsLogEventWrapper(int tag, int fields) { + public StatsLogEventWrapper(long elapsedNanos, int tag, int fields) { // Write four bytes from tag, starting with least-significant bit. // For pulled data, this tag number is not really used. We use the same tag number as // pushed ones to be consistent. write4Bytes(STATS_BUFFER_TAG_ID); mStorage.write(EVENT_TYPE_LIST); // This is required to start the log entry. - mStorage.write(fields + 1); // Indicate number of elements in this list. +1 for the tag - mStorage.write(EVENT_TYPE_INT); - // The first element is the real atom tag number - write4Bytes(tag); + mStorage.write(fields + 2); // Indicate number of elements in this list. +1 for the tag + // The first element is the elapsed realtime. + writeLong(elapsedNanos); + // The second element is the real atom tag number + writeInt(tag); } /** diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index f90604abf293..76c13be3c1b2 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -636,7 +636,7 @@ public final class StrictMode { * executor every violation. */ public Builder penaltyListener( - @NonNull OnThreadViolationListener listener, @NonNull Executor executor) { + @NonNull Executor executor, @NonNull OnThreadViolationListener listener) { if (executor == null) { throw new NullPointerException("executor must not be null"); } @@ -645,6 +645,12 @@ public final class StrictMode { return this; } + /** @removed */ + public Builder penaltyListener( + @NonNull OnThreadViolationListener listener, @NonNull Executor executor) { + return penaltyListener(executor, listener); + } + private Builder enable(int bit) { mMask |= bit; return this; @@ -971,7 +977,7 @@ public final class StrictMode { * Call #{@link OnVmViolationListener#onVmViolation(Violation)} on every violation. */ public Builder penaltyListener( - @NonNull OnVmViolationListener listener, @NonNull Executor executor) { + @NonNull Executor executor, @NonNull OnVmViolationListener listener) { if (executor == null) { throw new NullPointerException("executor must not be null"); } @@ -980,6 +986,12 @@ public final class StrictMode { return this; } + /** @removed */ + public Builder penaltyListener( + @NonNull OnVmViolationListener listener, @NonNull Executor executor) { + return penaltyListener(executor, listener); + } + private Builder enable(int bit) { mMask |= bit; return this; diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index c6c8d9d69bfb..60df467bc20f 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -223,13 +223,14 @@ public class CallLog { /** Call was WIFI call. */ public static final int FEATURES_WIFI = 1 << 3; + /** Call was on RTT at some point */ + public static final int FEATURES_RTT = 1 << 4; + /** * Indicates the call underwent Assisted Dialing. + * @hide */ - public static final int FEATURES_ASSISTED_DIALING_USED = 1 << 4; - - /** Call was on RTT at some point */ - public static final int FEATURES_RTT = 1 << 5; + public static final Integer FEATURES_ASSISTED_DIALING_USED = 0x10; /** * The phone number as the user entered it. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 2ec9009ee549..cb38c0fc55a3 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7103,6 +7103,14 @@ public final class Settings { SHOW_ROTATION_SUGGESTIONS_ENABLED; /** + * The number of accepted rotation suggestions. Used to determine if the user has been + * introduced to rotation suggestions. + * @hide + */ + public static final String NUM_ROTATION_SUGGESTIONS_ACCEPTED = + "num_rotation_suggestions_accepted"; + + /** * Read only list of the service components that the current user has explicitly allowed to * see and assist with all of the user's notifications. * @@ -8827,6 +8835,14 @@ public final class Settings { */ public static final String NETWORK_SCORER_APP = "network_scorer_app"; + /** + * Whether night display forced auto mode is available. + * 0 = unavailable, 1 = available. + * @hide + */ + public static final String NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE = + "night_display_forced_auto_mode_available"; + /** * If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment * to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been @@ -9077,14 +9093,28 @@ public final class Settings { */ public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled"; - /** - * List of carrier apps which are whitelisted to prompt the user for install when - * a sim card with matching uicc carrier privilege rules is inserted. - * - * The value is "package1;package2;..." - * @hide - */ - public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist"; + /** + * List of certificate (hex string representation of the application's certificate - SHA-1 + * or SHA-256) and carrier app package pairs which are whitelisted to prompt the user for + * install when a sim card with matching UICC carrier privilege rules is inserted. The + * certificate is used as a key, so the certificate encoding here must be the same as the + * certificate encoding used on the SIM. + * + * The value is "cert1:package1;cert2:package2;..." + * @hide + */ + @SystemApi + public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist"; + + /** + * Map of package name to application names. Package names must be lower cased as they are + * used as a key in the map. The application names cannot and will not be localized. + * + * The value is "packageName1:appName1;packageName2:appName2;..." + * @hide + */ + @SystemApi + public static final String CARRIER_APP_NAMES = "carrier_app_names"; /** * USB Mass Storage Enabled @@ -10314,6 +10344,16 @@ public final class Settings { public static final String SYS_VDSO = "sys_vdso"; /** + * UidCpuPower global setting. This links the sys.uidcpupower system property. + * The following values are supported: + * 0 -> /proc/uid_cpupower/* are disabled + * 1 -> /proc/uid_cpupower/* are enabled + * Any other value defaults to enabled. + * @hide + */ + public static final String SYS_UIDCPUPOWER = "sys_uidcpupower"; + + /** * An integer to reduce the FPS by this factor. Only for experiments. Need to reboot the * device for this setting to take full effect. * @@ -10471,7 +10511,8 @@ public final class Settings { /** * TextClassifier specific settings. - * This is encoded as a key=value list, separated by commas. Ex: + * This is encoded as a key=value list, separated by commas. String[] types like + * entity_list_default use ":" as delimiter for values. Ex: * * <pre> * smart_selection_dark_launch (boolean) @@ -10479,6 +10520,10 @@ public final class Settings { * suggest_selection_max_range_length (int) * classify_text_max_range_length (int) * generate_links_max_text_length (int) + * generate_links_log_sample_rate (int) + * entity_list_default (String[]) + * entity_list_not_editable (String[]) + * entity_list_editable (String[]) * </pre> * * <p> diff --git a/core/java/android/se/omapi/ISecureElementListener.aidl b/core/java/android/se/omapi/ISecureElementListener.aidl index 3a99d634e4d1..e0c6e047c3d1 100644 --- a/core/java/android/se/omapi/ISecureElementListener.aidl +++ b/core/java/android/se/omapi/ISecureElementListener.aidl @@ -21,6 +21,7 @@ package android.se.omapi; /** * Interface to receive call-backs when the service is connected. + * @hide */ interface ISecureElementListener { /** diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java index b8937e69c143..d59e86a099b2 100644 --- a/core/java/android/se/omapi/SEService.java +++ b/core/java/android/se/omapi/SEService.java @@ -59,6 +59,21 @@ public class SEService { */ public static final int NO_SUCH_ELEMENT_ERROR = 2; + /** + * Interface to send call-backs to the application when the service is connected. + */ + public abstract static class SecureElementListener extends ISecureElementListener.Stub { + @Override + public IBinder asBinder() { + return this; + } + + /** + * Called by the framework when the service is connected. + */ + public void serviceConnected() {}; + } + private static final String TAG = "OMAPI.SEService"; private final Object mLock = new Object(); @@ -98,9 +113,9 @@ public class SEService { * the context of the calling application. Cannot be * <code>null</code>. * @param listener - * a ISecureElementListener object. Can be <code>null</code>. + * a SecureElementListener object. Can be <code>null</code>. */ - public SEService(Context context, ISecureElementListener listener) { + public SEService(Context context, SecureElementListener listener) { if (context == null) { throw new NullPointerException("context must not be null"); diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index f4dcce1e7e58..1d1333504350 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -75,7 +75,6 @@ public final class KeymasterDefs { public static final int KM_TAG_ALLOW_WHILE_ON_BODY = KM_BOOL | 506; public static final int KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED = KM_BOOL | 507; public static final int KM_TAG_TRUSTED_CONFIRMATION_REQUIRED = KM_BOOL | 508; - public static final int KM_TAG_UNLOCKED_DEVICE_REQUIRED = KM_BOOL | 509; public static final int KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600; public static final int KM_TAG_APPLICATION_ID = KM_BYTES | 601; @@ -217,7 +216,6 @@ public final class KeymasterDefs { public static final int KM_ERROR_MISSING_MIN_MAC_LENGTH = -58; public static final int KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59; public static final int KM_ERROR_CANNOT_ATTEST_IDS = -66; - public static final int KM_ERROR_DEVICE_LOCKED = -72; public static final int KM_ERROR_UNIMPLEMENTED = -100; public static final int KM_ERROR_VERSION_MISMATCH = -101; public static final int KM_ERROR_UNKNOWN_ERROR = -1000; @@ -264,7 +262,6 @@ public final class KeymasterDefs { sErrorCodeToString.put(KM_ERROR_INVALID_MAC_LENGTH, "Invalid MAC or authentication tag length"); sErrorCodeToString.put(KM_ERROR_CANNOT_ATTEST_IDS, "Unable to attest device ids"); - sErrorCodeToString.put(KM_ERROR_DEVICE_LOCKED, "Device locked"); sErrorCodeToString.put(KM_ERROR_UNIMPLEMENTED, "Not implemented"); sErrorCodeToString.put(KM_ERROR_UNKNOWN_ERROR, "Unknown error"); } diff --git a/core/java/android/security/keystore/RecoveryController.java b/core/java/android/security/keystore/RecoveryController.java index 98e6a2099012..4a0de5f2c7f0 100644 --- a/core/java/android/security/keystore/RecoveryController.java +++ b/core/java/android/security/keystore/RecoveryController.java @@ -47,6 +47,7 @@ import java.util.Map; * <p>A recovery agent requires the privileged permission * {@code android.Manifest.permission#RECOVER_KEYSTORE}. * + * @deprecated Use {@link android.security.keystore.recovery.RecoveryController}. * @hide */ public class RecoveryController { @@ -259,7 +260,9 @@ public class RecoveryController { @NonNull String packageName, @Nullable String[] aliases, int status) throws NameNotFoundException, InternalRecoveryServiceException { try { - mBinder.setRecoveryStatus(packageName, aliases, status); + for (String alias : aliases) { + mBinder.setRecoveryStatus(alias, status); + } } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } catch (ServiceSpecificException e) { @@ -288,7 +291,7 @@ public class RecoveryController { // IPC doesn't support generic Maps. @SuppressWarnings("unchecked") Map<String, Integer> result = - (Map<String, Integer>) mBinder.getRecoveryStatus(/*packageName=*/ null); + (Map<String, Integer>) mBinder.getRecoveryStatus(); return result; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); diff --git a/core/java/android/security/keystore/recovery/BadCertificateFormatException.java b/core/java/android/security/keystore/recovery/BadCertificateFormatException.java index e0781a520838..4275c29ee728 100644 --- a/core/java/android/security/keystore/recovery/BadCertificateFormatException.java +++ b/core/java/android/security/keystore/recovery/BadCertificateFormatException.java @@ -17,10 +17,8 @@ package android.security.keystore.recovery; /** - * Error thrown when the recovery agent supplies an invalid X509 certificate. - * + * @deprecated Not used. * @hide - * Deprecated */ public class BadCertificateFormatException extends RecoveryControllerException { public BadCertificateFormatException(String msg) { diff --git a/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java b/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java index 218d26eb565b..e62bfb19e037 100644 --- a/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java +++ b/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java @@ -19,6 +19,7 @@ package android.security.keystore.recovery; import android.annotation.SystemApi; import java.security.GeneralSecurityException; + /** * An error thrown when something went wrong internally in the recovery service. * diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java index df535ed9d3ef..f043d6a11fb8 100644 --- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java +++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java @@ -23,6 +23,7 @@ import android.os.Parcelable; import com.android.internal.util.Preconditions; +import java.security.cert.CertPath; import java.util.List; /** @@ -52,7 +53,8 @@ public final class KeyChainSnapshot implements Parcelable { private int mMaxAttempts = DEFAULT_MAX_ATTEMPTS; private long mCounterId = DEFAULT_COUNTER_ID; private byte[] mServerParams; - private byte[] mPublicKey; + private byte[] mPublicKey; // The raw public key bytes used + private CertPath mCertPath; // The certificate path including the intermediate certificates private List<KeyChainProtectionParams> mKeyChainProtectionParams; private List<WrappedApplicationKey> mEntryRecoveryData; private byte[] mEncryptedRecoveryKeyBlob; @@ -111,14 +113,25 @@ public final class KeyChainSnapshot implements Parcelable { /** * Public key used to encrypt {@code encryptedRecoveryKeyBlob}. * - * See implementation for binary key format + * See implementation for binary key format. + * + * @deprecated Use {@link #getTrustedHardwareCertPath} instead. + * @removed */ - // TODO: document key format. + @Deprecated public @NonNull byte[] getTrustedHardwarePublicKey() { return mPublicKey; } /** + * CertPath containing the public key used to encrypt {@code encryptedRecoveryKeyBlob}. + */ + // TODO: Change to @NonNull + public CertPath getTrustedHardwareCertPath() { + return mCertPath; + } + + /** * UI and key derivation parameters. Note that combination of secrets may be used. */ public @NonNull List<KeyChainProtectionParams> getKeyChainProtectionParams() { @@ -207,13 +220,29 @@ public final class KeyChainSnapshot implements Parcelable { * * @param publicKey The public key * @return This builder. + * @deprecated Use {@link #setTrustedHardwareCertPath} instead. + * @removed */ + @Deprecated public Builder setTrustedHardwarePublicKey(byte[] publicKey) { mInstance.mPublicKey = publicKey; return this; } /** + * Sets CertPath used to validate the trusted hardware public key. The CertPath should + * contain a certificate of the trusted hardware public key and any necessary intermediate + * certificates. + * + * @param certPath The public key + * @return This builder. + */ + public Builder setTrustedHardwareCertPath(CertPath certPath) { + mInstance.mCertPath = certPath; + return this; + } + + /** * Sets UI and key derivation parameters * * @param recoveryMetadata The UI and key derivation parameters @@ -261,7 +290,6 @@ public final class KeyChainSnapshot implements Parcelable { "entryRecoveryData"); Preconditions.checkNotNull(mInstance.mEncryptedRecoveryKeyBlob); Preconditions.checkNotNull(mInstance.mServerParams); - Preconditions.checkNotNull(mInstance.mPublicKey); return mInstance; } } diff --git a/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl b/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl new file mode 100644 index 000000000000..c171a9211a36 --- /dev/null +++ b/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2017 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.security.keystore.recovery; + +/* @hide */ +parcelable RecoveryCertPath; diff --git a/core/java/android/security/keystore/recovery/RecoveryCertPath.java b/core/java/android/security/keystore/recovery/RecoveryCertPath.java new file mode 100644 index 000000000000..1950947d34fd --- /dev/null +++ b/core/java/android/security/keystore/recovery/RecoveryCertPath.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2017 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.security.keystore.recovery; + +import android.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; + +import com.android.internal.util.Preconditions; + +import java.io.ByteArrayInputStream; +import java.security.cert.CertPath; +import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; + +/** + * The certificate path of the recovery service. + * + * @hide + */ +public final class RecoveryCertPath implements Parcelable { + + private static final String CERT_PATH_ENCODING = "PkiPath"; + + private final byte[] mEncodedCertPath; + + /** + * Wraps a {@code CertPath} to create a {@code Parcelable} for Binder calls. + * + * @param certPath The certificate path to be wrapped. + * @throws CertificateException if the given certificate path cannot be encoded properly. + */ + public static RecoveryCertPath createRecoveryCertPath(@NonNull CertPath certPath) + throws CertificateException { + // Perform the encoding here to avoid throwing exceptions in writeToParcel + try { + return new RecoveryCertPath(encodeCertPath(certPath)); + } catch (CertificateEncodingException e) { + throw new CertificateException("Failed to encode the given CertPath", e); + } + } + + /** + * Obtains the {@code CertPath} wrapped in the Parcelable. + * + * @return the wrapped certificate path. + * @throws CertificateException if the wrapped certificate path cannot be decoded properly. + */ + public CertPath getCertPath() throws CertificateException { + // Perform the decoding here to avoid throwing exceptions in createFromParcel + return decodeCertPath(mEncodedCertPath); + } + + private RecoveryCertPath(@NonNull byte[] encodedCertPath) { + mEncodedCertPath = Preconditions.checkNotNull(encodedCertPath); + } + + private RecoveryCertPath(Parcel in) { + mEncodedCertPath = in.createByteArray(); + } + + public static final Parcelable.Creator<RecoveryCertPath> CREATOR = + new Parcelable.Creator<RecoveryCertPath>() { + public RecoveryCertPath createFromParcel(Parcel in) { + return new RecoveryCertPath(in); + } + + public RecoveryCertPath[] newArray(int length) { + return new RecoveryCertPath[length]; + } + }; + + @Override + public void writeToParcel(Parcel out, int flags) { + out.writeByteArray(mEncodedCertPath); + } + + @Override + public int describeContents() { + return 0; + } + + @NonNull + private static byte[] encodeCertPath(@NonNull CertPath certPath) + throws CertificateEncodingException { + Preconditions.checkNotNull(certPath); + return certPath.getEncoded(CERT_PATH_ENCODING); + } + + @NonNull + private static CertPath decodeCertPath(@NonNull byte[] bytes) throws CertificateException { + Preconditions.checkNotNull(bytes); + CertificateFactory certFactory; + try { + certFactory = CertificateFactory.getInstance("X.509"); + } catch (CertificateException e) { + // Should not happen, as X.509 is mandatory for all providers. + throw new RuntimeException(e); + } + return certFactory.generateCertPath(new ByteArrayInputStream(bytes), CERT_PATH_ENCODING); + } +} diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java index 7cd08f76a47e..0683e02b66a7 100644 --- a/core/java/android/security/keystore/recovery/RecoveryController.java +++ b/core/java/android/security/keystore/recovery/RecoveryController.java @@ -46,11 +46,11 @@ import java.util.Map; * <p>The RecoveryController must be paired with a recovery agent. The recovery agent is responsible * for transporting the keychain to remote trusted hardware. This hardware must prevent brute force * attempts against the user's lock screen by limiting the number of allowed guesses (to, e.g., 10). - * After that number of incorrect guesses, the trusted hardware no longer allows access to the + * After that number of incorrect guesses, the trusted hardware no longer allows access to the * key chain. * - * <p>For now only the recovery agent itself is able to create keys, so it is expected that the - * recovery agent is itself the system app. + * <p>Only the recovery agent itself is able to create keys, so it is expected that the recovery + * agent is itself the system app. * * <p>A recovery agent requires the privileged permission * {@code android.Manifest.permission#RECOVER_KEYSTORE}. @@ -65,8 +65,6 @@ public class RecoveryController { public static final int RECOVERY_STATUS_SYNCED = 0; /** Waiting for recovery agent to sync the key. */ public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1; - /** Recovery account is not available. */ - public static final int RECOVERY_STATUS_MISSING_ACCOUNT = 2; /** Key cannot be synced. */ public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3; @@ -177,28 +175,13 @@ public class RecoveryController { } /** - * Deprecated - use getKeyChainSnapshot. - * - * Returns data necessary to store all recoverable keys. Key material is - * encrypted with user secret and recovery public key. - * - * @return Data necessary to recover keystore. - * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery - * service. + * @deprecated Use {@link #getKeyChainSnapshot()} + * @removed */ + @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public @Nullable KeyChainSnapshot getRecoveryData() - throws InternalRecoveryServiceException { - try { - return mBinder.getKeyChainSnapshot(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } catch (ServiceSpecificException e) { - if (e.errorCode == ERROR_NO_SNAPSHOT_PENDING) { - return null; - } - throw wrapUnexpectedServiceSpecificException(e); - } + public @Nullable KeyChainSnapshot getRecoveryData() throws InternalRecoveryServiceException { + return getKeyChainSnapshot(); } /** @@ -270,17 +253,21 @@ public class RecoveryController { } /** - * Gets aliases of recoverable keys for the application. - * - * @param packageName which recoverable keys' aliases will be returned. - * - * @return {@code List} of all aliases. + * @deprecated Use {@link #getAliases()}. + * @removed */ + @Deprecated public List<String> getAliases(@Nullable String packageName) throws InternalRecoveryServiceException { + return getAliases(); + } + + /** + * Returns a list of aliases of keys belonging to the application. + */ + public List<String> getAliases() throws InternalRecoveryServiceException { try { - // TODO: update aidl - Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(packageName); + Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(); return new ArrayList<>(allStatuses.keySet()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -290,24 +277,33 @@ public class RecoveryController { } /** - * Updates recovery status for given key. It is used to notify keystore that key was - * successfully stored on the server or there were an error. Application can check this value - * using {@code getRecoveyStatus}. - * - * @param packageName Application whose recoverable key's status are to be updated. - * @param alias Application-specific key alias. - * @param status Status specific to recovery agent. - * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery - * service. + * @deprecated Use {@link #setRecoveryStatus(String, int)} + * @removed */ + @Deprecated @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) public void setRecoveryStatus( @NonNull String packageName, String alias, int status) throws NameNotFoundException, InternalRecoveryServiceException { + setRecoveryStatus(alias, status); + } + + /** + * Sets the recovery status for given key. It is used to notify the keystore that the key was + * successfully stored on the server or that there was an error. An application can check this + * value using {@link #getRecoveryStatus(String, String)}. + * + * @param alias The alias of the key whose status to set. + * @param status The status of the key. One of {@link #RECOVERY_STATUS_SYNCED}, + * {@link #RECOVERY_STATUS_SYNC_IN_PROGRESS} or {@link #RECOVERY_STATUS_PERMANENT_FAILURE}. + * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery + * service. + */ + @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) + public void setRecoveryStatus(String alias, int status) + throws InternalRecoveryServiceException { try { - // TODO: update aidl - String[] aliases = alias == null ? null : new String[]{alias}; - mBinder.setRecoveryStatus(packageName, aliases, status); + mBinder.setRecoveryStatus(alias, status); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } catch (ServiceSpecificException e) { @@ -316,28 +312,31 @@ public class RecoveryController { } /** - * Returns recovery status for Application's KeyStore key. - * Negative status values are reserved for recovery agent specific codes. List of common codes: + * @deprecated Use {@link #getRecoveryStatus(String)}. + * @removed + */ + @Deprecated + public int getRecoveryStatus(String packageName, String alias) + throws InternalRecoveryServiceException { + return getRecoveryStatus(alias); + } + + /** + * Returns the recovery status for the key with the given {@code alias}. * * <ul> * <li>{@link #RECOVERY_STATUS_SYNCED} * <li>{@link #RECOVERY_STATUS_SYNC_IN_PROGRESS} - * <li>{@link #RECOVERY_STATUS_MISSING_ACCOUNT} * <li>{@link #RECOVERY_STATUS_PERMANENT_FAILURE} * </ul> * - * @param packageName Application whose recoverable key status is returned. - * @param alias Application-specific key alias. - * @return Recovery status. - * @see #setRecoveryStatus + * @see #setRecoveryStatus(String, int) * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery * service. */ - public int getRecoveryStatus(String packageName, String alias) - throws InternalRecoveryServiceException { + public int getRecoveryStatus(String alias) throws InternalRecoveryServiceException { try { - // TODO: update aidl - Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(packageName); + Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(); Integer status = allStatuses.get(alias); if (status == null) { return RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE; @@ -463,35 +462,38 @@ public class RecoveryController { } /** - * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable - * key store. Returns {@link javax.crypto.SecretKey}. + * @deprecated Use {@link #generateKey(String)}. + * @removed + */ + @Deprecated + public Key generateKey(@NonNull String alias, byte[] account) + throws InternalRecoveryServiceException, LockScreenRequiredException { + return generateKey(alias); + } + + /** + * Generates a recoverable key with the given {@code alias}. * - * @param alias The key alias. - * @param account The account associated with the key. * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery * service. - * @throws LockScreenRequiredException if the user has not set a lock screen. This is required - * to generate recoverable keys, as the snapshots are encrypted using a key derived from the - * lock screen. - * @hide + * @throws LockScreenRequiredException if the user does not have a lock screen set. A lock + * screen is required to generate recoverable keys. */ - public Key generateKey(@NonNull String alias, byte[] account) - throws InternalRecoveryServiceException, LockScreenRequiredException { - // TODO: update RecoverySession.recoverKeys + public Key generateKey(@NonNull String alias) throws InternalRecoveryServiceException, + LockScreenRequiredException { try { - String grantAlias = mBinder.generateKey(alias, account); + String grantAlias = mBinder.generateKey(alias); if (grantAlias == null) { - return null; + throw new InternalRecoveryServiceException("null grant alias"); } - Key result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore( + return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore( mKeyStore, grantAlias, KeyStore.UID_SELF); - return result; } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } catch (UnrecoverableKeyException e) { - throw new InternalRecoveryServiceException("Access to newly generated key failed for"); + throw new InternalRecoveryServiceException("Failed to get key from keystore", e); } catch (ServiceSpecificException e) { if (e.errorCode == ERROR_INSECURE_USER) { throw new LockScreenRequiredException(e.getMessage()); @@ -545,6 +547,15 @@ public class RecoveryController { } } + /** + * Returns a new {@link RecoverySession}. + * + * <p>A recovery session is required to restore keys from a remote store. + */ + public RecoverySession createRecoverySession() { + return RecoverySession.newInstance(this); + } + InternalRecoveryServiceException wrapUnexpectedServiceSpecificException( ServiceSpecificException e) { if (e.errorCode == ERROR_SERVICE_INTERNAL_ERROR) { diff --git a/core/java/android/security/keystore/recovery/RecoveryControllerException.java b/core/java/android/security/keystore/recovery/RecoveryControllerException.java index 2733acabbeb6..1af61ceac60a 100644 --- a/core/java/android/security/keystore/recovery/RecoveryControllerException.java +++ b/core/java/android/security/keystore/recovery/RecoveryControllerException.java @@ -19,10 +19,8 @@ package android.security.keystore.recovery; import java.security.GeneralSecurityException; /** - * Base exception for errors thrown by {@link RecoveryController}. - * + * @deprecated Not used. * @hide - * Deprecated */ public abstract class RecoveryControllerException extends GeneralSecurityException { RecoveryControllerException() { } diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java index 4db5d6e0ff15..e42c7666ee10 100644 --- a/core/java/android/security/keystore/recovery/RecoverySession.java +++ b/core/java/android/security/keystore/recovery/RecoverySession.java @@ -24,6 +24,7 @@ import android.os.ServiceSpecificException; import android.util.Log; import java.security.SecureRandom; +import java.security.cert.CertPath; import java.security.cert.CertificateException; import java.util.List; import java.util.Map; @@ -49,7 +50,7 @@ public class RecoverySession implements AutoCloseable { } /** - * A new session, started by {@code recoveryManager}. + * A new session, started by the {@link RecoveryController}. */ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) static RecoverySession newInstance(RecoveryController recoveryController) { @@ -71,39 +72,71 @@ public class RecoverySession implements AutoCloseable { } /** + * @deprecated Use {@link #start(CertPath, byte[], byte[], List)} instead. + * @removed + */ + @Deprecated + @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) + @NonNull public byte[] start( + @NonNull byte[] verifierPublicKey, + @NonNull byte[] vaultParams, + @NonNull byte[] vaultChallenge, + @NonNull List<KeyChainProtectionParams> secrets) + throws CertificateException, InternalRecoveryServiceException { + try { + byte[] recoveryClaim = + mRecoveryController.getBinder().startRecoverySession( + mSessionId, + verifierPublicKey, + vaultParams, + vaultChallenge, + secrets); + return recoveryClaim; + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } catch (ServiceSpecificException e) { + if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT) { + throw new CertificateException(e.getMessage()); + } + throw mRecoveryController.wrapUnexpectedServiceSpecificException(e); + } + } + + /** * Starts a recovery session and returns a blob with proof of recovery secret possession. * The method generates a symmetric key for a session, which trusted remote device can use to * return recovery key. * - * @param verifierPublicKey Encoded {@code java.security.cert.X509Certificate} with Public key - * used to create the recovery blob on the source device. - * Keystore will verify the certificate using root of trust. + * @param verifierCertPath The certificate path used to create the recovery blob on the source + * device. Keystore will verify the certificate path by using the root of trust. * @param vaultParams Must match the parameters in the corresponding field in the recovery blob. * Used to limit number of guesses. * @param vaultChallenge Data passed from server for this recovery session and used to prevent - * replay attacks + * replay attacks. * @param secrets Secrets provided by user, the method only uses type and secret fields. * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is * encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric * key and parameters necessary to identify the counter with the number of failed recovery * attempts. - * @throws CertificateException if the {@code verifierPublicKey} is in an incorrect - * format. + * @throws CertificateException if the {@code verifierCertPath} is invalid. * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery * service. */ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @NonNull public byte[] start( - @NonNull byte[] verifierPublicKey, + @NonNull CertPath verifierCertPath, @NonNull byte[] vaultParams, @NonNull byte[] vaultChallenge, @NonNull List<KeyChainProtectionParams> secrets) throws CertificateException, InternalRecoveryServiceException { + // Wrap the CertPath in a Parcelable so it can be passed via Binder calls. + RecoveryCertPath recoveryCertPath = + RecoveryCertPath.createRecoveryCertPath(verifierCertPath); try { byte[] recoveryClaim = - mRecoveryController.getBinder().startRecoverySession( + mRecoveryController.getBinder().startRecoverySessionWithCertPath( mSessionId, - verifierPublicKey, + recoveryCertPath, vaultParams, vaultChallenge, secrets); diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java index f360bbe99ba1..df9766d84843 100644 --- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java +++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2017 The Android Open Source Project + * 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. @@ -18,7 +18,6 @@ package android.security.keystore.recovery; import android.annotation.NonNull; import android.annotation.SystemApi; - import android.os.Parcel; import android.os.Parcelable; @@ -29,7 +28,6 @@ import com.android.internal.util.Preconditions; * * <ul> * <li>Alias - Keystore alias of the key. - * <li>Account Recovery Agent specific account associated with the key. * <li>Encrypted key material. * </ul> * @@ -43,7 +41,6 @@ public final class WrappedApplicationKey implements Parcelable { private String mAlias; // The only supported format is AES-256 symmetric key. private byte[] mEncryptedKeyMaterial; - private byte[] mAccount; /** * Builder for creating {@link WrappedApplicationKey}. @@ -63,13 +60,11 @@ public final class WrappedApplicationKey implements Parcelable { } /** - * Sets Recovery agent specific account. - * - * @param account The account. - * @return This builder. + * @deprecated AOSP does not associate keys with accounts. This may be done by system app. + * @removed */ + @Deprecated public Builder setAccount(@NonNull byte[] account) { - mInstance.mAccount = account; return this; } @@ -94,15 +89,11 @@ public final class WrappedApplicationKey implements Parcelable { @NonNull public WrappedApplicationKey build() { Preconditions.checkNotNull(mInstance.mAlias); Preconditions.checkNotNull(mInstance.mEncryptedKeyMaterial); - if (mInstance.mAccount == null) { - mInstance.mAccount = new byte[]{}; - } return mInstance; } } - private WrappedApplicationKey() { - } + private WrappedApplicationKey() { } /** * Deprecated - consider using Builder. @@ -127,12 +118,13 @@ public final class WrappedApplicationKey implements Parcelable { return mEncryptedKeyMaterial; } - /** Account, default value is empty array */ + /** + * @deprecated AOSP does not associate keys with accounts. This may be done by system app. + * @removed + */ + @Deprecated public @NonNull byte[] getAccount() { - if (mAccount == null) { - return new byte[]{}; - } - return mAccount; + return new byte[0]; } public static final Parcelable.Creator<WrappedApplicationKey> CREATOR = @@ -150,7 +142,6 @@ public final class WrappedApplicationKey implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeString(mAlias); out.writeByteArray(mEncryptedKeyMaterial); - out.writeByteArray(mAccount); } /** @@ -159,7 +150,6 @@ public final class WrappedApplicationKey implements Parcelable { protected WrappedApplicationKey(Parcel in) { mAlias = in.readString(); mEncryptedKeyMaterial = in.createByteArray(); - mAccount = in.createByteArray(); } @Override diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 99e2c620fa03..2b114d568045 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -665,6 +665,11 @@ public class DreamService extends Service implements Window.Callback { } private void updateDoze() { + if (mWindowToken == null) { + Slog.w(TAG, "Updating doze without a window token."); + return; + } + if (mDozing) { try { mSandman.startDozing(mWindowToken, mDozeScreenState, mDozeScreenBrightness); diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java index 272303099193..f5b7068998d6 100644 --- a/core/java/android/view/DisplayCutout.java +++ b/core/java/android/view/DisplayCutout.java @@ -23,6 +23,8 @@ import static android.view.Surface.ROTATION_180; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; +import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE; + import android.content.res.Resources; import android.graphics.Matrix; import android.graphics.Path; @@ -38,6 +40,7 @@ import android.util.Size; import android.util.proto.ProtoOutputStream; import com.android.internal.R; +import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import java.util.Objects; @@ -73,6 +76,17 @@ public final class DisplayCutout { public static final DisplayCutout NO_CUTOUT = new DisplayCutout(ZERO_RECT, EMPTY_REGION, new Size(0, 0)); + + private static final Object CACHE_LOCK = new Object(); + @GuardedBy("CACHE_LOCK") + private static String sCachedSpec; + @GuardedBy("CACHE_LOCK") + private static int sCachedDisplayWidth; + @GuardedBy("CACHE_LOCK") + private static float sCachedDensity; + @GuardedBy("CACHE_LOCK") + private static DisplayCutout sCachedCutout; + private final Rect mSafeInsets; private final Region mBounds; private final Size mFrameSize; @@ -350,10 +364,26 @@ public final class DisplayCutout { * @hide */ public static DisplayCutout fromResources(Resources res, int displayWidth) { - String spec = res.getString(R.string.config_mainBuiltInDisplayCutout); + return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout), + displayWidth, res.getDisplayMetrics().density); + } + + /** + * Creates an instance according to the supplied {@link android.util.PathParser.PathData} spec. + * + * @hide + */ + @VisibleForTesting(visibility = PRIVATE) + public static DisplayCutout fromSpec(String spec, int displayWidth, float density) { if (TextUtils.isEmpty(spec)) { return null; } + synchronized (CACHE_LOCK) { + if (spec.equals(sCachedSpec) && sCachedDisplayWidth == displayWidth + && sCachedDensity == density) { + return sCachedCutout; + } + } spec = spec.trim(); final boolean inDp = spec.endsWith(DP_MARKER); if (inDp) { @@ -370,12 +400,19 @@ public final class DisplayCutout { final Matrix m = new Matrix(); if (inDp) { - final float dpToPx = res.getDisplayMetrics().density; - m.postScale(dpToPx, dpToPx); + m.postScale(density, density); } m.postTranslate(displayWidth / 2f, 0); p.transform(m); - return fromBounds(p); + + final DisplayCutout result = fromBounds(p); + synchronized (CACHE_LOCK) { + sCachedSpec = spec; + sCachedDisplayWidth = displayWidth; + sCachedDensity = density; + sCachedCutout = result; + } + return result; } /** diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 59472d910c0a..db19681840d7 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -34,6 +34,7 @@ import android.os.Trace; import android.util.Log; import android.view.Surface.OutOfResourcesException; import android.view.View.AttachInfo; +import android.view.animation.AnimationUtils; import com.android.internal.R; import com.android.internal.util.VirtualRefBasePtr; @@ -943,6 +944,107 @@ public final class ThreadedRenderer { } } + /** + * Basic synchronous renderer. Currently only used to render the Magnifier, so use with care. + * TODO: deduplicate against ThreadedRenderer. + * + * @hide + */ + public static class SimpleRenderer { + private final RenderNode mRootNode; + private long mNativeProxy; + private final float mLightY, mLightZ; + private Surface mSurface; + private final FrameInfo mFrameInfo = new FrameInfo(); + + public SimpleRenderer(final Context context, final String name, final Surface surface) { + final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0); + mLightY = a.getDimension(R.styleable.Lighting_lightY, 0); + mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0); + final float lightRadius = a.getDimension(R.styleable.Lighting_lightRadius, 0); + final int ambientShadowAlpha = + (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f); + final int spotShadowAlpha = + (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f); + a.recycle(); + + final long rootNodePtr = nCreateRootRenderNode(); + mRootNode = RenderNode.adopt(rootNodePtr); + mRootNode.setClipToBounds(false); + mNativeProxy = nCreateProxy(true /* translucent */, rootNodePtr); + nSetName(mNativeProxy, name); + + ProcessInitializer.sInstance.init(context, mNativeProxy); + nLoadSystemProperties(mNativeProxy); + + nSetup(mNativeProxy, lightRadius, ambientShadowAlpha, spotShadowAlpha); + + mSurface = surface; + nUpdateSurface(mNativeProxy, surface); + } + + /** + * Set the light center. + */ + public void setLightCenter(final Display display, + final int windowLeft, final int windowTop) { + // Adjust light position for window offsets. + final Point displaySize = new Point(); + display.getRealSize(displaySize); + final float lightX = displaySize.x / 2f - windowLeft; + final float lightY = mLightY - windowTop; + + nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ); + } + + public RenderNode getRootNode() { + return mRootNode; + } + + /** + * Draw the surface. + */ + public void draw(final FrameDrawingCallback callback) { + final long vsync = AnimationUtils.currentAnimationTimeMillis() * 1000000L; + mFrameInfo.setVsync(vsync, vsync); + mFrameInfo.addFlags(1 << 2 /* VSYNC */); + if (callback != null) { + nSetFrameCallback(mNativeProxy, callback); + } + nSyncAndDrawFrame(mNativeProxy, mFrameInfo.mFrameInfo, mFrameInfo.mFrameInfo.length); + } + + /** + * Destroy the renderer. + */ + public void destroy() { + mSurface = null; + nDestroy(mNativeProxy, mRootNode.mNativeRenderNode); + } + + @Override + protected void finalize() throws Throwable { + try { + nDeleteProxy(mNativeProxy); + mNativeProxy = 0; + } finally { + super.finalize(); + } + } + } + + /** + * Interface used to receive callbacks when a frame is being drawn. + */ + public interface FrameDrawingCallback { + /** + * Invoked during a frame drawing. + * + * @param frame The id of the frame being drawn. + */ + void onFrameDraw(long frame); + } + private static class ProcessInitializer { static ProcessInitializer sInstance = new ProcessInitializer(); @@ -1080,6 +1182,7 @@ public final class ThreadedRenderer { private static native void nDrawRenderNode(long nativeProxy, long rootRenderNode); private static native void nSetContentDrawBounds(long nativeProxy, int left, int top, int right, int bottom); + private static native void nSetFrameCallback(long nativeProxy, FrameDrawingCallback callback); private static native long nAddFrameMetricsObserver(long nativeProxy, FrameMetricsObserver observer); private static native void nRemoveFrameMetricsObserver(long nativeProxy, long nativeObserver); diff --git a/core/java/android/view/TouchDelegate.java b/core/java/android/view/TouchDelegate.java index dc50fa1d6036..d6c43e80390f 100644 --- a/core/java/android/view/TouchDelegate.java +++ b/core/java/android/view/TouchDelegate.java @@ -105,11 +105,13 @@ public class TouchDelegate { boolean hit = true; boolean handled = false; - switch (event.getAction()) { + switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mDelegateTargeted = mBounds.contains(x, y); sendToDelegate = mDelegateTargeted; break; + case MotionEvent.ACTION_POINTER_DOWN: + case MotionEvent.ACTION_POINTER_UP: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_MOVE: sendToDelegate = mDelegateTargeted; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 1e4f5686a117..f61b6528bd0e 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -7309,7 +7309,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } private boolean isAccessibilityPane() { - return !TextUtils.isEmpty(mAccessibilityPaneTitle); + return mAccessibilityPaneTitle != null; } /** @@ -8144,7 +8144,12 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** - * Gets the unique identifier of this view in the screen, for autofill purposes. + * Gets the unique, logical identifier of this view in the activity, for autofill purposes. + * + * <p>The autofill id is created on demand, unless it is explicitly set by + * {@link #setAutofillId(AutofillId)}. + * + * <p>See {@link #setAutofillId(AutofillId)} for more info. * * @return The View's autofill id. */ @@ -8158,6 +8163,61 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * Sets the unique, logical identifier of this view in the activity, for autofill purposes. + * + * <p>The autofill id is created on demand, and this method should only be called when a view is + * reused after {@link #dispatchProvideAutofillStructure(ViewStructure, int)} is called, as + * that method creates a snapshot of the view that is passed along to the autofill service. + * + * <p>This method is typically used when view subtrees are recycled to represent different + * content* —in this case, the autofill id can be saved before the view content is swapped + * out, and restored later when it's swapped back in. For example: + * + * <pre> + * EditText reusableView = ...; + * ViewGroup parentView = ...; + * AutofillManager afm = ...; + * + * // Swap out the view and change its contents + * AutofillId oldId = reusableView.getAutofillId(); + * CharSequence oldText = reusableView.getText(); + * parentView.removeView(reusableView); + * AutofillId newId = afm.getNextAutofillId(); + * reusableView.setText("New I am"); + * reusableView.setAutofillId(newId); + * parentView.addView(reusableView); + * + * // Later, swap the old content back in + * parentView.removeView(reusableView); + * reusableView.setAutofillId(oldId); + * reusableView.setText(oldText); + * parentView.addView(reusableView); + * </pre> + * + * @param id an autofill ID that is unique in the {@link android.app.Activity} hosting the view, + * or {@code null} to reset it. Usually it's an id previously allocated to another view (and + * obtained through {@link #getAutofillId()}), or a new value obtained through + * {@link AutofillManager#getNextAutofillId()}. + * + * @throws IllegalStateException if the view is already {@link #isAttachedToWindow() attached to + * a window}. + * + * @throws IllegalArgumentException if the id is an autofill id associated with a virtual view. + */ + public void setAutofillId(@Nullable AutofillId id) { + if (android.view.autofill.Helper.sVerbose) { + Log.v(VIEW_LOG_TAG, "setAutofill(): from " + mAutofillId + " to " + id); + } + if (isAttachedToWindow()) { + throw new IllegalStateException("Cannot set autofill id when view is attached"); + } + if (id.isVirtual()) { + throw new IllegalStateException("Cannot set autofill id assigned to virtual views"); + } + mAutofillId = id; + } + + /** * Describes the autofill type of this view, so an * {@link android.service.autofill.AutofillService} can create the proper {@link AutofillValue} * when autofilling the view. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 810864eaac3c..01d9265cc92c 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -3925,6 +3925,7 @@ public final class ViewRootImpl implements ViewParent, private final static int MSG_DISPATCH_APP_VISIBILITY = 8; private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9; private final static int MSG_DISPATCH_KEY_FROM_IME = 11; + private final static int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12; private final static int MSG_CHECK_FOCUS = 13; private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14; private final static int MSG_DISPATCH_DRAG_EVENT = 15; @@ -3966,6 +3967,8 @@ public final class ViewRootImpl implements ViewParent, return "MSG_DISPATCH_GET_NEW_SURFACE"; case MSG_DISPATCH_KEY_FROM_IME: return "MSG_DISPATCH_KEY_FROM_IME"; + case MSG_DISPATCH_KEY_FROM_AUTOFILL: + return "MSG_DISPATCH_KEY_FROM_AUTOFILL"; case MSG_CHECK_FOCUS: return "MSG_CHECK_FOCUS"; case MSG_CLOSE_SYSTEM_DIALOGS: @@ -4143,6 +4146,15 @@ public final class ViewRootImpl implements ViewParent, } enqueueInputEvent(event, null, QueuedInputEvent.FLAG_DELIVER_POST_IME, true); } break; + case MSG_DISPATCH_KEY_FROM_AUTOFILL: { + if (LOCAL_LOGV) { + Log.v(TAG, "Dispatching key " + msg.obj + " from Autofill to " + mView); + } + KeyEvent event = (KeyEvent) msg.obj; + // send InputEvent to pre IME, set FLAG_FROM_AUTOFILL so the InputEvent + // wont be dropped as app window is not focus. + enqueueInputEvent(event, null, QueuedInputEvent.FLAG_FROM_AUTOFILL, true); + } break; case MSG_CHECK_FOCUS: { InputMethodManager imm = InputMethodManager.peekInstance(); if (imm != null) { @@ -4433,7 +4445,8 @@ public final class ViewRootImpl implements ViewParent, Slog.w(mTag, "Dropping event due to root view being removed: " + q.mEvent); return true; } else if ((!mAttachInfo.mHasWindowFocus - && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) || mStopped + && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER) + && (q.mFlags & QueuedInputEvent.FLAG_FROM_AUTOFILL) == 0) || mStopped || (mIsAmbientMode && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_BUTTON)) || (mPausedForTransition && !isBack(q.mEvent))) { // This is a focus event and the window doesn't currently have input focus or @@ -6805,6 +6818,7 @@ public final class ViewRootImpl implements ViewParent, public static final int FLAG_FINISHED_HANDLED = 1 << 3; public static final int FLAG_RESYNTHESIZED = 1 << 4; public static final int FLAG_UNHANDLED = 1 << 5; + public static final int FLAG_FROM_AUTOFILL = 1 << 6; public QueuedInputEvent mNext; @@ -7262,6 +7276,12 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } + public void dispatchKeyFromAutofill(KeyEvent event) { + Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY_FROM_AUTOFILL, event); + msg.setAsynchronous(true); + mHandler.sendMessage(msg); + } + /** * Reinject unhandled {@link InputEvent}s in order to synthesize fallbacks events. * diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java index 5b1dd5c88cae..af6c701bd5b9 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java @@ -3333,7 +3333,7 @@ public class AccessibilityNodeInfo implements Parcelable { final int actionCount = mActions.size(); int nonStandardActionCount = 0; - int defaultStandardActions = 0; + long defaultStandardActions = 0; for (int i = 0; i < actionCount; i++) { AccessibilityAction action = mActions.get(i); if (isDefaultStandardAction(action)) { @@ -3342,7 +3342,7 @@ public class AccessibilityNodeInfo implements Parcelable { nonStandardActionCount++; } } - parcel.writeInt(defaultStandardActions); + parcel.writeLong(defaultStandardActions); parcel.writeInt(nonStandardActionCount); for (int i = 0; i < actionCount; i++) { @@ -3540,7 +3540,7 @@ public class AccessibilityNodeInfo implements Parcelable { } if (isBitSet(nonDefaultFields, fieldIndex++)) { - final int standardActions = parcel.readInt(); + final long standardActions = parcel.readLong(); addStandardActions(standardActions); final int nonStandardActionCount = parcel.readInt(); for (int i = 0; i < nonStandardActionCount; i++) { @@ -3636,7 +3636,7 @@ public class AccessibilityNodeInfo implements Parcelable { return null; } - private static AccessibilityAction getActionSingletonBySerializationFlag(int flag) { + private static AccessibilityAction getActionSingletonBySerializationFlag(long flag) { final int actions = AccessibilityAction.sStandardActions.size(); for (int i = 0; i < actions; i++) { AccessibilityAction currentAction = AccessibilityAction.sStandardActions.valueAt(i); @@ -3648,10 +3648,10 @@ public class AccessibilityNodeInfo implements Parcelable { return null; } - private void addStandardActions(int serializationIdMask) { - int remainingIds = serializationIdMask; + private void addStandardActions(long serializationIdMask) { + long remainingIds = serializationIdMask; while (remainingIds > 0) { - final int id = 1 << Integer.numberOfTrailingZeros(remainingIds); + final int id = 1 << Long.numberOfTrailingZeros(remainingIds); remainingIds &= ~id; AccessibilityAction action = getActionSingletonBySerializationFlag(id); addAction(action); @@ -4276,7 +4276,7 @@ public class AccessibilityNodeInfo implements Parcelable { private final CharSequence mLabel; /** @hide */ - public int mSerializationFlag = -1; + public long mSerializationFlag = -1L; /** * Creates a new AccessibilityAction. For adding a standard action without a specific label, @@ -4310,7 +4310,7 @@ public class AccessibilityNodeInfo implements Parcelable { private AccessibilityAction(int standardActionId) { this(standardActionId, null); - mSerializationFlag = (int) bitAt(sStandardActions.size()); + mSerializationFlag = bitAt(sStandardActions.size()); sStandardActions.add(this); } diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java index 474db128fcc3..64686dd977a2 100644 --- a/core/java/android/view/animation/Animation.java +++ b/core/java/android/view/animation/Animation.java @@ -206,6 +206,8 @@ public abstract class Animation implements Cloneable { */ private boolean mDetachWallpaper = false; + private boolean mShowWallpaper; + private boolean mMore = true; private boolean mOneMoreTime = true; @@ -253,7 +255,10 @@ public abstract class Animation implements Cloneable { setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0)); - setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); + setDetachWallpaper( + a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false)); + setShowWallpaper( + a.getBoolean(com.android.internal.R.styleable.Animation_showWallpaper, false)); final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0); @@ -661,6 +666,18 @@ public abstract class Animation implements Cloneable { } /** + * If this animation is run as a window animation, this will make the wallpaper visible behind + * the animation. + * + * @param showWallpaper Whether the wallpaper should be shown during the animation. + * @attr ref android.R.styleable#Animation_detachWallpaper + * @hide + */ + public void setShowWallpaper(boolean showWallpaper) { + mShowWallpaper = showWallpaper; + } + + /** * Gets the acceleration curve type for this animation. * * @return the {@link Interpolator} associated to this animation @@ -775,6 +792,16 @@ public abstract class Animation implements Cloneable { } /** + * @return If run as a window animation, returns whether the wallpaper will be shown behind + * during the animation. + * @attr ref android.R.styleable#Animation_showWallpaper + * @hide + */ + public boolean getShowWallpaper() { + return mShowWallpaper; + } + + /** * <p>Indicates whether or not this animation will affect the transformation * matrix. For instance, a fade animation will not affect the matrix whereas * a scale animation will.</p> diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 7792fa640015..a4261ebe16a0 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -46,6 +46,7 @@ import android.util.ArraySet; import android.util.Log; import android.util.SparseArray; import android.view.Choreographer; +import android.view.KeyEvent; import android.view.View; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; @@ -411,6 +412,13 @@ public final class AutofillManager { @Nullable Rect virtualBounds, IAutofillWindowPresenter presenter); /** + * Dispatch unhandled keyevent from Autofill window + * @param anchor The real view the UI needs to anchor to. + * @param keyEvent Unhandled KeyEvent from autofill window. + */ + void autofillClientDispatchUnhandledKey(@NonNull View anchor, @NonNull KeyEvent keyEvent); + + /** * Request hiding the autofill UI. * * @return Whether the UI was hidden. @@ -490,7 +498,17 @@ public final class AutofillManager { /** * @return Whether compatibility mode is enabled. */ - boolean autofillIsCompatibilityModeEnabled(); + boolean autofillClientIsCompatibilityModeEnabled(); + + /** + * Gets the next unique autofill ID. + * + * <p>Typically used to manage views whose content is recycled - see + * {@link View#setAutofillId(AutofillId)} for more info. + * + * @return An ID that is unique in the activity. + */ + @Nullable AutofillId autofillClientGetNextAutofillId(); } /** @@ -773,7 +791,7 @@ public final class AutofillManager { /** Returns AutofillCallback if need fire EVENT_INPUT_UNAVAILABLE */ @GuardedBy("mLock") private AutofillCallback notifyViewEnteredLocked(@NonNull View view, int flags) { - final AutofillId id = getAutofillId(view); + final AutofillId id = view.getAutofillId(); if (shouldIgnoreViewEnteredLocked(id, flags)) return null; AutofillCallback callback = null; @@ -823,7 +841,7 @@ public final class AutofillManager { if (mEnabled && isActiveLocked()) { // dont notify exited when Activity is already in background if (!isClientDisablingEnterExitEvent()) { - final AutofillId id = getAutofillId(view); + final AutofillId id = view.getAutofillId(); // Update focus on existing session. updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0); @@ -866,6 +884,7 @@ public final class AutofillManager { if (mEnabled && isActiveLocked()) { final AutofillId id = virtual ? getAutofillId(view, virtualId) : view.getAutofillId(); + if (sVerbose) Log.v(TAG, "visibility changed for " + id + ": " + isVisible); if (!isVisible && mFillableIds != null) { if (mFillableIds.contains(id)) { if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible"); @@ -874,6 +893,8 @@ public final class AutofillManager { } if (mTrackedViews != null) { mTrackedViews.notifyViewVisibilityChangedLocked(id, isVisible); + } else if (sVerbose) { + Log.v(TAG, "Ignoring visibility change on " + id + ": no tracked views"); } } } @@ -1004,7 +1025,7 @@ public final class AutofillManager { if (mLastAutofilledData == null) { view.setAutofilled(false); } else { - id = getAutofillId(view); + id = view.getAutofillId(); if (mLastAutofilledData.containsKey(id)) { value = view.getAutofillValue(); valueWasRead = true; @@ -1029,7 +1050,7 @@ public final class AutofillManager { } if (id == null) { - id = getAutofillId(view); + id = view.getAutofillId(); } if (!valueWasRead) { @@ -1429,8 +1450,27 @@ public final class AutofillManager { } } - private static AutofillId getAutofillId(View view) { - return new AutofillId(view.getAutofillViewId()); + /** + * Gets the next unique autofill ID for the activity context. + * + * <p>Typically used to manage views whose content is recycled - see + * {@link View#setAutofillId(AutofillId)} for more info. + * + * @return An ID that is unique in the activity, or {@code null} if autofill is not supported in + * the {@link Context} associated with this {@link AutofillManager}. + */ + @Nullable + public AutofillId getNextAutofillId() { + final AutofillClient client = getClient(); + if (client == null) return null; + + final AutofillId id = client.autofillClientGetNextAutofillId(); + + if (id == null && sDebug) { + Log.d(TAG, "getNextAutofillId(): client " + client + " returned null"); + } + + return id; } private static AutofillId getAutofillId(View parent, int virtualId) { @@ -1668,6 +1708,24 @@ public final class AutofillManager { } } + private void dispatchUnhandledKey(int sessionId, AutofillId id, KeyEvent keyEvent) { + final View anchor = findView(id); + if (anchor == null) { + return; + } + + AutofillCallback callback = null; + synchronized (mLock) { + if (mSessionId == sessionId) { + AutofillClient client = getClient(); + + if (client != null) { + client.autofillClientDispatchUnhandledKey(anchor, keyEvent); + } + } + } + } + /** @hide */ public static final int SET_STATE_FLAG_ENABLED = 0x01; /** @hide */ @@ -1713,7 +1771,7 @@ public final class AutofillManager { if (mLastAutofilledData == null) { mLastAutofilledData = new ParcelableMap(1); } - mLastAutofilledData.put(getAutofillId(view), targetValue); + mLastAutofilledData.put(view.getAutofillId(), targetValue); } view.setAutofilled(true); } @@ -2610,6 +2668,14 @@ public final class AutofillManager { } @Override + public void dispatchUnhandledKey(int sessionId, AutofillId id, KeyEvent fullScreen) { + final AutofillManager afm = mAfm.get(); + if (afm != null) { + afm.post(() -> afm.dispatchUnhandledKey(sessionId, id, fullScreen)); + } + } + + @Override public void startIntentSender(IntentSender intentSender, Intent intent) { final AutofillManager afm = mAfm.get(); if (afm != null) { diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl index 254c8a5ac20c..0ff7a0bdb963 100644 --- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl +++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl @@ -25,6 +25,7 @@ import android.os.IBinder; import android.view.autofill.AutofillId; import android.view.autofill.AutofillValue; import android.view.autofill.IAutofillWindowPresenter; +import android.view.KeyEvent; /** * Object running in the application process and responsible for autofilling it. @@ -74,6 +75,13 @@ oneway interface IAutoFillManagerClient { void notifyNoFillUi(int sessionId, in AutofillId id, int sessionFinishedState); /** + * Dispatches unhandled keyevent from autofill ui. Autofill ui handles DPAD and ENTER events, + * other unhandled keyevents are dispatched to app's window to filter autofill result. + * Note this method is not called when autofill ui is in fullscreen mode (TV only). + */ + void dispatchUnhandledKey(int sessionId, in AutofillId id, in KeyEvent keyEvent); + + /** * Starts the provided intent sender. */ void startIntentSender(in IntentSender intentSender, in Intent intent); diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java index cbc3828ba56e..1789edf1e876 100644 --- a/core/java/android/view/textclassifier/SystemTextClassifier.java +++ b/core/java/android/view/textclassifier/SystemTextClassifier.java @@ -41,11 +41,13 @@ final class SystemTextClassifier implements TextClassifier { private final ITextClassifierService mManagerService; private final TextClassifier mFallback; + private final String mPackageName; SystemTextClassifier(Context context) throws ServiceManager.ServiceNotFoundException { mManagerService = ITextClassifierService.Stub.asInterface( ServiceManager.getServiceOrThrow(Context.TEXT_CLASSIFICATION_SERVICE)); mFallback = new TextClassifierImpl(context); + mPackageName = context.getPackageName(); } /** @@ -107,6 +109,11 @@ final class SystemTextClassifier implements TextClassifier { @NonNull CharSequence text, @Nullable TextLinks.Options options) { Utils.validate(text, false /* allowInMainThread */); try { + if (options == null) { + options = new TextLinks.Options().setCallingPackageName(mPackageName); + } else if (!mPackageName.equals(options.getCallingPackageName())) { + options.setCallingPackageName(mPackageName); + } final TextLinksCallback callback = new TextLinksCallback(); mManagerService.onGenerateLinks(text, options, callback); final TextLinks links = callback.mReceiver.get(); diff --git a/core/java/android/view/textclassifier/TextClassifierConstants.java b/core/java/android/view/textclassifier/TextClassifierConstants.java index efa69488521f..397473be9d4b 100644 --- a/core/java/android/view/textclassifier/TextClassifierConstants.java +++ b/core/java/android/view/textclassifier/TextClassifierConstants.java @@ -20,6 +20,11 @@ import android.annotation.Nullable; import android.util.KeyValueListParser; import android.util.Slog; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.StringJoiner; + /** * TextClassifier specific settings. * This is encoded as a key=value list, separated by commas. Ex: @@ -27,6 +32,12 @@ import android.util.Slog; * <pre> * smart_selection_dark_launch (boolean) * smart_selection_enabled_for_edit_text (boolean) + * suggest_selection_max_range_length (int) + * classify_text_max_range_length (int) + * generate_links_max_text_length (int) + * entity_list_default (String[]) + * entity_list_not_editable (String[]) + * entity_list_editable (String[]) * </pre> * * <p> @@ -34,7 +45,9 @@ import android.util.Slog; * see also android.provider.Settings.Global.TEXT_CLASSIFIER_CONSTANTS * * Example of setting the values for testing. - * adb shell settings put global text_classifier_constants smart_selection_dark_launch=true,smart_selection_enabled_for_edit_text=true + * adb shell settings put global text_classifier_constants \ + * smart_selection_dark_launch=true,smart_selection_enabled_for_edit_text=true,\ + * entity_list_default=phone:address * @hide */ public final class TextClassifierConstants { @@ -53,6 +66,14 @@ public final class TextClassifierConstants { "classify_text_max_range_length"; private static final String GENERATE_LINKS_MAX_TEXT_LENGTH = "generate_links_max_text_length"; + private static final String GENERATE_LINKS_LOG_SAMPLE_RATE = + "generate_links_log_sample_rate"; + private static final String ENTITY_LIST_DEFAULT = + "entity_list_default"; + private static final String ENTITY_LIST_NOT_EDITABLE = + "entity_list_not_editable"; + private static final String ENTITY_LIST_EDITABLE = + "entity_list_editable"; private static final boolean SMART_SELECTION_DARK_LAUNCH_DEFAULT = false; private static final boolean SMART_SELECTION_ENABLED_FOR_EDIT_TEXT_DEFAULT = true; @@ -60,6 +81,16 @@ public final class TextClassifierConstants { private static final int SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000; private static final int CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000; private static final int GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT = 100 * 1000; + private static final int GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT = 100; + private static final String ENTITY_LIST_DELIMITER = ":"; + private static final String ENTITY_LIST_DEFAULT_VALUE = new StringJoiner(ENTITY_LIST_DELIMITER) + .add(TextClassifier.TYPE_ADDRESS) + .add(TextClassifier.TYPE_EMAIL) + .add(TextClassifier.TYPE_PHONE) + .add(TextClassifier.TYPE_URL) + .add(TextClassifier.TYPE_DATE) + .add(TextClassifier.TYPE_DATE_TIME) + .add(TextClassifier.TYPE_FLIGHT_NUMBER).toString(); /** Default settings. */ static final TextClassifierConstants DEFAULT = new TextClassifierConstants(); @@ -70,6 +101,10 @@ public final class TextClassifierConstants { private final int mSuggestSelectionMaxRangeLength; private final int mClassifyTextMaxRangeLength; private final int mGenerateLinksMaxTextLength; + private final int mGenerateLinksLogSampleRate; + private final List<String> mEntityListDefault; + private final List<String> mEntityListNotEditable; + private final List<String> mEntityListEditable; private TextClassifierConstants() { mDarkLaunch = SMART_SELECTION_DARK_LAUNCH_DEFAULT; @@ -78,6 +113,10 @@ public final class TextClassifierConstants { mSuggestSelectionMaxRangeLength = SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT; mClassifyTextMaxRangeLength = CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT; mGenerateLinksMaxTextLength = GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT; + mGenerateLinksLogSampleRate = GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT; + mEntityListDefault = parseEntityList(ENTITY_LIST_DEFAULT_VALUE); + mEntityListNotEditable = mEntityListDefault; + mEntityListEditable = mEntityListDefault; } private TextClassifierConstants(@Nullable String settings) { @@ -106,9 +145,22 @@ public final class TextClassifierConstants { mGenerateLinksMaxTextLength = parser.getInt( GENERATE_LINKS_MAX_TEXT_LENGTH, GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT); + mGenerateLinksLogSampleRate = parser.getInt( + GENERATE_LINKS_LOG_SAMPLE_RATE, + GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT); + mEntityListDefault = parseEntityList(parser.getString( + ENTITY_LIST_DEFAULT, + ENTITY_LIST_DEFAULT_VALUE)); + mEntityListNotEditable = parseEntityList(parser.getString( + ENTITY_LIST_NOT_EDITABLE, + ENTITY_LIST_DEFAULT_VALUE)); + mEntityListEditable = parseEntityList(parser.getString( + ENTITY_LIST_EDITABLE, + ENTITY_LIST_DEFAULT_VALUE)); } - static TextClassifierConstants loadFromString(String settings) { + /** Load from a settings string. */ + public static TextClassifierConstants loadFromString(String settings) { return new TextClassifierConstants(settings); } @@ -135,4 +187,24 @@ public final class TextClassifierConstants { public int getGenerateLinksMaxTextLength() { return mGenerateLinksMaxTextLength; } + + public int getGenerateLinksLogSampleRate() { + return mGenerateLinksLogSampleRate; + } + + public List<String> getEntityListDefault() { + return mEntityListDefault; + } + + public List<String> getEntityListNotEditable() { + return mEntityListNotEditable; + } + + public List<String> getEntityListEditable() { + return mEntityListEditable; + } + + private static List<String> parseEntityList(String listStr) { + return Collections.unmodifiableList(Arrays.asList(listStr.split(ENTITY_LIST_DELIMITER))); + } } diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java index 8f6f600cfc72..5b7095b2f44f 100644 --- a/core/java/android/view/textclassifier/TextClassifierImpl.java +++ b/core/java/android/view/textclassifier/TextClassifierImpl.java @@ -36,10 +36,10 @@ import android.provider.CalendarContract; import android.provider.ContactsContract; import android.provider.Settings; import android.view.textclassifier.logging.DefaultLogger; +import android.view.textclassifier.logging.GenerateLinksLogger; import android.view.textclassifier.logging.Logger; import com.android.internal.annotations.GuardedBy; -import com.android.internal.logging.MetricsLogger; import com.android.internal.util.Preconditions; import java.io.File; @@ -79,20 +79,11 @@ public final class TextClassifierImpl implements TextClassifier { private static final String MODEL_FILE_REGEX = "textclassifier\\.(.*)\\.model"; private static final String UPDATED_MODEL_FILE_PATH = "/data/misc/textclassifier/textclassifier.model"; - private static final List<String> ENTITY_TYPES_ALL = - Collections.unmodifiableList(Arrays.asList( - TextClassifier.TYPE_ADDRESS, - TextClassifier.TYPE_EMAIL, - TextClassifier.TYPE_PHONE, - TextClassifier.TYPE_URL, - TextClassifier.TYPE_DATE, - TextClassifier.TYPE_DATE_TIME, - TextClassifier.TYPE_FLIGHT_NUMBER)); private final Context mContext; private final TextClassifier mFallback; - private final MetricsLogger mMetricsLogger = new MetricsLogger(); + private final GenerateLinksLogger mGenerateLinksLogger; private final Object mLock = new Object(); @GuardedBy("mLock") // Do not access outside this lock. @@ -113,6 +104,8 @@ public final class TextClassifierImpl implements TextClassifier { public TextClassifierImpl(Context context) { mContext = Preconditions.checkNotNull(context); mFallback = TextClassifier.NO_OP; + mGenerateLinksLogger = new GenerateLinksLogger( + getSettings().getGenerateLinksLogSampleRate()); } /** @inheritDoc */ @@ -226,13 +219,14 @@ public final class TextClassifierImpl implements TextClassifier { } try { + final long startTimeMs = System.currentTimeMillis(); final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null; final Calendar refTime = Calendar.getInstance(); final Collection<String> entitiesToIdentify = options != null && options.getEntityConfig() != null ? options.getEntityConfig().resolveEntityListModifications( getEntitiesForHints(options.getEntityConfig().getHints())) - : ENTITY_TYPES_ALL; + : getSettings().getEntityListDefault(); final TextClassifierImplNative nativeImpl = getNative(defaultLocales); final TextClassifierImplNative.AnnotatedSpan[] annotations = @@ -255,7 +249,15 @@ public final class TextClassifierImpl implements TextClassifier { } builder.addLink(span.getStartIndex(), span.getEndIndex(), entityScores); } - return builder.build(); + final TextLinks links = builder.build(); + final long endTimeMs = System.currentTimeMillis(); + final String callingPackageName = + options == null || options.getCallingPackageName() == null + ? mContext.getPackageName() // local (in process) TC. + : options.getCallingPackageName(); + mGenerateLinksLogger.logGenerateLinks( + text, links, callingPackageName, endTimeMs - startTimeMs); + return links; } catch (Throwable t) { // Avoid throwing from this method. Log the error. Log.e(LOG_TAG, "Error getting links info.", t); @@ -270,7 +272,18 @@ public final class TextClassifierImpl implements TextClassifier { } private Collection<String> getEntitiesForHints(Collection<String> hints) { - return ENTITY_TYPES_ALL; + final boolean editable = hints.contains(HINT_TEXT_IS_EDITABLE); + final boolean notEditable = hints.contains(HINT_TEXT_IS_NOT_EDITABLE); + + // Use the default if there is no hint, or conflicting ones. + final boolean useDefault = editable == notEditable; + if (useDefault) { + return getSettings().getEntityListDefault(); + } else if (editable) { + return getSettings().getEntityListEditable(); + } else { // notEditable + return getSettings().getEntityListNotEditable(); + } } @Override diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java index dc24d0c4d681..884cbe861deb 100644 --- a/core/java/android/view/textclassifier/TextLinks.java +++ b/core/java/android/view/textclassifier/TextLinks.java @@ -305,6 +305,8 @@ public final class TextLinks implements Parcelable { private @ApplyStrategy int mApplyStrategy; private Function<TextLink, TextLinkSpan> mSpanFactory; + private String mCallingPackageName; + /** * Returns a new options object based on the specified link mask. */ @@ -377,6 +379,15 @@ public final class TextLinks implements Parcelable { } /** + * Sets the name of the package that requested the links to get generated. + * @hide + */ + public Options setCallingPackageName(@Nullable String callingPackageName) { + mCallingPackageName = callingPackageName; + return this; + } + + /** * @return ordered list of locale preferences that can be used to disambiguate * the provided text */ @@ -417,6 +428,16 @@ public final class TextLinks implements Parcelable { return mSpanFactory; } + /** + * @return the name of the package that requested the links to get generated. + * TODO: make available as system API + * @hide + */ + @Nullable + public String getCallingPackageName() { + return mCallingPackageName; + } + @Override public int describeContents() { return 0; @@ -433,6 +454,7 @@ public final class TextLinks implements Parcelable { mEntityConfig.writeToParcel(dest, flags); } dest.writeInt(mApplyStrategy); + dest.writeString(mCallingPackageName); } public static final Parcelable.Creator<Options> CREATOR = @@ -456,6 +478,7 @@ public final class TextLinks implements Parcelable { mEntityConfig = TextClassifier.EntityConfig.CREATOR.createFromParcel(in); } mApplyStrategy = in.readInt(); + mCallingPackageName = in.readString(); } } diff --git a/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java b/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java new file mode 100644 index 000000000000..fb6f205eb462 --- /dev/null +++ b/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2017 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.logging; + +import android.annotation.Nullable; +import android.metrics.LogMaker; +import android.util.ArrayMap; +import android.util.Log; +import android.view.textclassifier.TextClassifier; +import android.view.textclassifier.TextLinks; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.internal.util.Preconditions; + +import java.util.Map; +import java.util.Objects; +import java.util.Random; +import java.util.UUID; + +/** + * A helper for logging calls to generateLinks. + * @hide + */ +@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) +public final class GenerateLinksLogger { + + private static final String LOG_TAG = "GenerateLinksLogger"; + private static final String ZERO = "0"; + + private final MetricsLogger mMetricsLogger; + private final Random mRng; + private final int mSampleRate; + + /** + * @param sampleRate the rate at which log events are written. (e.g. 100 means there is a 0.01 + * chance that a call to logGenerateLinks results in an event being written). + * To write all events, pass 1. + */ + public GenerateLinksLogger(int sampleRate) { + mSampleRate = sampleRate; + mRng = new Random(System.nanoTime()); + mMetricsLogger = new MetricsLogger(); + } + + @VisibleForTesting + public GenerateLinksLogger(int sampleRate, MetricsLogger metricsLogger) { + mSampleRate = sampleRate; + mRng = new Random(System.nanoTime()); + mMetricsLogger = metricsLogger; + } + + /** Logs statistics about a call to generateLinks. */ + public void logGenerateLinks(CharSequence text, TextLinks links, String callingPackageName, + long latencyMs) { + Preconditions.checkNotNull(text); + Preconditions.checkNotNull(links); + Preconditions.checkNotNull(callingPackageName); + if (!shouldLog()) { + return; + } + + // Always populate the total stats, and per-entity stats for each entity type detected. + final LinkifyStats totalStats = new LinkifyStats(); + final Map<String, LinkifyStats> perEntityTypeStats = new ArrayMap<>(); + for (TextLinks.TextLink link : links.getLinks()) { + if (link.getEntityCount() == 0) continue; + final String entityType = link.getEntity(0); + if (entityType == null + || TextClassifier.TYPE_OTHER.equals(entityType) + || TextClassifier.TYPE_UNKNOWN.equals(entityType)) { + continue; + } + totalStats.countLink(link); + perEntityTypeStats.computeIfAbsent(entityType, k -> new LinkifyStats()).countLink(link); + } + + final String callId = UUID.randomUUID().toString(); + writeStats(callId, callingPackageName, null, totalStats, text, latencyMs); + for (Map.Entry<String, LinkifyStats> entry : perEntityTypeStats.entrySet()) { + writeStats(callId, callingPackageName, entry.getKey(), entry.getValue(), text, + latencyMs); + } + } + + /** + * Returns whether this particular event should be logged. + * + * Sampling is used to reduce the amount of logging data generated. + **/ + private boolean shouldLog() { + if (mSampleRate <= 1) { + return true; + } else { + return mRng.nextInt(mSampleRate) == 0; + } + } + + /** Writes a log event for the given stats. */ + private void writeStats(String callId, String callingPackageName, @Nullable String entityType, + LinkifyStats stats, CharSequence text, long latencyMs) { + final LogMaker log = new LogMaker(MetricsEvent.TEXT_CLASSIFIER_GENERATE_LINKS) + .setPackageName(callingPackageName) + .addTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID, callId) + .addTaggedData(MetricsEvent.FIELD_LINKIFY_NUM_LINKS, stats.mNumLinks) + .addTaggedData(MetricsEvent.FIELD_LINKIFY_LINK_LENGTH, stats.mNumLinksTextLength) + .addTaggedData(MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH, text.length()) + .addTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY, latencyMs); + if (entityType != null) { + log.addTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE, entityType); + } + mMetricsLogger.write(log); + debugLog(log); + } + + private static void debugLog(LogMaker log) { + if (!Logger.DEBUG_LOG_ENABLED) return; + + final String callId = Objects.toString( + log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID), ""); + final String entityType = Objects.toString( + log.getTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE), "ANY_ENTITY"); + final int numLinks = Integer.parseInt( + Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_NUM_LINKS), ZERO)); + final int linkLength = Integer.parseInt( + Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LINK_LENGTH), ZERO)); + final int textLength = Integer.parseInt( + Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH), ZERO)); + final int latencyMs = Integer.parseInt( + Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY), ZERO)); + + Log.d(LOG_TAG, String.format("%s:%s %d links (%d/%d chars) %dms %s", callId, entityType, + numLinks, linkLength, textLength, latencyMs, log.getPackageName())); + } + + /** Helper class for storing per-entity type statistics. */ + private static final class LinkifyStats { + int mNumLinks; + int mNumLinksTextLength; + + void countLink(TextLinks.TextLink link) { + mNumLinks += 1; + mNumLinksTextLength += link.getEnd() - link.getStart(); + } + } +} diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java index 88365617cd6e..6e87e2356f65 100644 --- a/core/java/android/widget/Magnifier.java +++ b/core/java/android/widget/Magnifier.java @@ -18,21 +18,32 @@ package android.widget; import android.annotation.FloatRange; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.TestApi; import android.annotation.UiThread; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; +import android.graphics.Outline; +import android.graphics.Paint; +import android.graphics.PixelFormat; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; import android.os.Handler; -import android.view.Gravity; +import android.os.HandlerThread; +import android.os.Message; +import android.view.Display; +import android.view.DisplayListCanvas; import android.view.LayoutInflater; import android.view.PixelCopy; +import android.view.RenderNode; import android.view.Surface; +import android.view.SurfaceControl; import android.view.SurfaceHolder; +import android.view.SurfaceSession; import android.view.SurfaceView; +import android.view.ThreadedRenderer; import android.view.View; import android.view.ViewParent; import android.view.ViewRootImpl; @@ -46,33 +57,41 @@ import com.android.internal.util.Preconditions; public final class Magnifier { // Use this to specify that a previous configuration value does not exist. private static final int NONEXISTENT_PREVIOUS_CONFIG_VALUE = -1; + // The callbacks of the pixel copy requests will be invoked on + // the Handler of this Thread when the copy is finished. + private static final HandlerThread sPixelCopyHandlerThread = + new HandlerThread("magnifier pixel copy result handler"); + // The view to which this magnifier is attached. private final View mView; // The coordinates of the view in the surface. private final int[] mViewCoordinatesInSurface; // The window containing the magnifier. - private final PopupWindow mWindow; + private InternalPopupWindow mWindow; // The center coordinates of the window containing the magnifier. private final Point mWindowCoords = new Point(); // The width of the window containing the magnifier. private final int mWindowWidth; // The height of the window containing the magnifier. private final int mWindowHeight; - // The bitmap used to display the contents of the magnifier. - private final Bitmap mBitmap; + // The width of the bitmaps where the magnifier content is copied. + private final int mBitmapWidth; + // The height of the bitmaps where the magnifier content is copied. + private final int mBitmapHeight; + // The elevation of the window containing the magnifier. + private final float mWindowElevation; // The center coordinates of the content that is to be magnified. private final Point mCenterZoomCoords = new Point(); - // The callback of the pixel copy request will be invoked on this Handler when - // the copy is finished. - private final Handler mPixelCopyHandler = Handler.getMain(); - // Current magnification scale. - private final float mZoomScale; // Variables holding previous states, used for detecting redundant calls and invalidation. private final Point mPrevStartCoordsInSurface = new Point( NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE); private final PointF mPrevPosInView = new PointF( NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE); + // Rectangle defining the view surface area we pixel copy content from. private final Rect mPixelCopyRequestRect = new Rect(); + // Lock to synchronize between the UI thread and the thread that handles pixel copy results. + // Only sync mWindow writes from UI thread with mWindow reads from sPixelCopyHandlerThread. + private final Object mLock = new Object(); /** * Initializes a magnifier. @@ -82,8 +101,6 @@ public final class Magnifier { public Magnifier(@NonNull View view) { mView = Preconditions.checkNotNull(view); final Context context = mView.getContext(); - final float elevation = context.getResources().getDimension( - com.android.internal.R.dimen.magnifier_elevation); final View content = LayoutInflater.from(context).inflate( com.android.internal.R.layout.magnifier, null); content.findViewById(com.android.internal.R.id.magnifier_inner).setClipToOutline(true); @@ -91,23 +108,18 @@ public final class Magnifier { com.android.internal.R.dimen.magnifier_width); mWindowHeight = context.getResources().getDimensionPixelSize( com.android.internal.R.dimen.magnifier_height); - mZoomScale = context.getResources().getFloat( + mWindowElevation = context.getResources().getDimension( + com.android.internal.R.dimen.magnifier_elevation); + final float zoomScale = context.getResources().getFloat( com.android.internal.R.dimen.magnifier_zoom_scale); + mBitmapWidth = Math.round(mWindowWidth / zoomScale); + mBitmapHeight = Math.round(mWindowHeight / zoomScale); // The view's surface coordinates will not be updated until the magnifier is first shown. mViewCoordinatesInSurface = new int[2]; + } - mWindow = new PopupWindow(context); - mWindow.setContentView(content); - mWindow.setWidth(mWindowWidth); - mWindow.setHeight(mWindowHeight); - mWindow.setElevation(elevation); - mWindow.setTouchable(false); - mWindow.setBackgroundDrawable(null); - - final int bitmapWidth = Math.round(mWindowWidth / mZoomScale); - final int bitmapHeight = Math.round(mWindowHeight / mZoomScale); - mBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888); - getImageView().setImageBitmap(mBitmap); + static { + sPixelCopyHandlerThread.start(); } /** @@ -155,30 +167,50 @@ public final class Magnifier { } final int startX = Math.max(zeroScrollXInSurface, Math.min( - mCenterZoomCoords.x - mBitmap.getWidth() / 2, - zeroScrollXInSurface + actualWidth - mBitmap.getWidth())); - final int startY = mCenterZoomCoords.y - mBitmap.getHeight() / 2; + mCenterZoomCoords.x - mBitmapWidth / 2, + zeroScrollXInSurface + actualWidth - mBitmapWidth)); + final int startY = mCenterZoomCoords.y - mBitmapHeight / 2; if (xPosInView != mPrevPosInView.x || yPosInView != mPrevPosInView.y) { - performPixelCopy(startX, startY); - + if (mWindow == null) { + synchronized (mLock) { + mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(), + getValidViewSurface(), mWindowWidth, mWindowHeight, mWindowElevation, + Handler.getMain() /* draw the magnifier on the UI thread */, mLock, + mCallback); + } + } + performPixelCopy(startX, startY, true /* update window position */); mPrevPosInView.x = xPosInView; mPrevPosInView.y = yPosInView; + } + } - if (mWindow.isShowing()) { - mWindow.update(mWindowCoords.x, mWindowCoords.y, mWindow.getWidth(), - mWindow.getHeight()); - } else { - mWindow.showAtLocation(mView, Gravity.NO_GRAVITY, mWindowCoords.x, mWindowCoords.y); - } + @Nullable + private Surface getValidViewSurface() { + // TODO: deduplicate this against the first part of #performPixelCopy + final Surface surface; + if (mView instanceof SurfaceView) { + surface = ((SurfaceView) mView).getHolder().getSurface(); + } else if (mView.getViewRootImpl() != null) { + surface = mView.getViewRootImpl().mSurface; + } else { + surface = null; } + + return (surface != null && surface.isValid()) ? surface : null; } /** * Dismisses the magnifier from the screen. Calling this on a dismissed magnifier is a no-op. */ public void dismiss() { - mWindow.dismiss(); + if (mWindow != null) { + synchronized (mLock) { + mWindow.destroy(); + mWindow = null; + } + } } /** @@ -186,43 +218,40 @@ public final class Magnifier { * {@link #show(float, float)}. This only happens if the magnifier is currently showing. */ public void update() { - if (mWindow.isShowing()) { - // Update the contents shown in the magnifier. - performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y); + if (mWindow != null) { + // Update the content shown in the magnifier. + performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y, + false /* update window position */); } } private void configureCoordinates(final float xPosInView, final float yPosInView) { // Compute the coordinates of the center of the content going to be displayed in the // magnifier. These are relative to the surface the content is copied from. - final float contentPosX; - final float contentPosY; + final float posX; + final float posY; if (mView instanceof SurfaceView) { // No offset required if the backing Surface matches the size of the SurfaceView. - contentPosX = xPosInView; - contentPosY = yPosInView; + posX = xPosInView; + posY = yPosInView; } else { mView.getLocationInSurface(mViewCoordinatesInSurface); - contentPosX = xPosInView + mViewCoordinatesInSurface[0]; - contentPosY = yPosInView + mViewCoordinatesInSurface[1]; + posX = xPosInView + mViewCoordinatesInSurface[0]; + posY = yPosInView + mViewCoordinatesInSurface[1]; } - mCenterZoomCoords.x = Math.round(contentPosX); - mCenterZoomCoords.y = Math.round(contentPosY); - - // Compute the position of the magnifier window. These have to be relative to the window - // of the view the magnifier is attached to, as the magnifier popup is a panel window - // attached to that window. - final int[] viewCoordinatesInWindow = new int[2]; - mView.getLocationInWindow(viewCoordinatesInWindow); + mCenterZoomCoords.x = Math.round(posX); + mCenterZoomCoords.y = Math.round(posY); + + // Compute the position of the magnifier window. Again, this has to be relative to the + // surface of the magnified view, as this surface is the parent of the magnifier surface. final int verticalOffset = mView.getContext().getResources().getDimensionPixelSize( com.android.internal.R.dimen.magnifier_offset); - final float magnifierPosX = xPosInView + viewCoordinatesInWindow[0]; - final float magnifierPosY = yPosInView + viewCoordinatesInWindow[1] - verticalOffset; - mWindowCoords.x = Math.round(magnifierPosX - mWindowWidth / 2); - mWindowCoords.y = Math.round(magnifierPosY - mWindowHeight / 2); + mWindowCoords.x = mCenterZoomCoords.x - mWindowWidth / 2; + mWindowCoords.y = mCenterZoomCoords.y - mWindowHeight / 2 - verticalOffset; } - private void performPixelCopy(final int startXInSurface, final int startYInSurface) { + private void performPixelCopy(final int startXInSurface, final int startYInSurface, + final boolean updateWindowPosition) { // Get the view surface where the content will be copied from. final Surface surface; final int surfaceWidth; @@ -256,20 +285,302 @@ public final class Magnifier { // Perform the pixel copy. mPixelCopyRequestRect.set(clampedStartXInSurface, clampedStartYInSurface, - clampedStartXInSurface + mBitmap.getWidth(), - clampedStartYInSurface + mBitmap.getHeight()); - PixelCopy.request(surface, mPixelCopyRequestRect, mBitmap, + clampedStartXInSurface + mBitmapWidth, + clampedStartYInSurface + mBitmapHeight); + final int windowCoordsX = mWindowCoords.x; + final int windowCoordsY = mWindowCoords.y; + final InternalPopupWindow currentWindowInstance = mWindow; + + final Bitmap bitmap = + Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888); + PixelCopy.request(surface, mPixelCopyRequestRect, bitmap, result -> { - getImageView().invalidate(); - mPrevStartCoordsInSurface.x = startXInSurface; - mPrevStartCoordsInSurface.y = startYInSurface; + synchronized (mLock) { + if (mWindow != currentWindowInstance) { + // The magnifier was dismissed (and maybe shown again) in the meantime. + return; + } + if (updateWindowPosition) { + // TODO: pull the position update outside #performPixelCopy + mWindow.setContentPositionForNextDraw(windowCoordsX, windowCoordsY); + } + mWindow.updateContent(bitmap); + } }, - mPixelCopyHandler); + sPixelCopyHandlerThread.getThreadHandler()); + mPrevStartCoordsInSurface.x = startXInSurface; + mPrevStartCoordsInSurface.y = startYInSurface; + } + + /** + * Magnifier's own implementation of PopupWindow-similar floating window. + * This exists to ensure frame-synchronization between window position updates and window + * content updates. By using a PopupWindow, these events would happen in different frames, + * producing a shakiness effect for the magnifier content. + */ + private static class InternalPopupWindow { + // Display associated to the view the magnifier is attached to. + private final Display mDisplay; + // The size of the content of the magnifier. + private final int mContentWidth; + private final int mContentHeight; + // The size of the allocated surface. + private final int mSurfaceWidth; + private final int mSurfaceHeight; + // The insets of the content inside the allocated surface. + private final int mOffsetX; + private final int mOffsetY; + // The surface we allocate for the magnifier content + shadow. + private final SurfaceSession mSurfaceSession; + private final SurfaceControl mSurfaceControl; + private final Surface mSurface; + // The renderer used for the allocated surface. + private final ThreadedRenderer.SimpleRenderer mRenderer; + // The RenderNode used to draw the magnifier content in the surface. + private final RenderNode mBitmapRenderNode; + // The job that will be post'd to apply the pending magnifier updates to the surface. + private final Runnable mMagnifierUpdater; + // The handler where the magnifier updater jobs will be post'd. + private final Handler mHandler; + // The callback to be run after the next draw. Only used for testing. + private Callback mCallback; + + // Members below describe the state of the magnifier. Reads/writes to them + // have to be synchronized between the UI thread and the thread that handles + // the pixel copy results. This is the purpose of mLock. + private final Object mLock; + // Whether a magnifier frame draw is currently pending in the UI thread queue. + private boolean mFrameDrawScheduled; + // The content bitmap. + private Bitmap mBitmap; + // Whether the next draw will be the first one for the current instance. + private boolean mFirstDraw = true; + // The window position in the parent surface. Might be applied during the next draw, + // when mPendingWindowPositionUpdate is true. + private int mWindowPositionX; + private int mWindowPositionY; + private boolean mPendingWindowPositionUpdate; + + InternalPopupWindow(final Context context, final Display display, + final Surface parentSurface, + final int width, final int height, final float elevation, + final Handler handler, final Object lock, final Callback callback) { + mDisplay = display; + mLock = lock; + mCallback = callback; + + mContentWidth = width; + mContentHeight = height; + mOffsetX = (int) (0.1f * width); + mOffsetY = (int) (0.1f * height); + // Setup the surface we will use for drawing the content and shadow. + mSurfaceWidth = mContentWidth + 2 * mOffsetX; + mSurfaceHeight = mContentHeight + 2 * mOffsetY; + mSurfaceSession = new SurfaceSession(parentSurface); + mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession) + .setFormat(PixelFormat.TRANSLUCENT) + .setSize(mSurfaceWidth, mSurfaceHeight) + .setName("magnifier surface") + .setFlags(SurfaceControl.HIDDEN) + .build(); + mSurface = new Surface(); + mSurface.copyFrom(mSurfaceControl); + + // Setup the RenderNode tree. The root has only one child, which contains the bitmap. + mRenderer = new ThreadedRenderer.SimpleRenderer( + context, + "magnifier renderer", + mSurface + ); + mBitmapRenderNode = createRenderNodeForBitmap( + "magnifier content", + elevation + ); + + final DisplayListCanvas canvas = mRenderer.getRootNode().start(width, height); + try { + canvas.insertReorderBarrier(); + canvas.drawRenderNode(mBitmapRenderNode); + canvas.insertInorderBarrier(); + } finally { + mRenderer.getRootNode().end(canvas); + } + + // Initialize the update job and the handler where this will be post'd. + mHandler = handler; + mMagnifierUpdater = this::doDraw; + mFrameDrawScheduled = false; + } + + private RenderNode createRenderNodeForBitmap(final String name, final float elevation) { + final RenderNode bitmapRenderNode = RenderNode.create(name, null); + + // Define the position of the bitmap in the parent render node. The surface regions + // outside the bitmap are used to draw elevation. + bitmapRenderNode.setLeftTopRightBottom(mOffsetX, mOffsetY, + mOffsetX + mContentWidth, mOffsetY + mContentHeight); + bitmapRenderNode.setElevation(elevation); + + final Outline outline = new Outline(); + outline.setRoundRect(0, 0, mContentWidth, mContentHeight, 3); + outline.setAlpha(1.0f); + bitmapRenderNode.setOutline(outline); + bitmapRenderNode.setClipToOutline(true); + + // Create a dummy draw, which will be replaced later with real drawing. + final DisplayListCanvas canvas = bitmapRenderNode.start(mContentWidth, mContentHeight); + try { + canvas.drawColor(0xFF00FF00); + } finally { + bitmapRenderNode.end(canvas); + } + + return bitmapRenderNode; + } + + /** + * Sets the position of the magnifier content relative to the parent surface. + * The position update will happen in the same frame with the next draw. + * The method has to be called in a context that holds {@link #mLock}. + * + * @param contentX the x coordinate of the content + * @param contentY the y coordinate of the content + */ + public void setContentPositionForNextDraw(final int contentX, final int contentY) { + mWindowPositionX = contentX - mOffsetX; + mWindowPositionY = contentY - mOffsetY; + mPendingWindowPositionUpdate = true; + requestUpdate(); + } + + /** + * Sets the content that should be displayed in the magnifier. + * The update happens immediately, and possibly triggers a pending window movement set + * by {@link #setContentPositionForNextDraw(int, int)}. + * The method has to be called in a context that holds {@link #mLock}. + * + * @param bitmap the content bitmap + */ + public void updateContent(final @NonNull Bitmap bitmap) { + if (mBitmap != null) { + mBitmap.recycle(); + } + mBitmap = bitmap; + requestUpdate(); + } + + private void requestUpdate() { + if (mFrameDrawScheduled) { + return; + } + final Message request = Message.obtain(mHandler, mMagnifierUpdater); + request.setAsynchronous(true); + request.sendToTarget(); + mFrameDrawScheduled = true; + } + + /** + * Destroys this instance. + */ + public void destroy() { + synchronized (mLock) { + mRenderer.destroy(); + mSurface.destroy(); + mSurfaceControl.destroy(); + mSurfaceSession.kill(); + mBitmapRenderNode.destroy(); + mHandler.removeCallbacks(mMagnifierUpdater); + if (mBitmap != null) { + mBitmap.recycle(); + } + } + } + + private void doDraw() { + final ThreadedRenderer.FrameDrawingCallback callback; + + // Draw the current bitmap to the surface, and prepare the callback which updates the + // surface position. These have to be in the same synchronized block, in order to + // guarantee the consistency between the bitmap content and the surface position. + synchronized (mLock) { + if (!mSurface.isValid()) { + // Probably #destroy() was called for the current instance, so we skip the draw. + return; + } + + final DisplayListCanvas canvas = + mBitmapRenderNode.start(mContentWidth, mContentHeight); + try { + final Rect srcRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); + final Rect dstRect = new Rect(0, 0, mContentWidth, mContentHeight); + final Paint paint = new Paint(); + paint.setFilterBitmap(true); + canvas.drawBitmap(mBitmap, srcRect, dstRect, paint); + } finally { + mBitmapRenderNode.end(canvas); + } + + if (mPendingWindowPositionUpdate || mFirstDraw) { + // If the window has to be shown or moved, defer this until the next draw. + final boolean firstDraw = mFirstDraw; + mFirstDraw = false; + final boolean updateWindowPosition = mPendingWindowPositionUpdate; + mPendingWindowPositionUpdate = false; + final int pendingX = mWindowPositionX; + final int pendingY = mWindowPositionY; + + callback = frame -> { + synchronized (mLock) { + if (!mSurface.isValid()) { + return; + } + mRenderer.setLightCenter(mDisplay, pendingX, pendingY); + // Show or move the window at the content draw frame. + SurfaceControl.openTransaction(); + mSurfaceControl.deferTransactionUntil(mSurface, frame); + if (updateWindowPosition) { + mSurfaceControl.setPosition(pendingX, pendingY); + } + if (firstDraw) { + mSurfaceControl.show(); + } + SurfaceControl.closeTransaction(); + } + }; + } else { + callback = null; + } + + mFrameDrawScheduled = false; + } + + mRenderer.draw(callback); + if (mCallback != null) { + mCallback.onOperationComplete(); + } + } } - private ImageView getImageView() { - return mWindow.getContentView().findViewById( - com.android.internal.R.id.magnifier_image); + // The rest of the file consists of test APIs. + + /** + * See {@link #setOnOperationCompleteCallback(Callback)}. + */ + @TestApi + private Callback mCallback; + + /** + * Sets a callback which will be invoked at the end of the next + * {@link #show(float, float)} or {@link #update()} operation. + * + * @hide + */ + @TestApi + public void setOnOperationCompleteCallback(final Callback callback) { + mCallback = callback; + if (mWindow != null) { + mWindow.mCallback = callback; + } } /** @@ -278,8 +589,13 @@ public final class Magnifier { * @hide */ @TestApi - public Bitmap getContent() { - return mBitmap; + public @Nullable Bitmap getContent() { + if (mWindow == null) { + return null; + } + synchronized (mWindow.mLock) { + return mWindow.mBitmap; + } } /** @@ -296,7 +612,7 @@ public final class Magnifier { final int left = mWindowCoords.x + viewLocationOnScreen[0] - viewLocationInSurface[0]; final int top = mWindowCoords.y + viewLocationOnScreen[1] - viewLocationInSurface[1]; - return new Rect(left, top, left + mWindow.getWidth(), top + mWindow.getHeight()); + return new Rect(left, top, left + mWindowWidth, top + mWindowHeight); } /** @@ -313,4 +629,15 @@ public final class Magnifier { size.y = resources.getDimension(com.android.internal.R.dimen.magnifier_height) / density; return size; } + + /** + * @hide + */ + @TestApi + public interface Callback { + /** + * Callback called after the drawing for a magnifier update has happened. + */ + void onOperationComplete(); + } } diff --git a/core/java/android/widget/MediaControlView2.java b/core/java/android/widget/MediaControlView2.java index 7d556bf450b4..273b9edb4629 100644 --- a/core/java/android/widget/MediaControlView2.java +++ b/core/java/android/widget/MediaControlView2.java @@ -80,46 +80,57 @@ public class MediaControlView2 extends ViewGroupHelper<MediaControlView2Provider /** * MediaControlView2 button value for playing and pausing media. + * @hide */ public static final int BUTTON_PLAY_PAUSE = 1; /** * MediaControlView2 button value for jumping 30 seconds forward. + * @hide */ public static final int BUTTON_FFWD = 2; /** * MediaControlView2 button value for jumping 10 seconds backward. + * @hide */ public static final int BUTTON_REW = 3; /** * MediaControlView2 button value for jumping to next media. + * @hide */ public static final int BUTTON_NEXT = 4; /** * MediaControlView2 button value for jumping to previous media. + * @hide */ public static final int BUTTON_PREV = 5; /** * MediaControlView2 button value for showing/hiding subtitle track. + * @hide */ public static final int BUTTON_SUBTITLE = 6; /** * MediaControlView2 button value for toggling full screen. + * @hide */ public static final int BUTTON_FULL_SCREEN = 7; /** * MediaControlView2 button value for showing/hiding overflow buttons. + * @hide */ public static final int BUTTON_OVERFLOW = 8; /** * MediaControlView2 button value for muting audio. + * @hide */ public static final int BUTTON_MUTE = 9; /** * MediaControlView2 button value for adjusting aspect ratio of view. + * @hide */ public static final int BUTTON_ASPECT_RATIO = 10; /** * MediaControlView2 button value for showing/hiding settings page. + * @hide */ public static final int BUTTON_SETTINGS = 11; @@ -187,6 +198,7 @@ public class MediaControlView2 extends ViewGroupHelper<MediaControlView2Provider * <li>{@link #BUTTON_SETTINGS} * </ul> * @param visibility One of {@link #VISIBLE}, {@link #INVISIBLE}, or {@link #GONE}. + * @hide */ public void setButtonVisibility(@Button int button, @Visibility int visibility) { mProvider.setButtonVisibility_impl(button, visibility); diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java index 69c1fb621628..a7ae3234c4d3 100644 --- a/core/java/android/widget/VideoView2.java +++ b/core/java/android/widget/VideoView2.java @@ -22,7 +22,8 @@ import android.annotation.Nullable; import android.content.Context; import android.media.AudioAttributes; import android.media.AudioManager; -import android.media.MediaPlayerInterface; +import android.media.MediaMetadata2; +import android.media.MediaPlayerBase; import android.media.session.MediaController; import android.media.session.MediaSession; import android.media.session.PlaybackState; @@ -168,6 +169,27 @@ public class VideoView2 extends ViewGroupHelper<VideoView2Provider> { return mProvider.getMediaControlView2_impl(); } + /** + * Sets MediaMetadata2 instance. It will replace the previously assigned MediaMetadata2 instance + * if any. + * + * @param metadata a MediaMetadata2 instance. + * @hide + */ + public void setMediaMetadata(MediaMetadata2 metadata) { + mProvider.setMediaMetadata_impl(metadata); + } + + /** + * Returns MediaMetadata2 instance which is retrieved from MediaPlayer2 inside VideoView2 by + * default or by {@link #setMediaMetadata} method. + * @hide + */ + public MediaMetadata2 getMediaMetadata() { + // TODO: add to Javadoc whether this value can be null or not when integrating with + // MediaSession2. + return mProvider.getMediaMetadata_impl(); + } /** * Returns MediaController instance which is connected with MediaSession that VideoView2 is @@ -255,7 +277,7 @@ public class VideoView2 extends ViewGroupHelper<VideoView2Provider> { * @hide */ public void setRouteAttributes(@NonNull List<String> routeCategories, - @Nullable MediaPlayerInterface player) { + @Nullable MediaPlayerBase player) { mProvider.setRouteAttributes_impl(routeCategories, player); } diff --git a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java index 293471c686e5..ffc21d5ea9e1 100644 --- a/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java +++ b/core/java/com/android/internal/accessibility/AccessibilityShortcutController.java @@ -319,7 +319,7 @@ public class AccessibilityShortcutController { } final PackageManager pm = mContext.getPackageManager(); String label = serviceInfo.getResolveInfo().loadLabel(pm).toString(); - String summary = serviceInfo.loadSummary(pm).toString(); + CharSequence summary = serviceInfo.loadSummary(pm); if (!includeSummary || TextUtils.isEmpty(summary)) { return label; } diff --git a/core/java/com/android/internal/app/ColorDisplayController.java b/core/java/com/android/internal/app/ColorDisplayController.java index b8682a89eb95..278d31af7bde 100644 --- a/core/java/com/android/internal/app/ColorDisplayController.java +++ b/core/java/com/android/internal/app/ColorDisplayController.java @@ -22,6 +22,7 @@ import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; +import android.metrics.LogMaker; import android.net.Uri; import android.os.Handler; import android.os.Looper; @@ -31,6 +32,8 @@ import android.provider.Settings.System; import android.util.Slog; import com.android.internal.R; +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -109,10 +112,10 @@ public final class ColorDisplayController { private final Context mContext; private final int mUserId; - private final ContentObserver mContentObserver; private Callback mCallback; + private MetricsLogger mMetricsLogger; public ColorDisplayController(@NonNull Context context) { this(context, ActivityManager.getCurrentUser()); @@ -209,6 +212,15 @@ public final class ColorDisplayController { } /** + * Returns the current auto mode value, without validation, or {@code 1} if the auto mode has + * never been set. + */ + public int getAutoModeRaw() { + return Secure.getIntForUser(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, + -1, mUserId); + } + + /** * Sets the current auto mode value controlling when Night display will be automatically * activated. One of {@link #AUTO_MODE_DISABLED}, {@link #AUTO_MODE_CUSTOM}, or * {@link #AUTO_MODE_TWILIGHT}. @@ -228,7 +240,12 @@ public final class ColorDisplayController { Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, null, mUserId); + getMetricsLogger().write(new LogMaker( + MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CHANGED) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(autoMode)); } + return Secure.putIntForUser(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE, autoMode, mUserId); } @@ -263,6 +280,10 @@ public final class ColorDisplayController { if (startTime == null) { throw new IllegalArgumentException("startTime cannot be null"); } + getMetricsLogger().write(new LogMaker( + MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CUSTOM_TIME_CHANGED) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(0)); return Secure.putIntForUser(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_CUSTOM_START_TIME, startTime.toSecondOfDay() * 1000, mUserId); } @@ -297,6 +318,10 @@ public final class ColorDisplayController { if (endTime == null) { throw new IllegalArgumentException("endTime cannot be null"); } + getMetricsLogger().write(new LogMaker( + MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CUSTOM_TIME_CHANGED) + .setType(MetricsEvent.TYPE_ACTION) + .setSubtype(1)); return Secure.putIntForUser(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_CUSTOM_END_TIME, endTime.toSecondOfDay() * 1000, mUserId); } @@ -450,6 +475,13 @@ public final class ColorDisplayController { } } + private MetricsLogger getMetricsLogger() { + if (mMetricsLogger == null) { + mMetricsLogger = new MetricsLogger(); + } + return mMetricsLogger; + } + /** * Returns {@code true} if Night display is supported by the device. */ diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9b4ea338a18f..7fc36bc8f63f 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -137,7 +137,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 175 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 176 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS; @@ -2823,6 +2823,7 @@ public class BatteryStatsImpl extends BatteryStats { implements Parcelable { private final LongSamplingCounter mIdleTimeMillis; private final LongSamplingCounter mScanTimeMillis; + private final LongSamplingCounter mSleepTimeMillis; private final LongSamplingCounter mRxTimeMillis; private final LongSamplingCounter[] mTxTimeMillis; private final LongSamplingCounter mPowerDrainMaMs; @@ -2830,6 +2831,7 @@ public class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl(TimeBase timeBase, int numTxStates) { mIdleTimeMillis = new LongSamplingCounter(timeBase); mScanTimeMillis = new LongSamplingCounter(timeBase); + mSleepTimeMillis = new LongSamplingCounter(timeBase); mRxTimeMillis = new LongSamplingCounter(timeBase); mTxTimeMillis = new LongSamplingCounter[numTxStates]; for (int i = 0; i < numTxStates; i++) { @@ -2841,6 +2843,7 @@ public class BatteryStatsImpl extends BatteryStats { public ControllerActivityCounterImpl(TimeBase timeBase, int numTxStates, Parcel in) { mIdleTimeMillis = new LongSamplingCounter(timeBase, in); mScanTimeMillis = new LongSamplingCounter(timeBase, in); + mSleepTimeMillis = new LongSamplingCounter(timeBase, in); mRxTimeMillis = new LongSamplingCounter(timeBase, in); final int recordedTxStates = in.readInt(); if (recordedTxStates != numTxStates) { @@ -2857,6 +2860,7 @@ public class BatteryStatsImpl extends BatteryStats { public void readSummaryFromParcel(Parcel in) { mIdleTimeMillis.readSummaryFromParcelLocked(in); mScanTimeMillis.readSummaryFromParcelLocked(in); + mSleepTimeMillis.readSummaryFromParcelLocked(in); mRxTimeMillis.readSummaryFromParcelLocked(in); final int recordedTxStates = in.readInt(); if (recordedTxStates != mTxTimeMillis.length) { @@ -2876,6 +2880,7 @@ public class BatteryStatsImpl extends BatteryStats { public void writeSummaryToParcel(Parcel dest) { mIdleTimeMillis.writeSummaryFromParcelLocked(dest); mScanTimeMillis.writeSummaryFromParcelLocked(dest); + mSleepTimeMillis.writeSummaryFromParcelLocked(dest); mRxTimeMillis.writeSummaryFromParcelLocked(dest); dest.writeInt(mTxTimeMillis.length); for (LongSamplingCounter counter : mTxTimeMillis) { @@ -2888,6 +2893,7 @@ public class BatteryStatsImpl extends BatteryStats { public void writeToParcel(Parcel dest, int flags) { mIdleTimeMillis.writeToParcel(dest); mScanTimeMillis.writeToParcel(dest); + mSleepTimeMillis.writeToParcel(dest); mRxTimeMillis.writeToParcel(dest); dest.writeInt(mTxTimeMillis.length); for (LongSamplingCounter counter : mTxTimeMillis) { @@ -2899,6 +2905,7 @@ public class BatteryStatsImpl extends BatteryStats { public void reset(boolean detachIfReset) { mIdleTimeMillis.reset(detachIfReset); mScanTimeMillis.reset(detachIfReset); + mSleepTimeMillis.reset(detachIfReset); mRxTimeMillis.reset(detachIfReset); for (LongSamplingCounter counter : mTxTimeMillis) { counter.reset(detachIfReset); @@ -2909,6 +2916,7 @@ public class BatteryStatsImpl extends BatteryStats { public void detach() { mIdleTimeMillis.detach(); mScanTimeMillis.detach(); + mSleepTimeMillis.detach(); mRxTimeMillis.detach(); for (LongSamplingCounter counter : mTxTimeMillis) { counter.detach(); @@ -2935,6 +2943,15 @@ public class BatteryStatsImpl extends BatteryStats { } /** + * @return a LongSamplingCounter, measuring time spent in the sleep state in + * milliseconds. + */ + @Override + public LongSamplingCounter getSleepTimeCounter() { + return mSleepTimeMillis; + } + + /** * @return a LongSamplingCounter, measuring time spent in the receive state in * milliseconds. */ @@ -11438,6 +11455,8 @@ public class BatteryStatsImpl extends BatteryStats { mHasModemReporting = true; mModemActivity.getIdleTimeCounter().addCountLocked( deltaInfo.getIdleTimeMillis()); + mModemActivity.getSleepTimeCounter().addCountLocked( + deltaInfo.getSleepTimeMillis()); mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getRxTimeMillis()); for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) { mModemActivity.getTxTimeCounters()[lvl] @@ -12587,7 +12606,7 @@ public class BatteryStatsImpl extends BatteryStats { temp = Math.max(0, temp); reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, - status, plugType, level, temp); + status, plugType, level); final boolean onBattery = isOnBattery(plugType, status); final long uptime = mClocks.uptimeMillis(); @@ -12786,7 +12805,7 @@ public class BatteryStatsImpl extends BatteryStats { // Inform StatsLog of setBatteryState changes. // If this is the first reporting, pass in recentPast == null. private void reportChangesToStatsLog(HistoryItem recentPast, - final int status, final int plugType, final int level, final int temp) { + final int status, final int plugType, final int level) { if (recentPast == null || recentPast.batteryStatus != status) { StatsLog.write(StatsLog.CHARGING_STATE_CHANGED, status); @@ -12797,8 +12816,6 @@ public class BatteryStatsImpl extends BatteryStats { if (recentPast == null || recentPast.batteryLevel != level) { StatsLog.write(StatsLog.BATTERY_LEVEL_CHANGED, level); } - // Let's just always print the temperature, regardless of whether it changed. - StatsLog.write(StatsLog.DEVICE_TEMPERATURE_REPORTED, temp); } public long getAwakeTimeBattery() { @@ -12960,6 +12977,7 @@ public class BatteryStatsImpl extends BatteryStats { final int which = STATS_SINCE_CHARGED; final long rawRealTime = SystemClock.elapsedRealtime() * 1000; final ControllerActivityCounter counter = getModemControllerActivity(); + final long sleepTimeMs = counter.getSleepTimeCounter().getCountLocked(which); final long idleTimeMs = counter.getIdleTimeCounter().getCountLocked(which); final long rxTimeMs = counter.getRxTimeCounter().getCountLocked(which); final long energyConsumedMaMs = counter.getPowerCounter().getCountLocked(which); @@ -12979,10 +12997,6 @@ public class BatteryStatsImpl extends BatteryStats { txTimeMs[i] = counter.getTxTimeCounters()[i].getCountLocked(which); totalTxTimeMs += txTimeMs[i]; } - final long totalControllerActivityTimeMs - = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which) / 1000; - final long sleepTimeMs - = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs); s.setLoggingDurationMs(computeBatteryRealtime(rawRealTime, which) / 1000); s.setKernelActiveTimeMs(getMobileRadioActiveTime(rawRealTime, which) / 1000); s.setNumPacketsTx(getNetworkActivityPackets(NETWORK_MOBILE_TX_DATA, which)); @@ -14602,6 +14616,7 @@ public class BatteryStatsImpl extends BatteryStats { u.mJobsFreshnessTimeMs.writeSummaryFromParcelLocked(out); for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) { if (u.mJobsFreshnessBuckets[i] != null) { + out.writeInt(1); u.mJobsFreshnessBuckets[i].writeSummaryFromParcelLocked(out); } else { out.writeInt(0); diff --git a/core/java/com/android/internal/os/KernelWakelockReader.java b/core/java/com/android/internal/os/KernelWakelockReader.java index 7178ec7af20b..46667d1ea688 100644 --- a/core/java/com/android/internal/os/KernelWakelockReader.java +++ b/core/java/com/android/internal/os/KernelWakelockReader.java @@ -16,6 +16,7 @@ package com.android.internal.os; import android.os.Process; +import android.os.StrictMode; import android.os.SystemClock; import android.util.Slog; @@ -69,6 +70,7 @@ public class KernelWakelockReader { boolean wakeup_sources; final long startTime = SystemClock.uptimeMillis(); + final int oldMask = StrictMode.allowThreadDiskReadsMask(); try { FileInputStream is; try { @@ -90,6 +92,8 @@ public class KernelWakelockReader { } catch (java.io.IOException e) { Slog.wtf(TAG, "failed to read kernel wakelocks", e); return null; + } finally { + StrictMode.setThreadPolicyMask(oldMask); } final long readTime = SystemClock.uptimeMillis() - startTime; diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 03a7cd26da36..50c9d6c69ac9 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -2040,6 +2040,10 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { if (getKeyguardManager().inKeyguardRestrictedInputMode()) { break; } + if ((getContext().getResources().getConfiguration().uiMode + & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_WATCH) { + break; + } if (event.isTracking() && !event.isCanceled()) { launchDefaultSearch(event); } diff --git a/core/java/com/android/internal/util/IndentingPrintWriter.java b/core/java/com/android/internal/util/IndentingPrintWriter.java index 696667c6202b..e453866b05af 100644 --- a/core/java/com/android/internal/util/IndentingPrintWriter.java +++ b/core/java/com/android/internal/util/IndentingPrintWriter.java @@ -57,26 +57,46 @@ public class IndentingPrintWriter extends PrintWriter { mWrapLength = wrapLength; } - public void increaseIndent() { + public IndentingPrintWriter setIndent(String indent) { + mIndentBuilder.setLength(0); + mIndentBuilder.append(indent); + mCurrentIndent = null; + return this; + } + + public IndentingPrintWriter setIndent(int indent) { + mIndentBuilder.setLength(0); + for (int i = 0; i < indent; i++) { + increaseIndent(); + } + return this; + } + + public IndentingPrintWriter increaseIndent() { mIndentBuilder.append(mSingleIndent); mCurrentIndent = null; + return this; } - public void decreaseIndent() { + public IndentingPrintWriter decreaseIndent() { mIndentBuilder.delete(0, mSingleIndent.length()); mCurrentIndent = null; + return this; } - public void printPair(String key, Object value) { + public IndentingPrintWriter printPair(String key, Object value) { print(key + "=" + String.valueOf(value) + " "); + return this; } - public void printPair(String key, Object[] value) { + public IndentingPrintWriter printPair(String key, Object[] value) { print(key + "=" + Arrays.toString(value) + " "); + return this; } - public void printHexPair(String key, int value) { + public IndentingPrintWriter printHexPair(String key, int value) { print(key + "=0x" + Integer.toHexString(value) + " "); + return this; } @Override diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl index 732534ccbcbe..d3fc644c2341 100644 --- a/core/java/com/android/internal/widget/ILockSettings.aidl +++ b/core/java/com/android/internal/widget/ILockSettings.aidl @@ -22,6 +22,7 @@ import android.os.Bundle; import android.security.keystore.recovery.WrappedApplicationKey; import android.security.keystore.recovery.KeyChainSnapshot; import android.security.keystore.recovery.KeyChainProtectionParams; +import android.security.keystore.recovery.RecoveryCertPath; import com.android.internal.widget.ICheckCredentialProgressCallback; import com.android.internal.widget.VerifyCredentialResponse; @@ -66,14 +67,14 @@ interface ILockSettings { void initRecoveryService(in String rootCertificateAlias, in byte[] signedPublicKeyList); KeyChainSnapshot getKeyChainSnapshot(); byte[] generateAndStoreKey(String alias); - String generateKey(String alias, in byte[] account); + String generateKey(String alias); String getKey(String alias); void removeKey(String alias); void setSnapshotCreatedPendingIntent(in PendingIntent intent); Map getRecoverySnapshotVersions(); void setServerParams(in byte[] serverParams); - void setRecoveryStatus(in String packageName, in String[] aliases, int status); - Map getRecoveryStatus(in String packageName); + void setRecoveryStatus(in String alias, int status); + Map getRecoveryStatus(); void setRecoverySecretTypes(in int[] secretTypes); int[] getRecoverySecretTypes(); int[] getPendingRecoverySecretTypes(); @@ -81,6 +82,9 @@ interface ILockSettings { byte[] startRecoverySession(in String sessionId, in byte[] verifierPublicKey, in byte[] vaultParams, in byte[] vaultChallenge, in List<KeyChainProtectionParams> secrets); + byte[] startRecoverySessionWithCertPath(in String sessionId, + in RecoveryCertPath verifierCertPath, in byte[] vaultParams, in byte[] vaultChallenge, + in List<KeyChainProtectionParams> secrets); Map/*<String, byte[]>*/ recoverKeys(in String sessionId, in byte[] recoveryKeyBlob, in List<WrappedApplicationKey> applicationKeys); void closeSession(in String sessionId); diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java index 7a248f264274..51dd92961f54 100644 --- a/core/java/com/android/internal/widget/LockPatternView.java +++ b/core/java/com/android/internal/widget/LockPatternView.java @@ -125,6 +125,7 @@ public class LockPatternView extends View { private boolean mInStealthMode = false; private boolean mEnableHapticFeedback = true; private boolean mPatternInProgress = false; + private boolean mFadePattern = true; private float mHitFactor = 0.6f; @@ -376,6 +377,14 @@ public class LockPatternView extends View { } /** + * Set whether the pattern should fade as it's being drawn. If + * true, each segment of the pattern fades over time. + */ + public void setFadePattern(boolean fadePattern) { + mFadePattern = fadePattern; + } + + /** * Set whether the view will use tactile feedback. If true, there will be * tactile feedback as the user enters the pattern. * @@ -1167,10 +1176,18 @@ public class LockPatternView extends View { currentPath.moveTo(lastX, lastY); if (state.lineEndX != Float.MIN_VALUE && state.lineEndY != Float.MIN_VALUE) { currentPath.lineTo(state.lineEndX, state.lineEndY); - mPathPaint.setAlpha((int) 255 - lineFadeVal ); + if (mFadePattern) { + mPathPaint.setAlpha((int) 255 - lineFadeVal ); + } else { + mPathPaint.setAlpha(255); + } } else { currentPath.lineTo(centerX, centerY); - mPathPaint.setAlpha((int) 255 - lineFadeVal ); + if (mFadePattern) { + mPathPaint.setAlpha((int) 255 - lineFadeVal ); + } else { + mPathPaint.setAlpha(255); + } } canvas.drawPath(currentPath, mPathPaint); } diff --git a/core/jni/android/graphics/AnimatedImageDrawable.cpp b/core/jni/android/graphics/AnimatedImageDrawable.cpp index ba56d592acef..6fd4abf27baa 100644 --- a/core/jni/android/graphics/AnimatedImageDrawable.cpp +++ b/core/jni/android/graphics/AnimatedImageDrawable.cpp @@ -132,6 +132,11 @@ static jboolean AnimatedImageDrawable_nStop(JNIEnv* env, jobject /*clazz*/, jlon // Java's LOOP_INFINITE relies on this being the same. static_assert(SkCodec::kRepetitionCountInfinite == -1); +static jint AnimatedImageDrawable_nGetLoopCount(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) { + auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr); + return drawable->getRepetitionCount(); +} + static void AnimatedImageDrawable_nSetLoopCount(JNIEnv* env, jobject /*clazz*/, jlong nativePtr, jint loopCount) { auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr); @@ -218,6 +223,7 @@ static const JNINativeMethod gAnimatedImageDrawableMethods[] = { { "nIsRunning", "(J)Z", (void*) AnimatedImageDrawable_nIsRunning }, { "nStart", "(J)Z", (void*) AnimatedImageDrawable_nStart }, { "nStop", "(J)Z", (void*) AnimatedImageDrawable_nStop }, + { "nGetLoopCount", "(J)I", (void*) AnimatedImageDrawable_nGetLoopCount }, { "nSetLoopCount", "(JI)V", (void*) AnimatedImageDrawable_nSetLoopCount }, { "nSetOnAnimationEndListener", "(JLandroid/graphics/drawable/AnimatedImageDrawable;)V", (void*) AnimatedImageDrawable_nSetOnAnimationEndListener }, { "nNativeByteSize", "(J)J", (void*) AnimatedImageDrawable_nNativeByteSize }, diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp index 888db32fdfac..b16359727e40 100644 --- a/core/jni/android/opengl/util.cpp +++ b/core/jni/android/opengl/util.cpp @@ -622,29 +622,25 @@ void util_multiplyMV(JNIEnv *env, jclass clazz, // --------------------------------------------------------------------------- -static int checkInternalFormat(SkColorType colorType, int format, int type) +static int checkInternalFormat(SkColorType colorType, int internalformat, + int type) { switch(colorType) { case kN32_SkColorType: + return (type == GL_UNSIGNED_BYTE && + internalformat == GL_RGBA) ? 0 : -1; case kAlpha_8_SkColorType: - if (type == GL_UNSIGNED_BYTE) - return 0; + return (type == GL_UNSIGNED_BYTE && + internalformat == GL_ALPHA) ? 0 : -1; case kARGB_4444_SkColorType: + return (type == GL_UNSIGNED_SHORT_4_4_4_4 && + internalformat == GL_RGBA) ? 0 : -1; case kRGB_565_SkColorType: - switch (type) { - case GL_UNSIGNED_SHORT_4_4_4_4: - case GL_UNSIGNED_SHORT_5_6_5: - case GL_UNSIGNED_SHORT_5_5_5_1: - return 0; - case GL_UNSIGNED_BYTE: - if (format == GL_LUMINANCE_ALPHA) - return 0; - } - break; + return (type == GL_UNSIGNED_SHORT_5_6_5 && + internalformat == GL_RGB) ? 0 : -1; case kRGBA_F16_SkColorType: - if (type == GL_HALF_FLOAT && format == GL_RGBA16F) - return 0; - break; + return (type == GL_HALF_FLOAT && + internalformat == GL_RGBA16F) ? 0 : -1; default: break; } diff --git a/core/jni/android_media_MicrophoneInfo.cpp b/core/jni/android_media_MicrophoneInfo.cpp index 9198cbe648eb..5bd808b67c57 100644 --- a/core/jni/android_media_MicrophoneInfo.cpp +++ b/core/jni/android_media_MicrophoneInfo.cpp @@ -65,13 +65,11 @@ jint convertMicrophoneInfoFromNative(JNIEnv *env, jobject *jMicrophoneInfo, } jGeometricLocation = env->NewObject(gMicrophoneInfoCoordinateClass, gMicrophoneInfoCoordinateCstor, - NULL, microphoneInfo->getGeometricLocation()[0], microphoneInfo->getGeometricLocation()[1], microphoneInfo->getGeometricLocation()[2]); jOrientation = env->NewObject(gMicrophoneInfoCoordinateClass, gMicrophoneInfoCoordinateCstor, - NULL, microphoneInfo->getOrientation()[0], microphoneInfo->getOrientation()[1], microphoneInfo->getOrientation()[2]); @@ -177,7 +175,7 @@ int register_android_media_MicrophoneInfo(JNIEnv *env) env, "android/media/MicrophoneInfo$Coordinate3F"); gMicrophoneInfoCoordinateClass = MakeGlobalRefOrDie(env, microphoneInfoCoordinateClass); gMicrophoneInfoCoordinateCstor = GetMethodIDOrDie(env, microphoneInfoCoordinateClass, "<init>", - "(Landroid/media/MicrophoneInfo;FFF)V"); + "(FFF)V"); jclass pairClass = FindClassOrDie(env, "android/util/Pair"); gPairClass = MakeGlobalRefOrDie(env, pairClass); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 9f3475abe564..13e0e4a6bdb7 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -68,6 +68,10 @@ struct { jmethodID callback; } gFrameMetricsObserverClassInfo; +struct { + jmethodID onFrameDraw; +} gFrameDrawingCallback; + static JNIEnv* getenv(JavaVM* vm) { JNIEnv* env; if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) { @@ -849,6 +853,44 @@ static void android_view_ThreadedRenderer_setContentDrawBounds(JNIEnv* env, proxy->setContentDrawBounds(left, top, right, bottom); } +class JGlobalRefHolder { +public: + JGlobalRefHolder(JavaVM* vm, jobject object) : mVm(vm), mObject(object) {} + + virtual ~JGlobalRefHolder() { + getenv(mVm)->DeleteGlobalRef(mObject); + mObject = nullptr; + } + + jobject object() { return mObject; } + JavaVM* vm() { return mVm; } + +private: + JGlobalRefHolder(const JGlobalRefHolder&) = delete; + void operator=(const JGlobalRefHolder&) = delete; + + JavaVM* mVm; + jobject mObject; +}; + +static void android_view_ThreadedRenderer_setFrameCallback(JNIEnv* env, + jobject clazz, jlong proxyPtr, jobject frameCallback) { + RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); + if (!frameCallback) { + proxy->setFrameCallback(nullptr); + } else { + JavaVM* vm = nullptr; + LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM"); + auto globalCallbackRef = std::make_shared<JGlobalRefHolder>(vm, + env->NewGlobalRef(frameCallback)); + proxy->setFrameCallback([globalCallbackRef](int64_t frameNr) { + JNIEnv* env = getenv(globalCallbackRef->vm()); + env->CallVoidMethod(globalCallbackRef->object(), gFrameDrawingCallback.onFrameDraw, + static_cast<jlong>(frameNr)); + }); + } +} + static jint android_view_ThreadedRenderer_copySurfaceInto(JNIEnv* env, jobject clazz, jobject jsurface, jint left, jint top, jint right, jint bottom, jobject jbitmap) { @@ -1034,6 +1076,8 @@ static const JNINativeMethod gMethods[] = { { "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode}, { "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode}, { "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds}, + { "nSetFrameCallback", "(JLandroid/view/ThreadedRenderer$FrameDrawingCallback;)V", + (void*)android_view_ThreadedRenderer_setFrameCallback}, { "nAddFrameMetricsObserver", "(JLandroid/view/FrameMetricsObserver;)J", (void*)android_view_ThreadedRenderer_addFrameMetricsObserver }, @@ -1078,6 +1122,11 @@ int register_android_view_ThreadedRenderer(JNIEnv* env) { gFrameMetricsObserverClassInfo.timingDataBuffer = GetFieldIDOrDie( env, metricsClass, "mTimingData", "[J"); + jclass frameCallbackClass = FindClassOrDie(env, + "android/view/ThreadedRenderer$FrameDrawingCallback"); + gFrameDrawingCallback.onFrameDraw = GetMethodIDOrDie(env, frameCallbackClass, + "onFrameDraw", "(J)V"); + return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); } diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto index a62d56ca5a86..834ecdee6a9f 100644 --- a/core/proto/android/content/configuration.proto +++ b/core/proto/android/content/configuration.proto @@ -25,7 +25,7 @@ import "frameworks/base/core/proto/android/content/locale.proto"; import "frameworks/base/libs/incident/proto/android/privacy.proto"; /** - * An android resource configuration. + * An android Configuration object. */ message ConfigurationProto { option (.android.msg_privacy).dest = DEST_AUTOMATIC; @@ -35,17 +35,65 @@ message ConfigurationProto { optional uint32 mnc = 3; repeated LocaleProto locales = 4; optional uint32 screen_layout = 5; - optional uint32 touchscreen = 6; - optional uint32 keyboard_hidden = 7; - optional uint32 hard_keyboard_hidden = 8; - optional uint32 navigation = 9; - optional uint32 navigation_hidden = 10; - optional uint32 orientation = 11; - optional uint32 ui_mode = 12; - optional uint32 screen_width_dp = 13; - optional uint32 screen_height_dp = 14; - optional uint32 smallest_screen_width_dp = 15; - optional uint32 density_dpi = 16; - optional .android.app.WindowConfigurationProto window_configuration = 17; + optional uint32 hdr_color_mode = 6; + optional uint32 wide_color_gamut = 7; + optional uint32 touchscreen = 8; + optional uint32 keyboard_hidden = 9; + optional uint32 hard_keyboard_hidden = 10; + optional uint32 navigation = 11; + optional uint32 navigation_hidden = 12; + optional uint32 orientation = 13; + optional uint32 ui_mode = 14; + optional uint32 screen_width_dp = 15; + optional uint32 screen_height_dp = 16; + optional uint32 smallest_screen_width_dp = 17; + optional uint32 density_dpi = 18; + optional .android.app.WindowConfigurationProto window_configuration = 19; } +/** + * All current configuration data used to select resources. + */ +message ResourcesConfigurationProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + required ConfigurationProto configuration = 1; + + optional uint32 sdk_version = 2; + optional uint32 screen_width_px = 3; + optional uint32 screen_height_px = 4; +} + +/** + * Overall device configuration data. + */ +message DeviceConfigurationProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + optional uint32 stable_screen_width_px = 1; + optional uint32 stable_screen_height_px = 2; + optional uint32 stable_density_dpi = 3; + + optional uint64 total_ram = 4; + optional bool low_ram = 5; + optional uint32 max_cores = 6; + optional bool has_secure_screen_lock = 7; + + optional uint32 opengl_version = 8; + repeated string opengl_extensions = 9; + + repeated string shared_libraries = 10; + repeated string features = 11; + repeated string cpu_architectures = 12; +} + +/** + * All current configuration data device is running with, everything used + * to filter and target apps. + */ +message GlobalConfigurationProto { + option (.android.msg_privacy).dest = DEST_AUTOMATIC; + + optional ResourcesConfigurationProto resources = 1; + optional DeviceConfigurationProto device = 2; +} diff --git a/core/proto/android/os/enums.proto b/core/proto/android/os/enums.proto index fe9b7ac01291..aa99ac75cbdf 100644 --- a/core/proto/android/os/enums.proto +++ b/core/proto/android/os/enums.proto @@ -56,6 +56,17 @@ enum BatteryStatusEnum { BATTERY_STATUS_FULL = 5; } +// These constants are defined in hardware/interfaces/thermal/1.0/types.hal +// They are primarily used by android/os/HardwarePropertiesManager.java. +// Any change to the types in the thermal hal should be made here as well. +enum TemperatureTypeEnum { + TEMPERATURE_TYPE_UKNOWN = -1; + TEMPERATURE_TYPE_CPU = 0; + TEMPERATURE_TYPE_GPU = 1; + TEMPERATURE_TYPE_BATTERY = 2; + TEMPERATURE_TYPE_SKIN = 3; +} + // Wakelock types, primarily used by android/os/PowerManager.java. enum WakeLockLevelEnum { // NOTE: Wake lock levels were previously defined as a bit field, except diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto index c35b2ece6070..9752d3b0a3d8 100644 --- a/core/proto/android/providers/settings.proto +++ b/core/proto/android/providers/settings.proto @@ -179,9 +179,11 @@ message GlobalSettingsProto { optional SettingProto tether_dun_required = 114 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto tether_dun_apn = 115; optional SettingProto tether_offload_disabled = 301 [ (android.privacy).dest = DEST_AUTOMATIC ]; - // List of carrier apps which are whitelisted to prompt the user for install - // when a SIM card with marchin UICC carrier privilege rules is inserted. + // List of carrier app certificate mapped to carrier app package id which are whitelisted to + // prompt the user for install when a SIM card with matching UICC carrier privilege rules is + // inserted. optional SettingProto carrier_app_whitelist = 116 [ (android.privacy).dest = DEST_AUTOMATIC ]; + optional SettingProto carrier_app_names = 358 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto usb_mass_storage_enabled = 117 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto use_google_mail = 118 [ (android.privacy).dest = DEST_AUTOMATIC ]; optional SettingProto webview_data_reduction_proxy_key = 119; @@ -433,7 +435,7 @@ message GlobalSettingsProto { // Please insert fields in the same order as in // frameworks/base/core/java/android/provider/Settings.java. - // Next tag = 356; + // Next tag = 359; } message SecureSettingsProto { diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto index 304e63f28151..69abed30234d 100644 --- a/core/proto/android/server/jobscheduler.proto +++ b/core/proto/android/server/jobscheduler.proto @@ -36,6 +36,11 @@ message JobSchedulerServiceDumpProto { optional ConstantsProto settings = 1; + optional int32 current_heartbeat = 14; + repeated int32 next_heartbeat = 15; + optional int64 last_heartbeat_time_millis = 16; + optional int64 next_heartbeat_time_millis = 17; + repeated int32 started_users = 2; message RegisteredJob { @@ -54,6 +59,8 @@ message JobSchedulerServiceDumpProto { optional bool is_job_currently_active = 6; optional bool is_uid_backing_up = 7; optional bool is_component_present = 8; + + optional int64 last_run_heartbeat = 9; } repeated RegisteredJob registered_jobs = 3; @@ -201,6 +208,12 @@ message ConstantsProto { // be indices into this array, rather than the raw constants used by // AppIdleHistory. repeated int32 standby_beats = 20; + // The fraction of a job's running window that must pass before we + // consider running it when the network is congested. + optional double conn_congestion_delay_frac = 21; + // The fraction of a prefetch job's running window that must pass before + // we consider matching it against a metered network. + optional double conn_prefetch_relax_frac = 22; } message StateControllerProto { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 2f783456fc45..a7178a01ab90 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2402,6 +2402,12 @@ <permission android:name="android.permission.UPDATE_CONFIG" android:protectionLevel="signature|privileged" /> + <!-- Allows an application to query the current time zone rules state + on device. + @SystemApi @hide --> + <permission android:name="android.permission.QUERY_TIME_ZONE_RULES" + android:protectionLevel="signature|privileged" /> + <!-- Allows a time zone rule updater application to request the system installs / uninstalls timezone rules. <p>An application requesting this permission is responsible for diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml index 81d1300038e3..c298b8090a01 100644 --- a/core/res/res/anim/task_close_enter.xml +++ b/core/res/res/anim/task_close_enter.xml @@ -17,7 +17,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" - android:zAdjustment="top"> + android:zAdjustment="top" + android:showWallpaper="true"> <alpha android:fromAlpha="1" diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml index ab8b89ce7b06..9394c577da78 100644 --- a/core/res/res/anim/task_close_exit.xml +++ b/core/res/res/anim/task_close_exit.xml @@ -17,7 +17,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false"> + android:shareInterpolator="false" + android:showWallpaper="true"> <alpha android:fromAlpha="1.0" diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml index 0e66eda0e29e..e23201f42d3a 100644 --- a/core/res/res/anim/task_open_enter.xml +++ b/core/res/res/anim/task_open_enter.xml @@ -19,7 +19,8 @@ <!-- This should in sync with cross_profile_apps_thumbnail_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" - android:zAdjustment="top"> + android:zAdjustment="top" + android:showWallpaper="true"> <alpha android:fromAlpha="1" diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml index a92425e89960..defea08747e9 100644 --- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml +++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml @@ -19,7 +19,8 @@ <!-- This should in sync with task_open_enter.xml --> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" - android:zAdjustment="top"> + android:zAdjustment="top" + android:showWallpaper="true"> <alpha android:fromAlpha="1" diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml index ecb98ce2cb16..c9ade227819b 100644 --- a/core/res/res/anim/task_open_exit.xml +++ b/core/res/res/anim/task_open_exit.xml @@ -17,7 +17,8 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false"> + android:shareInterpolator="false" + android:showWallpaper="true"> <alpha android:fromAlpha="1.0" diff --git a/core/res/res/drawable-watch/sym_def_app_icon.xml b/core/res/res/drawable-watch/sym_def_app_icon.xml new file mode 100644 index 000000000000..6945256e4b04 --- /dev/null +++ b/core/res/res/drawable-watch/sym_def_app_icon.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> + <background android:drawable="@drawable/sym_def_app_icon_background" /> + <foreground android:drawable="@mipmap/sym_def_app_icon_foreground" /> +</adaptive-icon> diff --git a/core/res/res/drawable-watch/sym_def_app_icon_background.xml b/core/res/res/drawable-watch/sym_def_app_icon_background.xml new file mode 100644 index 000000000000..6d6352f30fb1 --- /dev/null +++ b/core/res/res/drawable-watch/sym_def_app_icon_background.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> + +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="#2374CE"/> +</shape>
\ No newline at end of file diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml index a88836eff5a0..ef19f870006f 100644 --- a/core/res/res/layout/autofill_dataset_picker.xml +++ b/core/res/res/layout/autofill_dataset_picker.xml @@ -14,7 +14,8 @@ limitations under the License. --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<view xmlns:android="http://schemas.android.com/apk/res/android" + class="com.android.server.autofill.ui.FillUi$AutofillFrameLayout" android:id="@+id/autofill_dataset_picker" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -30,4 +31,4 @@ android:visibility="gone"> </ListView> -</FrameLayout> +</view> diff --git a/core/res/res/layout/notification_template_material_ambient.xml b/core/res/res/layout/notification_template_material_ambient.xml index 525d493040fe..346aad6cd80c 100644 --- a/core/res/res/layout/notification_template_material_ambient.xml +++ b/core/res/res/layout/notification_template_material_ambient.xml @@ -43,6 +43,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" + android:layout_weight="1" android:paddingStart="@dimen/notification_content_margin_start" android:paddingEnd="@dimen/notification_content_margin_end" android:clipToPadding="false" @@ -75,19 +76,19 @@ android:maxLines="3" /> </LinearLayout> + <FrameLayout android:id="@+id/actions_container" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="bottom"> + <com.android.internal.widget.NotificationActionListLayout + android:id="@+id/actions" + android:layout_width="match_parent" + android:layout_height="@dimen/notification_action_list_height" + android:paddingEnd="4dp" + android:orientation="horizontal" + android:gravity="center" + android:visibility="gone" + /> + </FrameLayout> </LinearLayout> - <FrameLayout android:id="@+id/actions_container" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_gravity="bottom"> - <com.android.internal.widget.NotificationActionListLayout - android:id="@+id/actions" - android:layout_width="match_parent" - android:layout_height="@dimen/notification_action_list_height" - android:paddingEnd="4dp" - android:orientation="horizontal" - android:gravity="center" - android:visibility="gone" - /> - </FrameLayout> </FrameLayout> diff --git a/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml b/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml new file mode 100644 index 000000000000..69c241c29369 --- /dev/null +++ b/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> +<inset + xmlns:android="http://schemas.android.com/apk/res/android" + android:insetLeft="24dp" + android:insetRight="24dp" + android:insetTop="24dp" + android:insetBottom="24dp"> + <vector + android:width="60dp" + android:height="60dp" + android:viewportWidth="24.0" + android:viewportHeight="24.0"> + <path + android:fillColor="#FFFFFF" + android:pathData="M20,12c0,-2.6 -1.2,-4.8 -3.1,-6.3l-0.5,-2.8c-1.4,-0.7 -2.9,-1.1 -4.5,-1.1c-1.6,0 -3.1,0.4 -4.5,1.1L7,5.7C5.1,7.2 3.9,9.4 3.9,12c0,2.6 1.2,4.8 3.1,6.3l0.5,2.8c1.4,0.7 2.9,1.1 4.5,1.1c1.6,0 3.2,-0.4 4.5,-1.1l0.5,-2.8C18.8,16.8 20,14.6 20,12zM12,18c-3.3,0 -6,-2.7 -6,-6c0,-3.3 2.7,-6 6,-6s6,2.7 6,6C18,15.3 15.3,18 12,18z"/> + <path + android:fillColor="#FFFFFF" + android:pathData="M11.2,15.6h1.4v-4.3h-1.4V15.6zM11.2,9.8h1.4V8.4h-1.4V9.8z"/> + </vector> +</inset> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 17742bf367fb..86b9c5127a31 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Begin programme."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Voltooi herlaai."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> loop"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tik om na program te wissel"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Wissel programme?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"\'n Ander program loop reeds wat gestop moet word voor jy \'n nuwe een kan begin."</string> - <string name="old_app_action" msgid="493129172238566282">"Keer terug na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Moenie die nuwe program begin nie."</string> - <string name="new_app_action" msgid="5472756926945440706">"Begin <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop die ou program sonder om te stoor."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> het berginglimiet oorskry"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hoopstorting is ingesamel; tik om te deel"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Deel hoopstorting?"</string> @@ -1833,6 +1838,6 @@ <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Wysig"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"Stelselveranderinge"</string> - <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Moenie steur nie het verander"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Moenie Steur Nie het verander"</string> <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tik om jou optrede-instellings vir onderbrekings na te gaan"</string> </resources> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 92783e9b25fa..58772d160024 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"የኤስኤምኤስ መልዕክቶች"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"የድምጽ መልዕክቶች"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"የWi-Fi ጥሪ"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"የሲም ሁኔታ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string> <string name="global_action_assist" msgid="3892832961594295030">"ደግፍ"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"መቆለፊያ"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"አዲስ ማሳወቂያ"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ምናባዊ የቁልፍ ሰሌዳ"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"ጠቃሚ ምክር፦ ለማጉላት እና ለማሳነስ ሁለቴ-መታ አድርግ።"</string> <string name="autofill_this_form" msgid="4616758841157816676">"ራስ ሙላ"</string> <string name="setup_autofill" msgid="7103495070180590814">"በራስ ሰር ሙላ አዘጋጅ"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"ራስ-ሙላ"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">"፣ "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"መተግበሪያዎችን በማስጀመር ላይ፡፡"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"አጨራረስ ማስነሻ፡፡"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> አሂድ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ወደ መተግበሪያ ለመቀየር መታ ያድርጉ"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"መተግበሪያዎችን ለውጥ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"አዲስ ከመጀመርህ በፊት መቆም ያለበት ሌላ መተግበሪያ እየሄደ ነው።"</string> - <string name="old_app_action" msgid="493129172238566282">"ወደ <xliff:g id="OLD_APP">%1$s</xliff:g> ተመለስ"</string> - <string name="old_app_description" msgid="2082094275580358049">"አዲሱን መተግበሪያ አትጀምር።"</string> - <string name="new_app_action" msgid="5472756926945440706">"ጀምር <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"የድሮውን ትግበራ ሳታስቀምጥ አቁም።"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> የማህደረ ትውስታ ገደብን አልፏል"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"የቆሻሻ ቁልል ተሰብስቧል፤ ለማጋራት መታ ያድርጉ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"የቆሻሻ ቁልል ይጋራ?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM ካርድ አክል"</string> <string name="sim_added_message" msgid="6599945301141050216">"የተንቀሳቃሽ አውታረ መረብን ለመድረስ መሣሪያህን ድጋሚ አስነሳ።"</string> <string name="sim_restart_button" msgid="4722407842815232347">"ዳግም ጀምር"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"የሞባይል አገልግሎትን አግብር"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"የእርስዎን አዲስ ሲም ለማግበር የአገልግሎት አቅራቢውን መተግበሪያ ያውርዱ"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"መተግበሪያን አውርድ"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"አዲስ ሲም ገብቷል"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"ለማዋቀር መታ ያድርጉ"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"ጊዜ አዘጋጅ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 8bbf52e11fb1..1d48e884fc30 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1165,13 +1165,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"بدء التطبيقات."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"جارٍ إعادة التشغيل."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"انقر للتبديل إلى التطبيق"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"تبديل التطبيقات؟"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"يوجد تطبيق آخر قيد التشغيل فعلاً ويجب إيقافه حتى تتمكن من بدء تطبيق جديد."</string> - <string name="old_app_action" msgid="493129172238566282">"عودة إلى <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"عدم بدء التطبيق الجديد."</string> - <string name="new_app_action" msgid="5472756926945440706">"بدء <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"إيقاف التطبيق القديم بدون الحفظ."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"لقد تجاوزت <xliff:g id="PROC">%1$s</xliff:g> حد الذاكرة."</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"تم نسخ الذاكرة، انقر للمشاركة."</string> <string name="dump_heap_title" msgid="5864292264307651673">"هل تريد مشاركة نَسْخ الذاكرة؟"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index 4842e7ee02df..f0253a22f9f0 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tətbiqə keçmək üçün tıklayın"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tətbiqlərə keçilsin?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bir tətbiq artıq işləyir. Digərini başlatmaq üçün onu dayandırmalısınız."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> bölməsinə qayıdın"</string> - <string name="old_app_description" msgid="2082094275580358049">"Yeni tətbiqi başlatmayın."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqini başladın"</string> - <string name="new_app_description" msgid="1932143598371537340">"Köhnə tətbiqi yadda saxlamadan dayandırın."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> yaddaş limitini keçdi"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın toplanıb; paylaşmaq üçün tıklayın"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Yığın paylaşılsın?"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 2c81b719f9de..6941579217e1 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1105,13 +1105,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Završavanje pokretanja."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste prešli na aplikaciju"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite li da pređete na drugu aplikaciju?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već je pokrenuta druga aplikacija koja mora da bude zaustavljena da biste mogli da pokrenete novu."</string> - <string name="old_app_action" msgid="493129172238566282">"Vrati se u <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne pokrećite novu aplikaciju."</string> - <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zaustavlja staru aplikaciju bez čuvanja."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog dela memorije je napravljen; dodirnite za deljenje"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Želite li da delite snimak dinamičkog dela memorije?"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 3af78d308319..082a7a64de80 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -95,8 +95,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-паведамленні"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Паведамленні галасавой пошты"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-тэлефанія"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Аднарангавая прылада запытала рэжым TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Аднарангавая прылада запытала рэжым TTY НСО"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Аднарангавая прылада запытала рэжым TTY VCO"</string> @@ -246,8 +245,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Налады"</string> <string name="global_action_assist" msgid="3892832961594295030">"Дапамога"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Галас. дапамога"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Блакіроўка"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Новае апавяшчэнне"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальная клавіятура"</string> @@ -834,8 +832,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Падказка: двойчы націсніце, каб павялічыць або паменшыць."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Аўтазапаўненне"</string> <string name="setup_autofill" msgid="7103495070180590814">"Усталяванне аўтазапаўнення"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Аўтазапаўненне"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1128,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск прыкладанняў."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Завяршэнне загрузкі."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Прыкладанне \"<xliff:g id="APP">%1$s</xliff:g>\" запушчанае"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Дакраніцеся, каб пераключыцца на праграму"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Пераключыць прыкладанні?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ужо запушчана іншае прыкладанне, якое павінна быць спынена перад запускам новага."</string> - <string name="old_app_action" msgid="493129172238566282">"Вярнуцца да <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Не запускайце новыя прыкладанні."</string> - <string name="new_app_action" msgid="5472756926945440706">"Запусціць <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Спыніць старыя прыкладанні без захавання."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Быў сабраны дамп кучы; дакраніцеся, каб абагуліць"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Абагуліць дамп дынамічнай вобласці?"</string> @@ -1244,12 +1246,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM-карта дадазеная"</string> <string name="sim_added_message" msgid="6599945301141050216">"Перазагрузіце прыладу, каб атрымаць доступ да мабільнай сеткі."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Перазапусціць"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Уключыць мабільную сувязь"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Спампаваць праграму аператара для актывацыі новай SIM-карты"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Спампаваць праграму"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Устаўлена новая SIM-карта"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Краніце, каб наладзіць"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Задаць час"</string> @@ -1908,10 +1907,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Выяўлена шкодная праграма"</string> <string name="slices_permission_request" msgid="8484943441501672932">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Рэдагаваць"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"Сістэмныя змены"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Зменены налады рэжыму \"Не турбаваць\""</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Націсніце, каб праверыць налады апавяшчэнняў"</string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 66fb2a8fc94a..4319081e276f 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS съобщения"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Съобщения в гласовата поща"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Обаждания през Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Състояние на SIM картата"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Отсрещният потребител заяви пълен TTY режим (FULL)"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Отсрещният потребител заяви TTY режим с пренос на слух (HCO)"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Отсрещният потребител заяви TTY режим с пренос на глас (VCО)"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string> <string name="global_action_assist" msgid="3892832961594295030">"Помощ"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Заключване"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Ново известие"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуална клавиатура"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Съвет: Докоснете двукратно, за да увеличите или намалите мащаба."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Автопоп."</string> <string name="setup_autofill" msgid="7103495070180590814">"Автопоп.: Настройка"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Автоматично попълване"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Приложенията се стартират."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Зареждането завършва."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Докоснете за превключване към приложението"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Да се превключат ли приложенията?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Вече се изпълнява друго приложение, което трябва да бъде спряно, преди да можете да стартирате ново."</string> - <string name="old_app_action" msgid="493129172238566282">"Назад към <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Новото приложение да не се стартира."</string> - <string name="new_app_action" msgid="5472756926945440706">"Стартиране на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Спиране на старото приложение без запазване."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението за памет"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Извлечена е моментна снимка на паметта. Докоснете, за да я споделите"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Да се сподели ли моментната снимка на паметта?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM картата е добавена"</string> <string name="sim_added_message" msgid="6599945301141050216">"Рестартирайте устройството си, за да осъществите достъп до мобилната мрежа."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Рестартиране"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активиране на мобилната услуга"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Изтеглете приложението на оператора, за да активирате новата си SIM карта"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Изтегляне на приложението"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Поставена е нова SIM карта"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Докоснете, за да я настроите"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Задаване на часа"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index c7116c242c59..7052e484910b 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"এসএমএস মেসেজ"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল মেসেজ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"সিম কার্ডের স্টাটাস"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"পির TTY মোড VCO অনুরোধ করেছে"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string> <string name="global_action_assist" msgid="3892832961594295030">"সহযোগিতা"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"লকডাউন"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"নতুন বিজ্ঞপ্তি"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ভার্চুয়াল কীবোর্ড"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"টিপ: জুম বাড়ানো ও কমানোর জন্য দুইবার আলতো চাপুন৷"</string> <string name="autofill_this_form" msgid="4616758841157816676">"স্বতঃপূর্ণ"</string> <string name="setup_autofill" msgid="7103495070180590814">"স্বতঃপূর্ণ সেট করুন"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"আপনাআপনি পূরণ করুন"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$১$২$৩"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"অ্যাপ্লিকেশানগুলি শুরু করা হচ্ছে৷"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"চালু করা সম্পূর্ণ হচ্ছে৷"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> চলছে"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"অ্যাপ্লিকেশান পাল্টাতে আলতো চাপুন"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"একটি থেকে অন্য অ্যাপ্লিকেশানগুলিতে পরিবর্তন করবেন?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"অন্য একটি অ্যাপ্লিকেশান ইতিমধ্যেই চলছে, নতুন একটি চালু করতে আপনাকে অবশ্যই সেটি বন্ধ করতে হবে৷"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> এ ফিরুন"</string> - <string name="old_app_description" msgid="2082094275580358049">"নতুন অ্যাপ্লিকেশান চালু করবেন না৷"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> শুরু করুন"</string> - <string name="new_app_description" msgid="1932143598371537340">"সংরক্ষণ না করেই পুরোনো অ্যাপ্লিকেশানটি বন্ধ করুন৷"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেমরি সীমা অতিক্রম করেছে"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"অনেক ডেটা সংগ্রহ করা হয়েছে; শেয়ার করার জন্য ট্যাপ করুন"</string> <string name="dump_heap_title" msgid="5864292264307651673">"হিপ ডাম্প শেয়ার করবেন?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"সিম কার্ড যোগ করা হয়েছে"</string> <string name="sim_added_message" msgid="6599945301141050216">"মোবাইল নেটওয়ার্ক অ্যাক্সেস করতে আপনার ডিভাইসটি পুনর্সূচনা করুন৷"</string> <string name="sim_restart_button" msgid="4722407842815232347">"রিস্টার্ট করুন"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"মোবাইল পরিষেবা চালু করুন"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"আপনার নতুন সিম কার্ড চালু করতে পরিষেবা প্রদানকারীর অ্যাপটি ডাউনলোড করুন"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"অ্যাপ ডাউনলোড করুন"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"নতুন সিম ঢোকানো হয়েছে"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"এটিকে সেট আপ করতে আলতো চাপুন"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"সময় সেট করুন"</string> @@ -1839,10 +1838,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string> <string name="screenshot_edit" msgid="7867478911006447565">"এডিট করুন"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"বিজ্ঞপ্তির উপর ট্যাপ করে জানুন আপনি বাধার জন্য কোন সেটিংস সেট করেছেন"</string> </resources> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 1d1a36c43a2d..da059ad72be7 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -1107,13 +1107,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Pokretanje pri kraju."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Pokrenuta je aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste se prebacili na aplikaciju"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite se prebaciti na drugu aplikaciju?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već je pokrenuta jedna aplikacija koju morate zaustaviti prije pokretanja nove."</string> - <string name="old_app_action" msgid="493129172238566282">"Vrati se na aplikaciju <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne pokretati novu aplikaciju."</string> - <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zaustaviti staru aplikaciju bez spašavanja podataka."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog stanja memorije je napravljen; dodirnite da biste dijelili"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Želite li dijeliti snimak dinamičkog dijela memorije?"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index a58339c8ed67..e5f208d4a91f 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"S\'estan iniciant les aplicacions."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"S\'està finalitzant l\'actualització."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca per anar a l\'aplicació"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vols canviar aplicacions?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ja s\'està executant una altra aplicació que s\'ha d\'aturar abans de poder iniciar-ne una de nova."</string> - <string name="old_app_action" msgid="493129172238566282">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"No iniciïs l\'aplicació nova."</string> - <string name="new_app_action" msgid="5472756926945440706">"Inicia <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Atura l\'aplicació antiga sense desar."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"S\'ha recopilat un procés \"heap dump\"; toca per compartir-lo"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Vols compartir el \"heap dump\"?"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index d17a488cc33c..d9e15b2c186f 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Spouštění aplikací."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončování inicializace."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Běží aplikace <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Klepnutím přepnete do aplikace"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Přepnout aplikace?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Než spustíte novou aplikaci, je třeba zastavit jinou spuštěnou aplikaci."</string> - <string name="old_app_action" msgid="493129172238566282">"Návrat do aplikace <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nespouštět novou aplikaci."</string> - <string name="new_app_action" msgid="5472756926945440706">"Do aplikace <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zastavit starou aplikaci bez uložení."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> překročil limit paměti"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Byl shromážděn výpis haldy, klepnutím jej můžete sdílet"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Sdílet výpis haldy?"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 861ace06ea83..47cf038cca01 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Åbner dine apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Gennemfører start."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er i gang"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tryk for at skifte til appen"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vil du skifte apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Der kører allerede en anden app, der skal stoppes, før du kan starte en ny."</string> - <string name="old_app_action" msgid="493129172238566282">"Tilbage til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Åbn ikke den nye app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop den gamle app uden at gemme."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> har overskredet sin hukommelsesgrænse"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"En heap dump er blevet indsamlet. Tryk for at dele"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele en heap dump?"</string> @@ -1834,5 +1839,5 @@ <string name="screenshot_edit" msgid="7867478911006447565">"Rediger"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemændringer"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Tilstanden Forstyr ikke blev ændret"</string> - <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryk for at tjekke indstillingerne for adfærd ved afbrydelser"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryk for at tjekke indstillingerne for adfærd ved underretninger"</string> </resources> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index f291f62308d6..aab6858b7581 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps werden gestartet..."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Start wird abgeschlossen..."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Zum Wechseln der App tippen"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Apps wechseln?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Es wird bereits eine andere App ausgeführt, die vor dem Start einer neuen beendet werden muss."</string> - <string name="old_app_action" msgid="493129172238566282">"Zu <xliff:g id="OLD_APP">%1$s</xliff:g> zurückkehren"</string> - <string name="old_app_description" msgid="2082094275580358049">"Neue App nicht starten"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> starten"</string> - <string name="new_app_description" msgid="1932143598371537340">"Alte App beenden, ohne zu speichern"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Speicherlimit für \"<xliff:g id="PROC">%1$s</xliff:g>\" überschritten"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap-Dump wurde erfasst. Zum Teilen tippen"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Heap-Dump teilen?"</string> @@ -1198,7 +1203,7 @@ <string name="sim_added_message" msgid="6599945301141050216">"Starte zur Nutzung des Mobilfunknetzes dein Gerät neu."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Neu starten"</string> <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobilfunkdienst aktivieren"</string> - <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Mobilfunkanbieter-App herunterladen, um deine neue SIM-Karte zu aktivieren"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Mobilfunkanbieter-App herunterladen, um meine neue SIM-Karte zu aktivieren"</string> <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"App herunterladen"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Neue SIM-Karte eingelegt"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Zum Einrichten tippen"</string> @@ -1834,5 +1839,5 @@ <string name="screenshot_edit" msgid="7867478911006447565">"Bearbeiten"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemänderungen"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Bitte nicht stören\" wurde geändert"</string> - <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Zum Prüfen der Verhaltenseinstellungen für Unterbrechungen hier tippen"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tippen, um Einstellungen für den Modus \"Bitte nicht stören\" zu überprüfen"</string> </resources> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 5e657c84d0aa..1371000a899b 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Έναρξη εφαρμογών."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Ολοκλήρωση εκκίνησης."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Πατήστε για εναλλαγή στην εφαρμογή"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Να γίνει εναλλαγή μεταξύ εφαρμογών;"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Εκτελείται ήδη άλλη εφαρμογή την οποία πρέπει να διακόψετε για να είναι δυνατή η εκτέλεση της νέας."</string> - <string name="old_app_action" msgid="493129172238566282">"Επιστροφή σε <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Μην εκκινήσετε τη νέα εφαρμογή."</string> - <string name="new_app_action" msgid="5472756926945440706">"Εκκίνηση της εφαρμογής <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Διακοπή της παλιάς εφαρμογής χωρίς αποθήκευση."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Η διαδικασία <xliff:g id="PROC">%1$s</xliff:g> υπερβαίνει το όριο μνήμης"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Έγινε λήψη του στιγμιότυπου μνήμης, πατήστε για κοινή χρήση"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Κοινή χρήση στιγμιότυπου μνήμης;"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 87a410ec009e..0fddeac779f1 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -305,7 +305,7 @@ <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string> <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string> @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> - <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string> diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml index 87a410ec009e..0fddeac779f1 100644 --- a/core/res/res/values-en-rCA/strings.xml +++ b/core/res/res/values-en-rCA/strings.xml @@ -305,7 +305,7 @@ <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string> <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string> @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> - <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 87a410ec009e..0fddeac779f1 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -305,7 +305,7 @@ <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string> <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string> @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> - <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 87a410ec009e..0fddeac779f1 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -305,7 +305,7 @@ <string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string> <string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string> <string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string> - <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string> + <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string> <string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string> @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> - <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string> diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml index f9aa02c3b20b..04e776d86e36 100644 --- a/core/res/res/values-en-rXC/strings.xml +++ b/core/res/res/values-en-rXC/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string> - <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index c92db3dfeff7..950b977176e8 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando el inicio"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Presiona para cambiar a la app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"¿Deseas cambiar aplicaciones?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ya se está ejecutando una aplicación que debe detenerse antes de iniciar una nueva."</string> - <string name="old_app_action" msgid="493129172238566282">"Regresar a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"No iniciar la nueva aplicación."</string> - <string name="new_app_action" msgid="5472756926945440706">"Inicio <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Interrumpe la aplicación anterior sin guardar los cambios."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria."</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se recopiló el volcado de pila. Presiona para compartir."</string> <string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index cb74241b917f..089320115206 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando inicio..."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca para cambiar a la aplicación"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"¿Cambiar aplicaciones?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Se está ejecutando otra aplicación. Para iniciar una aplicación nueva, debes detenerla."</string> - <string name="old_app_action" msgid="493129172238566282">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"No iniciar la nueva aplicación"</string> - <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Detener la aplicación anterior sin guardar"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superado el límite de memoria"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se ha recopilado un volcado de pila. Toca para compartirlo"</string> <string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string> @@ -1198,7 +1203,7 @@ <string name="sim_added_message" msgid="6599945301141050216">"Reinicia el dispositivo para acceder a la red móvil."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string> <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar servicio móvil"</string> - <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descara la aplicación del operador para activar tu nueva tarjeta SIM"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga la aplicación del operador para activar tu nueva tarjeta SIM"</string> <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Nueva SIM insertada"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Toca para configurar"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index de44b89472f0..3f99415489d3 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-sõnumid"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Kõnepostisõnumid"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"WiFi-kõned"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kaardi olek"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Partner taotles TTY-režiimi TÄIELIK"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Partner taotles TTY-režiimi HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Partner taotles TTY-režiimi VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string> <string name="global_action_assist" msgid="3892832961594295030">"Abi"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Lukustamine"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Uus märguanne"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalne klaviatuur"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Vihje: suurendamiseks ja vähendamiseks puudutage kaks korda."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Automaatne täitmine"</string> <string name="setup_autofill" msgid="7103495070180590814">"Automaatse täitmise seadistamine"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Automaattäide"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Rakenduste käivitamine."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Käivitamise lõpuleviimine."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> töötab"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Puudutage rakendusele lülitumiseks"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Kas lülituda teisele rakendusele?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Teine rakendus juba töötab ja see tuleb peatada, et saaksite uue käivitada."</string> - <string name="old_app_action" msgid="493129172238566282">"Tagasi rakendusse <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ärge käivitage uut rakendust."</string> - <string name="new_app_action" msgid="5472756926945440706">"Käivitage rakendus <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Peatage vana rakendus salvestamata."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas mälupiirangu"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Mälutõmmis salvestati; puudutage jagamiseks"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Kas jagada mälutõmmist?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM-kaart lisatud"</string> <string name="sim_added_message" msgid="6599945301141050216">"Mobiilsidevõrku pääsemiseks taaskäivitage seade."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Taaskäivita"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobiilsideteenuse aktiveerimine"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Laadige alla operaatori rakendus, et aktiveerida oma uus SIM-kaart"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Laadi alla rakendus"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Uus SIM-kaart on sisestatud"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Puudutage seadistamiseks"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Kellaaja määramine"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 55b48a6500dd..0bf480296b88 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Sakatu aplikaziora joateko"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Aplikazioz aldatu?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Beste aplikazio bat exekutatzen ari da eta gelditu egin behar duzu beste bat abiarazi aurretik."</string> - <string name="old_app_action" msgid="493129172238566282">"Itzuli <xliff:g id="OLD_APP">%1$s</xliff:g> aplikaziora"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ez abiarazi aplikazio berria."</string> - <string name="new_app_action" msgid="5472756926945440706">"Hasi <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Gelditu aplikazio zaharra ezer gorde gabe."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> prozesuak memoria-muga gainditu du"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Uneko memoria-prozesuaren txostena sortu da; sakatu partekatzeko"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Uneko memoria-prozesuaren txostena partekatu nahi duzu?"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 8be34800f26d..52e986a2ecd4 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"برای رفتن به برنامه ضربه بزنید"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"برنامه عوض شود؟"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"برنامه دیگری از قبل در حال اجراست که باید متوقف شود تا بتوانید برنامه جدید را شروع کنید."</string> - <string name="old_app_action" msgid="493129172238566282">"بازگشت به <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"برنامه جدید شروع نشود."</string> - <string name="new_app_action" msgid="5472756926945440706">"شروع <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"برنامه قدیمی را بدون ذخیره متوقف کنید."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> از حد مجاز حافظه فراتر رفت"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"رون حافظه آزاد جمعآوری شد؛ برای اشتراکگذاری، ضربه بزنید"</string> <string name="dump_heap_title" msgid="5864292264307651673">"رونوشت حافظه آزاد به اشتراک گذاشته شود؟"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 98b667f47db8..9dc6e95d3dea 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Käynnistetään sovelluksia."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Viimeistellään päivitystä."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Vaihda sovellukseen napauttamalla."</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vaihdetaanko sovellusta?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Toinen sovellus on jo käynnissä. Sulje kyseinen sovellus, niin voit käynnistää uuden."</string> - <string name="old_app_action" msgid="493129172238566282">"Palaa kohteeseen <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Älä käynnistä uutta sovellusta."</string> - <string name="new_app_action" msgid="5472756926945440706">"Käynnistä <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Pysäytä vanha sovellus tallentamatta."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ylitti muistirajan."</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Keon vedos on kerätty, jaa se napauttamalla."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Jaetaanko keon vedos?"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index c989856c8fb9..faa8598e74d0 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Touchez pour passer à l\'application"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Changer d\'application?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Une autre application est déjà en cours d\'exécution. Arrêtez-la avant d\'en lancer une nouvelle."</string> - <string name="old_app_action" msgid="493129172238566282">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne pas lancer la nouvelle application"</string> - <string name="new_app_action" msgid="5472756926945440706">"Démarrer <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Arrêtez l\'ancienne application sans enregistrer."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a dépassé la limite de mémoire"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"L\'empreinte de mémoire a été recueillie. Touchez pour la partager."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de mémoire?"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 924a9a3b7d72..f840922090c9 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Appuyez ici pour changer d\'application."</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Changer d\'application ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Une autre application est déjà en cours d\'exécution. Arrêtez-la avant d\'en lancer une nouvelle."</string> - <string name="old_app_action" msgid="493129172238566282">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne pas lancer la nouvelle application"</string> - <string name="new_app_action" msgid="5472756926945440706">"Démarrer <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Arrêtez l\'ancienne application sans enregistrer."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé la limite de mémoire"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Une empreinte de la mémoire a bien été générée. Appuyez pour partager."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de la mémoire ?"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index d36e4a61bf21..5114ba0da507 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Mensaxes SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensaxes de correo de voz"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por wifi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Estado da SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Outro dispositivo solicitou o modo TTY COMPLETO"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Outro dispositivo solicitou o modo TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Outro dispositivo solicitou o modo TTY VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string> <string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Bloquear"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nova"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Consello: Toca dúas veces para achegar e afastar o zoom."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Encher"</string> <string name="setup_autofill" msgid="7103495070180590814">"Conf. autocompletar"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Autocompletar"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicacións."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Está finalizando o arranque"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> está en execución"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca para cambiar á aplicación"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Queres cambiar as aplicacións?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Xa hai unha aplicación executándose que debe deterse para que poidas iniciar outra nova."</string> - <string name="old_app_action" msgid="493129172238566282">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Non inicies a aplicación nova."</string> - <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Deter a aplicación antiga sen gardar."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superou o límite de memoria"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Recompilouse o baleirado de montóns. Toca para compartir"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Queres compartir o baleirado de montóns?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Engadiuse unha tarxeta SIM"</string> <string name="sim_added_message" msgid="6599945301141050216">"Reinicia o dispositivo para acceder á rede móbil."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar o servizo móbil"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga a aplicación do operador para activar a túa nova SIM"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Introduciuse unha nova SIM"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Tocar para configurar"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Configurar hora"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index bb6ac6dd7023..bf48dedd70ba 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS સંદેશા"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"વૉઇસમેઇલ સંદેશા"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"વાઇ-ફાઇ કૉલિંગ"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"સિમનું સ્ટેટસ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"પીઅરે TTY મોડ HCO ની વિનંતી કરી"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"પીઅરે TTY મોડ VCO ની વિનંતી કરી"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"સેટિંગ્સ"</string> <string name="global_action_assist" msgid="3892832961594295030">"સહાય"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"વૉઇસ સહાય"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"લૉકડાઉન"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"નવું નોટિફિકેશન"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"વર્ચ્યુઅલ કીબોર્ડ"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"ટિપ: ઝૂમ વધારવા અને ઘટાડવા માટે બે વાર ટેપ કરો."</string> <string name="autofill_this_form" msgid="4616758841157816676">"સ્વતઃભરણ"</string> <string name="setup_autofill" msgid="7103495070180590814">"સ્વતઃભરણ સેટ કરો"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"આપમેળે ભરાઈ જશે"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ઍપ્લિકેશનો શરૂ કરી રહ્યાં છે."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"બૂટ સમાપ્ત કરી રહ્યાં છે."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ચાલુ છે"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ઍપ્લિકેશન પર સ્વિચ કરવા માટે ટૅપ કરો"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"એપ્લિકેશન્સને સ્વિચ કરીએ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"પહેલાંથી ચાલી રહેલ બીજી એપ્લિકેશનને તમે નવી પ્રારંભ કરો તે પહેલાં બંધ કરવી આવશ્યક છે."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> પર પાછા ફરો"</string> - <string name="old_app_description" msgid="2082094275580358049">"નવી ઍપ્લિકેશન પ્રારંભ કરશો નહીં."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ને પ્રારંભ કરો"</string> - <string name="new_app_description" msgid="1932143598371537340">"જૂની એપ્લિકેશનને સાચવ્યાં વગર રોકો."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> એ મેમરી સીમા વટાવી"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"હીપ ડમ્પ ભેગો કરવામાં આવ્યો છે; શેર કરવા માટે ટૅપ કરો"</string> <string name="dump_heap_title" msgid="5864292264307651673">"હીપ ડમ્પ શેર કરીએ?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"સિમ કાર્ડ ઉમેર્યો"</string> <string name="sim_added_message" msgid="6599945301141050216">"મોબાઇલ નેટવર્કને ઍક્સેસ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો."</string> <string name="sim_restart_button" msgid="4722407842815232347">"રિસ્ટાર્ટ કરો"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"મોબાઇલ સેવાને સક્રિય કરો"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"તમારું નવું સિમ સક્રિય કરવા માટે કૅરિઅર ઍપ ડાઉનલોડ કરો"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ઍપ ડાઉનલોડ કરો"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"નવું સિમ દાખલ કર્યું"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"તેને સેટ કરવા માટે ટૅપ કરો"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"સમય સેટ કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 5b81d3e2d9b6..bb1af18831e7 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"मैसेज (एसएमएस)"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"वॉइसमेल संदेश"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"वाई-फ़ाई कॉलिंग"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"सिम की स्थिति"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीअो (VCO) का अनुरोध किया"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string> <string name="global_action_assist" msgid="3892832961594295030">"सहायता"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज़ से डिवाइस का इस्तेमाल"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"फ़ाेन लॉक करें"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"नई सूचना"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"वर्चुअल कीबोर्ड"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"सलाह: ज़ूम इन और आउट करने के लिए दो बार छूएं."</string> <string name="autofill_this_form" msgid="4616758841157816676">"स्वत: भरण"</string> <string name="setup_autofill" msgid="7103495070180590814">"स्वत: भरण सेट करें"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"अपने आप जानकारी भरने की सुविधा"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ऐप्स प्रारंभ होने वाले हैं"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्त हो रहा है."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ऐप्लिकेशन पर स्विच करने के लिए टैप करें"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ऐप्स स्विच करें?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"दूसरा ऐप्स पहले से चल रहा है जिसे किसी नए ऐप्स को प्रारंभ करने के पहले बंद किया जाना आवश्यक है."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> पर वापस लौटें"</string> - <string name="old_app_description" msgid="2082094275580358049">"नया ऐप्स प्रारंभ न करें."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> शुरू करें"</string> - <string name="new_app_description" msgid="1932143598371537340">"पुराने ऐप्स को बिना सहेजे बंद करें."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> मेमोरी सीमा को पार कर गई है"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप का संग्रह कर लिया गया है; शेयर करने के लिए टैप करें"</string> <string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप शेयर करें?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"सिम कार्ड जोड़ा गया"</string> <string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क की पहुंच पाने लिए अपना डिवाइस फिर से चालू करें."</string> <string name="sim_restart_button" msgid="4722407842815232347">"फिर से शुरू करें"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"माेबाइल सेवा चालू करें"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"अपने नए सिम काे चालू करने के लिए इंटरनेट सेवा देने वाली कंपनी का एेप्लिकेशन डाउनलोड करें"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ऐप्लिकेशन डाउनलोड करें"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"नई SIM डाली गई"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"इसे सेट करने के लिए टैप करें"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"समय सेट करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 857ef3658c95..f740d742db04 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1105,13 +1105,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Završetak inicijalizacije."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste prešli na aplikaciju"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Izmijeniti aplikacije?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već se izvodi neka druga aplikacija koja se mora zaustaviti prije pokretanja nove."</string> - <string name="old_app_action" msgid="493129172238566282">"Natrag na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne pokreći novu aplikaciju."</string> - <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zaustavi staru aplikaciju bez spremanja."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Generirana je snimka memorije procesa. Dodirnite za dijeljenje."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Žalite li dijeliti snimku memorije procesa?"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 41d9355237ed..1fb05b243a0c 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Kezdő alkalmazások."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Rendszerindítás befejezése."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> fut"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Koppintson az alkalmazásra váltáshoz"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Átvált az alkalmazások között?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Már fut egy másik alkalmazás, amelyet le kell állítania, mielőtt egy újat indíthatna el."</string> - <string name="old_app_action" msgid="493129172238566282">"Visszatérés a(z) <xliff:g id="OLD_APP">%1$s</xliff:g> alkalmazáshoz"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne indítsa el az új alkalmazást."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> indítása"</string> - <string name="new_app_description" msgid="1932143598371537340">"A régi alkalmazás leállítása mentés nélkül."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"A(z) <xliff:g id="PROC">%1$s</xliff:g> túllépte a memóriakorlátot"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Elkészült a memória-pillanatfelvétel (heap dump); a megosztáshoz koppintson rá"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Megosztja a memória-pillanatfelvételt?"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index ca46497cb468..b299ecf79b5f 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Հավելվածները մեկնարկում են:"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Բեռնումն ավարտվում է:"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>-ն աշխատում է"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Հպեք՝ հավելվածին անցնելու համար"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Փոխարկե՞լ հավելվածները:"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Մեկ այլ ծրագիր արդեն աշխատում է, որը պետք է դադարեցնել, նախքան դուք կկարողանաք սկսել նորը:"</string> - <string name="old_app_action" msgid="493129172238566282">"Վերադառնալ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Չսկսել նոր հավելված:"</string> - <string name="new_app_action" msgid="5472756926945440706">"Սկիզբ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Դադարեցնել նախկին ծրագիրն առանց պահպանման:"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> գործընթացը գերազանցել է հիշողության սահմանաչափը"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Օգտագործվող օբյեկտների վերաբերյալ տվյալները հավաքվել են: Հպեք՝ դրանք տրամադրելու համար"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Տրամադրե՞լ օգտագործվող օբյեկտների վերաբերյալ տվյալները:"</string> @@ -1834,5 +1839,5 @@ <string name="screenshot_edit" msgid="7867478911006447565">"Փոփոխել"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"Համակարգի փոփոխություններ"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string> - <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Հպեք՝ ծանուցման կարգավորումները ստուգելու համար"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Հպեք՝ կարգավորումները ստուգելու համար"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 17178145efe0..6ac404cfc022 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ketuk untuk beralih ke aplikasi"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Beralih aplikasi?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Apl lain sudah berjalan dan harus dihentikan agar Anda dapat memulai yang baru."</string> - <string name="old_app_action" msgid="493129172238566282">"Kembali ke<xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Jangan memulai aplikasi baru."</string> - <string name="new_app_action" msgid="5472756926945440706">"Mulai <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Hentikan apl lama tanpa menyimpan."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melampaui batas memori"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Informasi memori elah dikumpulkan; ketuk untuk membagikan"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Share tumpukan membuang?"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index e4819007b147..2281a54de004 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ræsir forrit."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Lýkur ræsingu."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ýttu til að skipta yfir í forrit"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Skipta um forrit?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Annað forrit er þegar í gangi og það þarf að stöðva áður en hægt er að ræsa nýtt."</string> - <string name="old_app_action" msgid="493129172238566282">"Til baka í <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ekki ræsa nýja forritið."</string> - <string name="new_app_action" msgid="5472756926945440706">"Ræsa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stöðva gamla forritið án þess að vista."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er yfir minnishámarki"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnisgögnum hefur verið safnað, ýttu til að deila"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Deila minnisgögnum?"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index c950f3b12b80..9c782bc2f75a 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Avvio applicazioni."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Conclusione dell\'avvio."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tocca per passare all\'app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Cambiare applicazione?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Un\'altra applicazione già in esecuzione deve essere chiusa prima di poterne avviare un\'altra."</string> - <string name="old_app_action" msgid="493129172238566282">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Non avviare la nuova applicazione."</string> - <string name="new_app_action" msgid="5472756926945440706">"Avvia <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Interrompi la vecchia applicazione senza salvare."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superato il limite di memoria"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump dell\'heap raccolto; tocca per condividere"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Condividere il dump dell\'heap?"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 5702ee5d1b03..56cafa9086b8 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -95,8 +95,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"הודעות SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"הודעות קוליות"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"שיחות Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"סטטוס SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"העמית ביקש TTY במצב FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"העמית ביקש TTY במצב HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"העמית ביקש TTY במצב VCO"</string> @@ -246,8 +245,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string> <string name="global_action_assist" msgid="3892832961594295030">"סיוע"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"נעילה"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"הודעה חדשה"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"מקלדת וירטואלית"</string> @@ -834,8 +832,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"טיפ: הקש פעמיים כדי להגדיל ולהקטין."</string> <string name="autofill_this_form" msgid="4616758841157816676">"מילוי אוטומטי"</string> <string name="setup_autofill" msgid="7103495070180590814">"הגדר מילוי אוטומטי"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"מילוי אוטומטי"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1128,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"מפעיל אפליקציות."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"מסיים אתחול."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"הקש כדי לעבור לאפליקציה"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"להחליף אפליקציות?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"אפליקציה אחרת כבר פועלת ועליך לעצור אותה לפני שתוכל להפעיל אפליקציה חדשה."</string> - <string name="old_app_action" msgid="493129172238566282">"חזור אל <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"אל תפעיל את האפליקציה החדש."</string> - <string name="new_app_action" msgid="5472756926945440706">"הפעל את <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"עצור את האפליקציה הישן ללא שמירה."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> חורג מהגבלת הזיכרון"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump של ערימה נאסף. הקש כדי לשתף"</string> <string name="dump_heap_title" msgid="5864292264307651673">"האם לשתף את נתוני ה-Dump של הערימה?"</string> @@ -1244,12 +1246,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"כרטיס ה-SIM נוסף"</string> <string name="sim_added_message" msgid="6599945301141050216">"הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית."</string> <string name="sim_restart_button" msgid="4722407842815232347">"הפעלה מחדש"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"הפעלה של השירות הסלולרי"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"הורדת אפליקציה"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"ה-SIM החדש הוכנס"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"הקש כדי להגדיר"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"הגדרת שעה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 00aeab9ab217..15fa7dc3923d 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS メッセージ"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ボイスメール メッセージ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM のステータス"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTY モードを FULL にするようリクエストされました"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ピアから、TTYモードをHCOにするようリクエストされました"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ピアから、TTYモードをVCOにするようリクエストされました"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> <string name="global_action_assist" msgid="3892832961594295030">"サポート"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"音声アシスト"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"ロックダウン"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"新しい通知"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"仮想キーボード"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"ヒント: ダブルタップで拡大/縮小できます。"</string> <string name="autofill_this_form" msgid="4616758841157816676">"自動入力"</string> <string name="setup_autofill" msgid="7103495070180590814">"自動入力を設定"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"自動入力"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">"、 "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"アプリを起動しています。"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ブートを終了しています。"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>を実行中"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"タップしてアプリを切り替えます"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"アプリを切り替えますか?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"別のアプリが既に実行中です。新しいアプリを起動する前に実行中のアプリを停止してください。"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>に戻る"</string> - <string name="old_app_description" msgid="2082094275580358049">"新しいアプリを起動しません。"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>を起動"</string> - <string name="new_app_description" msgid="1932143598371537340">"古いアプリを保存せずに停止します。"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>はメモリの上限を超えました"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ヒープダンプが収集されました。タップして共有できます"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ヒープダンプを共有しますか?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIMカードが追加されました"</string> <string name="sim_added_message" msgid="6599945301141050216">"モバイルネットワークにアクセスするには端末を再起動してください。"</string> <string name="sim_restart_button" msgid="4722407842815232347">"再起動"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"モバイル サービスを有効にする"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"新しい SIM を有効にするには携帯通信会社のアプリをダウンロードします"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"アプリをダウンロード"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"新しい SIM が挿入されました"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"タップして設定"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"時刻設定"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 174a7708aed2..a0ff3b83a4fb 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS შეტყობინებები"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ხმოვანი ფოსტის შეტყობინებები"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"დარეკვა Wi-Fi-ს მეშვეობით"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM სტატუსი"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"მოთხოვნილია კვანძი TTY რეჟიმი FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"მოთხოვნილია კვანძი TTY რეჟიმი HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"მოთხოვნილია კვანძი TTY რეჟიმი VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string> <string name="global_action_assist" msgid="3892832961594295030">"დახმარება"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"დაბლოკვა"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"ახალი შეტყობინება"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ვირტუალური კლავიატურა"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"რჩევა: მასშტაბის შესაცვლელად გამოიყენეთ ორმაგი შეხება."</string> <string name="autofill_this_form" msgid="4616758841157816676">"ავტოშევსება"</string> <string name="setup_autofill" msgid="7103495070180590814">"ავტოშევსების დაყენება"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"ავტომატური შევსება"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"აპების ჩართვა"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ჩატვირთვის დასასრული."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"შეეხეთ აპზე გადასართველად"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"გსურთ, აპების გადართვა?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"სხვა აპი არის უკვე გაშვებული, რომელიც უნდა შეჩერდეს ახლის დაწყებამდე."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-თან დაბრუნება"</string> - <string name="old_app_description" msgid="2082094275580358049">"არ ჩართოთ ახალი აპი."</string> - <string name="new_app_action" msgid="5472756926945440706">"დასაწყისი <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"შეაჩერე ძველი აპი ცვლილებების შენახვის გარეშე."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>-მა გადააჭარბა მეხსიერების ლიმიტს"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"გროვის ამონაწერი მომზადდა; შეეხეთ გასაზიარებლად"</string> <string name="dump_heap_title" msgid="5864292264307651673">"გავაზიაროთ გროვის ამონაწერი?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM ბარათი დაემატა"</string> <string name="sim_added_message" msgid="6599945301141050216">"გადატვირთეთ თქვენი მოწყობილობა მობილურ ქსელზე წვდომისთვის."</string> <string name="sim_restart_button" msgid="4722407842815232347">"გადატვირთვა"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"გაააქტიურეთ მობილური სერვისი"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ჩამოტვირთეთ ოპერატორის აპი, რათა თქვენი ახალი SIM გაააქტიუროთ"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"აპის ჩამოტვირთვა"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"მოთავსებულია ახალი SIM ბარათი"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"შეეხეთ პარამეტრების დასაყენებლად"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"დროის დაყენება"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index d4f3e7d84b35..4b106a2cf651 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS хабарлары"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дауыстық пошта хабарлары"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi қоңыраулары"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM күйі"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Пир TTY режимі ТОЛЫҚ сұрады"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Пир TTY режимінің HCO сұрады"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Пир TTY режимінің VCO сұрады"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string> <string name="global_action_assist" msgid="3892832961594295030">"Көмек"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Құлыптау"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Жаңа хабарландыру"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалды пернетақта"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Кеңес: Ұлғайту немесе кішірейту үшін екі рет түртіңіз."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Aвто толтыру"</string> <string name="setup_autofill" msgid="7103495070180590814">"Автотолтыруды орнату"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Aвтотолтыру"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Қолданбалар іске қосылуда."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Қосуды аяқтауда."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> қосылған"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Қолданбаға ауысу үшін түртіңіз"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Қолданбаларды ауыстыру керек пе?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Жаңасын іске қосу алдында тоқтату керек басқа қолданба әлдеқашан жұмыс істеп жатыр."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасына оралу"</string> - <string name="old_app_description" msgid="2082094275580358049">"Жаңа қолданбаны іске қоспау."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасын қосу"</string> - <string name="new_app_description" msgid="1932143598371537340">"Ескі қолданбаны сақтаусыз тоқтату."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> жад шегінен асты"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үйінді дамп жиналды; бөлісу үшін түртіңіз"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Үйінді дамппен бөлісу қажет пе?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM картасы қосылды"</string> <string name="sim_added_message" msgid="6599945301141050216">"Ұялы желіге кіру үшін құрылғыны қайта бастаңыз."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Қайта бастау"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобильдік қызметті іске қосыңыз"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңа SIM картасын іске қосу үшін оператор қолданбасын жүктеп алыңыз"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Қолданбаны жүктеп алу"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңа SIM салынды"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Оны орнату үшін түртіңіз"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Уақытты реттеу"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index a78d527d26fe..1e65a76157d3 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1087,13 +1087,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ចាប់ផ្ដើមកម្មវិធី។"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"បញ្ចប់ការចាប់ផ្ដើម។"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ប៉ះដើម្បីប្តូរកម្មវិធី"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ប្ដូរកម្មវិធី?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"កម្មវិធីផ្សេងកំពុងដំណើរការរួចហើយ ដែលតម្រូវឲ្យបញ្ឈប់មុនពេលអ្នកអាចចាប់ផ្ដើមថ្មី។"</string> - <string name="old_app_action" msgid="493129172238566282">"ត្រឡប់ទៅ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"កុំចាប់ផ្ដើមកម្មវិធីថ្មី។"</string> - <string name="new_app_action" msgid="5472756926945440706">"ចាប់ផ្ដើម <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"បញ្ឈប់កម្មវិធីចាស់ដោយមិនរក្សាទុក"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> លើសពីកម្រិតកំណត់មេម៉ូរី"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump ត្រូវបានប្រមូល សូមប៉ះដើម្បីចែករំលែក"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ចែករំលែក heap dump?"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index adf234b2408e..1adc210df343 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳು"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"ಸಿಮ್ ಸ್ಥಿತಿ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string> <string name="global_action_assist" msgid="3892832961594295030">"ಸಹಾಯ ಮಾಡು"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"ಲಾಕ್ಡೌನ್"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"ಹೊಸ ಅಧಿಸೂಚನೆ"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"ಸಲಹೆ: ಝೂಮ್ ಇನ್ ಮತ್ತು ಝೂಮ್ ಔಟ್ ಮಾಡಲು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="autofill_this_form" msgid="4616758841157816676">"ಸ್ವಯಂತುಂಬುವಿಕೆ"</string> <string name="setup_autofill" msgid="7103495070180590814">"ಸ್ವಯಂತುಂಬುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"ಸ್ವಯಂತುಂಬುವಿಕೆ"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ಬೂಟ್ ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ಅಪ್ಲಿಕೇಶನ್ ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸುವುದೇ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಈಗಾಗಲೇ ಚಾಲ್ತಿಯಲ್ಲಿದೆ ನೀವು ಹೊಸದೊಂದು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು ಅದನ್ನು ನಿಲ್ಲಿಸಬೇಕು."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಗೆ ಹಿಂತಿರುಗಿ"</string> - <string name="old_app_description" msgid="2082094275580358049">"ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಾರಂಭಿಸಬೇಡಿ."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಪ್ರಾರಂಭಿಸಿ"</string> - <string name="new_app_description" msgid="1932143598371537340">"ಉಳಿಸದೇ ಹಳೆಯ ಅಪ್ಲಿಕೇಶನ್ ನಿಲ್ಲಿಸಿ."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ಮೆಮೊರಿ ಮಿತಿಯನ್ನು ಮೀರಿದೆ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ಹೀಪ್ ಡಂಪ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲಾಗಿದೆ; ಹಂಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ಹೀಪ್ ಡಂಪ್ ಹಂಚಿಕೊಳ್ಳುವುದೇ?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="sim_added_message" msgid="6599945301141050216">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string> <string name="sim_restart_button" msgid="4722407842815232347">"ಮರುಪ್ರಾರಂಭಿಸು"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ಮೊಬೈಲ್ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ಅಪ್ಲಿಕೇಶನ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 77e6971dae23..2eb5bcf13878 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS 메시지"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"음성사서함 메시지"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 통화"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 상태"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"피어가 TTY 모드 FULL을 요청했습니다."</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"피어가 TTY 모드 HCO를 요청했습니다."</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"피어가 TTY 모드 VCO를 요청했습니다."</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"설정"</string> <string name="global_action_assist" msgid="3892832961594295030">"지원"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"잠금"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"새 알림"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"가상 키보드"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"도움말: 확대/축소하려면 두 번 탭합니다."</string> <string name="autofill_this_form" msgid="4616758841157816676">"자동완성"</string> <string name="setup_autofill" msgid="7103495070180590814">"자동완성 설정..."</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"자동 완성"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"앱을 시작하는 중입니다."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"부팅 완료"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"앱을 전환하려면 탭하세요."</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"앱을 전환하시겠습니까?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"다른 앱이 이미 실행 중입니다. 새 앱을 시작하려면 실행 중인 앱을 중단해야 합니다."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>(으)로 돌아가기"</string> - <string name="old_app_description" msgid="2082094275580358049">"새 앱을 시작하지 마세요."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> 시작"</string> - <string name="new_app_description" msgid="1932143598371537340">"저장하지 않고 이전 앱을 중단합니다."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>에서 메모리 제한을 초과했습니다."</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"힙 덤프가 수집되었습니다. 공유하려면 탭하세요."</string> <string name="dump_heap_title" msgid="5864292264307651673">"힙 덤프를 공유할까요?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM 카드 추가됨"</string> <string name="sim_added_message" msgid="6599945301141050216">"모바일 네트워크에 액세스하려면 기기를 다시 시작하세요."</string> <string name="sim_restart_button" msgid="4722407842815232347">"다시 시작"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"모바일 서비스 활성화"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"이동통신사 앱을 다운로드하여 새로운 SIM 활성화"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"앱 다운로드"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"새 SIM이 삽입됨"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"탭하여 설정"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"시간 설정"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index ef40d0e72da5..84abf19c2b31 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS билдирүүлөрү"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Үн почтасынын билдирүүлөрү"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi аркылуу чалуу"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-картанын абалы"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer TTY режимин FULL кылууну суранды"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer TTY режимин HCO кылууну суранды"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer TTY режимин VCO кылууну суранды"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string> <string name="global_action_assist" msgid="3892832961594295030">"Жардам"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Бекем кулпулоо"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Жаңы эскертме"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалдык баскычтоп"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Кыйытма: Чоңойтуп-кичирейтиш үчүн эки жолу басыңыз."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Авто-толтуруу"</string> <string name="setup_autofill" msgid="7103495070180590814">"Автотолтурууну тууралоо"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Автотолтуруу"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Колдонмолорду иштетип баштоо"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Жүктөө аякталууда."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> иштеп жатат"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Колдонмого которулуу үчүн таптап коюңуз"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Колдонмолор которуштурулсунбу?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Жаңы колдонмону иштетээрден мурун, учурда иштеп жатканын өчүрүшүңүз керек."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> колдонмосуна кайтуу"</string> - <string name="old_app_description" msgid="2082094275580358049">"Жаңы колдонмо башталбасын"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> колдонмосун жүргүзүү"</string> - <string name="new_app_description" msgid="1932143598371537340">"Эски колдонмону сактабастан токтотуу."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> эстутум чегинен ашып кетти"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үймө дамп топтолду; бөлүшүү үчүн таптап коюңуз"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Үймө дамп бөлүшүлсүнбү?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM-карта кошулду"</string> <string name="sim_added_message" msgid="6599945301141050216">"Мобилдик түйүнкгө жетки алуу үчүн, түзмөгүңүздү өчүрүп кайра жандырыңыз."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Кайра баштоо"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобилдик кызматты жандыруу"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңы SIM-картаны жандыруу үчүн байланыш операторунун колдонмосун жүктөп алыңыз"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Колдонмону жүктөп алуу"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңы SIM карта салынды"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Аны жөндөө үчүн таптап коюңуз"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Убакытты коюу"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index c75b1ff3efb3..86c317dbf066 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ກຳລັງເປີດແອັບຯ."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ກຳລັງສຳເລັດການເປີດລະບົບ."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ແຕະເພື່ອສະລັບໄປຫາແອັບ"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ສະລັບແອັບຯບໍ່?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ທ່ານຈະຕ້ອງຢຸດນຳໃຊ້ແອັບຯໂຕອື່ນກ່ອນ ກ່ອນທີ່ທ່ານຈະເປີດໃຊ້ແອັບຯໃໝ່ໄດ້."</string> - <string name="old_app_action" msgid="493129172238566282">"ກັບໄປ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"ຫ້າມເປີດແອັບຯໃໝ່."</string> - <string name="new_app_action" msgid="5472756926945440706">"ເລີ່ມຕົ້ນ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"ຢຸດແອັບຯເກົ່າໂດຍບໍ່ຕ້ອງບັນທຶກ."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ເກີນຂີດຄວາມຈຳແລ້ວ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ເກັບກຳຂໍ້ມູນ Head dump ແລ້ວ; ແຕະເພື່ອແບ່ງປັນ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ແບ່ງປັນການເທກອງບໍ?"</string> @@ -1832,7 +1837,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ແກ້ໄຂ"</string> - <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string> - <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string> - <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behavior settings for interruptions"</string> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"ການປ່ຽນແປງລະບົບ"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ແຕະເພື່ອກວດສອບການຕັ້ງຄ່າພຶດຕິກຳສຳລັບການລົບກວນ"</string> </resources> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 72ef6ffe2c46..d419a2dc1bc0 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Paleidžiamos programos."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Užbaigiamas paleidimas."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Palieskite, kad perjungtumėte į programą"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Perjungti programas?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Jau vykdoma kita programa, kurią reikia sustabdyti prieš paleidžiant naują."</string> - <string name="old_app_action" msgid="493129172238566282">"Grįžti į <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nepaleiskite naujos programos."</string> - <string name="new_app_action" msgid="5472756926945440706">"Paleisti „<xliff:g id="OLD_APP">%1$s</xliff:g>“"</string> - <string name="new_app_description" msgid="1932143598371537340">"Sustabdyti seną programą jos neišsaugant."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"„<xliff:g id="PROC">%1$s</xliff:g>“ viršijo atminties limitą"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Atminties išklotinės duomenys surinkti; palieskite, kad bendrintumėte"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Bendrinti atminties išklotinę?"</string> @@ -1902,10 +1907,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aptikta žalinga programa"</string> <string name="slices_permission_request" msgid="8484943441501672932">"„<xliff:g id="APP_0">%1$s</xliff:g>“ nori rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Redaguoti"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemos pakeitimai"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Netrukdymo režimas pakeistas"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Palieskite, kad patikrintumėte pertraukčių elgsenos nustatymus"</string> </resources> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index d63558f34696..696fce60c6b2 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -94,8 +94,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Īsziņas"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balss pasta ziņojumi"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zvani"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM kartes statuss"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO"</string> @@ -243,8 +242,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string> <string name="global_action_assist" msgid="3892832961594295030">"Palīdzība"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Bloķēšana"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Jauns paziņojums"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuālā tastatūra"</string> @@ -831,8 +829,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Padoms. Divreiz pieskarieties, lai tuvinātu un tālinātu."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Automātiskā aizpilde"</string> <string name="setup_autofill" msgid="7103495070180590814">"Iest. aut. aizp."</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Automātiskā aizpilde"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1108,13 +1105,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Notiek lietotņu palaišana."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Tiek pabeigta sāknēšana."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Pieskarieties, lai pārslēgtos uz lietotni."</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vai pārslēgt lietotnes?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Jau darbojas cita lietotne. Tās darbība ir jāaptur, lai varētu startēt jaunu lietotni."</string> - <string name="old_app_action" msgid="493129172238566282">"Atgriezties: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nestartējiet jauno lietotni."</string> - <string name="new_app_action" msgid="5472756926945440706">"Startēt: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Aptur vecās lietotnes darbību, neko nesaglabājot."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Process <xliff:g id="PROC">%1$s</xliff:g> pārsniedza atmiņas ierobežojumu."</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tika apkopots kaudzes izraksts. Pieskarieties, lai to kopīgotu."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Vai kopīgot kaudzes izrakstu?"</string> @@ -1222,12 +1224,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM karte ir pievienota."</string> <string name="sim_added_message" msgid="6599945301141050216">"Ierīces restartēšana, lai piekļūtu mobilo sakaru tīklam."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Restartēt"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizējiet mobilo ierīci."</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Lejupielādējiet mobilo sakaru operatora lietotni, lai aktivizētu jauno SIM karti."</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Lejupielādēt lietotni"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Ievietota jauna SIM karte"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Pieskarieties, lai to iestatītu."</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Iestatīt laiku"</string> @@ -1873,10 +1872,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Konstatēta kaitīga lietotne"</string> <string name="slices_permission_request" msgid="8484943441501672932">"Lietotne <xliff:g id="APP_0">%1$s</xliff:g> vēlas rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Rediģēt"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistēmas izmaiņas"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režīms “Netraucēt” ir mainīts"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Pieskarieties, lai pārbaudītu rīcības iestatījumu paziņojumus"</string> </resources> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index 8bfe4242320d..2bd910f8ef90 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-пораки"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Пораки од говорна пошта"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Повикување преку Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Статус на SIM-картичка"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Рамноправен уред го побара режимот на TTY „FULL“"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Рамноправен уред го побара режимот на TTY „HCO“"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Рамноправен уред го побара режимот на TTY „VCO“"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string> <string name="global_action_assist" msgid="3892832961594295030">"Асистенција"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Заклучување"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Ново известување"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Совет: допри двапати за да зумираш и да одзумираш."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Автоматско пополнување"</string> <string name="setup_autofill" msgid="7103495070180590814">"Постави „Автоматско пополнување“"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Автоматско пополнување"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Се стартуваат апликациите."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Подигањето завршува."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> работи"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Допрете за да се префрли на апликација"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Промени апликации?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Веќе работи една апликација што треба да ја запрете пред да стартувате нова."</string> - <string name="old_app_action" msgid="493129172238566282">"Врати се на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Не стартувајте ја новата апликација."</string> - <string name="new_app_action" msgid="5472756926945440706">"Вклучи <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Запрете ја старата апликација без зачувување."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Сликата од меморијата е собрана. Допрете за споделување"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Сподели слика од меморија?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Додадена е SIM картичка"</string> <string name="sim_added_message" msgid="6599945301141050216">"Рестартирај го својот уред за да пристапиш на мобилната мрежа."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Рестартирај"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активирајте мобилна услуга"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Преземете ја апликацијата на операторот за да ја активирате новата SIM-картичка"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Преземете апликација"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Вметната е нова SIM-картичка"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Допрете за да поставите"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Постави време"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index c0bc727acff1..340d7f90db08 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS സന്ദേശങ്ങൾ"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"വൈഫൈ കോളിംഗ്"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"സിം നില"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണം"</string> <string name="global_action_assist" msgid="3892832961594295030">"അസിസ്റ്റ്"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്സ് സഹായം"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"ലോക്ക്ഡൗൺ"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"പുതിയ അറിയിപ്പ്"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോർഡ്"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"നുറുങ്ങ്: സൂം ഇൻ ചെയ്യാനും സൂം ഔട്ട് ചെയ്യാനും ഇരട്ട-ടാപ്പുചെയ്യുക."</string> <string name="autofill_this_form" msgid="4616758841157816676">"ഓട്ടോഫിൽ"</string> <string name="setup_autofill" msgid="7103495070180590814">"ഓട്ടോഫിൽ സജ്ജീകരിക്കുക"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"സ്വമേധയാ പൂരിപ്പിക്കൽ"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"അപ്ലിക്കേഷനുകൾ ആരംഭിക്കുന്നു."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ബൂട്ട് ചെയ്യൽ പൂർത്തിയാകുന്നു."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> പ്രവർത്തിക്കുന്നു"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ആപ്പിലേക്ക് മാറുന്നതിന് ടാപ്പുചെയ്യുക"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"അപ്ലിക്കേഷനുകൾ മാറണോ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"നിങ്ങൾക്ക് പുതിയ ഒരു അപ്ലിക്കേഷൻ ആരംഭിക്കാനാവുന്നതിന് മുമ്പ്, ഇതിനകം പ്രവർത്തിക്കുന്ന മറ്റ് അപ്ലിക്കേഷൻ നിർത്തണം."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> എന്നതിലേക്ക് മടങ്ങുക"</string> - <string name="old_app_description" msgid="2082094275580358049">"പുതിയ അപ്ലിക്കേഷൻ ആരംഭിക്കരുത്."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ആരംഭിക്കുക"</string> - <string name="new_app_description" msgid="1932143598371537340">"സംരക്ഷിക്കാതെ തന്നെ പഴയ അപ്ലിക്കേഷൻ നിർത്തുക."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> മെമ്മറി പരിധി കവിഞ്ഞു"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ഹീപ്പ് ഡംപ് ശേഖരിച്ചു; പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ഹീപ്പ് ഡംപ് പങ്കിടണോ?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"സിം കാർഡ് ചേർത്തു"</string> <string name="sim_added_message" msgid="6599945301141050216">"മൊബൈൽ നെറ്റ്വർക്ക് ആക്സസ്സുചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക."</string> <string name="sim_restart_button" msgid="4722407842815232347">"പുനരാരംഭിക്കുക"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"മൊബൈൽ സേവനം സജീവമാക്കുക"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"പുതിയ സിം സജീവമാക്കാൻ കാരിയർ ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"പുതിയ സിം ഇട്ടു"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"ഇത് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"സമയം സജ്ജീകരിക്കുക"</string> @@ -1841,5 +1840,5 @@ <string name="screenshot_edit" msgid="7867478911006447565">"എഡിറ്റ് ചെയ്യുക"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"സിസ്റ്റത്തിലെ മാറ്റങ്ങൾ"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string> - <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"തടസ്സങ്ങൾക്കായുള്ള പ്രവർത്തന ക്രമീകരണം പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"തടസ്സങ്ങൾക്കായി ക്രമീകരിച്ചിട്ടുള്ളത് എന്താണെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക"</string> </resources> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 5d6a1ebdb23a..a5e6860b2a5b 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Апп-г эхлүүлж байна."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Эхлэлийг дуусгаж байна."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Апп руу шилжүүлэх бол товшино уу"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Апп сэлгэх үү?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Та шинэ апп-г ажиллуулахын өмнө зогсоох ёстой өөр апп ажиллаж байна."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-руу буцах"</string> - <string name="old_app_description" msgid="2082094275580358049">"Шинэ апп-г эхлүүлж болохгүй."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> эхлүүлэх"</string> - <string name="new_app_description" msgid="1932143598371537340">"Хуучин апп-г хадгалахгүйгээр зогсооно уу."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> санах ойн хязгаараас давсан"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Хэт их мэдээлэл цуглуулсан байна. Хуваалцахын тулд товшино уу"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Хэт их хуримтлагдсан мэдээллийг хуваалцах уу?"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index a7d07f6ad734..00eb8fd809cf 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS संदेश"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"व्हॉइसमेल संदेश"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"वाय-फाय कॉलिंग"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"सिम स्थिती"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string> <string name="global_action_assist" msgid="3892832961594295030">"सहाय्यता"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"लॉकडाउन"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"नवीन सूचना"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"व्हर्च्युअल कीबोर्ड"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"टीप: झूम कमी करण्यासाठी आणि वाढवण्यासाठी दोनदा-टॅप करा."</string> <string name="autofill_this_form" msgid="4616758841157816676">"स्वयं-भरण"</string> <string name="setup_autofill" msgid="7103495070180590814">"स्वयं-भरण सेट करा"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"अॉटोफिल"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"अॅप्स प्रारंभ करत आहे."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्त होत आहे."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चालत आहे"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"अॅपवर स्विच करण्यासाठी टॅप करा"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अॅप्स स्विच करायचे?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"आपण एक नवीन प्रारंभ करण्यापूर्वी आधीपासून चालणारा दुसरा अॅप थांबविणे आवश्यक आहे."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> कडे परत"</string> - <string name="old_app_description" msgid="2082094275580358049">"नवीन अॅप प्रारंभ करू नका."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरू करा"</string> - <string name="new_app_description" msgid="1932143598371537340">"जतन न करता जुना अॅप थांबवा."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ने मेमेरी मर्यादा वाढविली"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप संकलित केला गेला आहे; सामायिक करण्यासाठी टॅप करा"</string> <string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप सामायिक करायचे?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"सिम कार्ड जोडले"</string> <string name="sim_added_message" msgid="6599945301141050216">"मोबाईल नेटवर्कवर अॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा."</string> <string name="sim_restart_button" msgid="4722407842815232347">"रीस्टार्ट"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा अॅक्टिव्हेट करा"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"तुमचे नवीन सिम अॅक्टिव्हेट करण्यासाठी वाहकाचे अॅप डाउनलोड करा"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अॅप डाउनलोड करा"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"नवीन सिम घाला"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"ते सेट करण्यासाठी टॅप करा"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"वेळ सेट करा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 55362296eade..5108c912b12a 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Mesej SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesej mel suara"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Rakan meminta Mod TTY PENUH"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Rakan meminta Mod TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Rakan meminta Mod TTY VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string> <string name="global_action_assist" msgid="3892832961594295030">"Bantu"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Kunci semua"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Pemberitahuan baharu"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Papan kekunci maya"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Petua: Ketik dua kali untuk mengezum masuk dan keluar."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Auto isi"</string> <string name="setup_autofill" msgid="7103495070180590814">"Sediakan Autoisi"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Autolengkap"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulakan apl."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"But akhir."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ketik untuk beralih ke apl"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tukar apl?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Apl lain sudah pun dijalankan yang mesti dihentikan sebelum anda boleh memulakan yang baharu."</string> - <string name="old_app_action" msgid="493129172238566282">"Kembali ke <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Jangan mulakan apl baharu."</string> - <string name="new_app_action" msgid="5472756926945440706">"Mulakan <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Hentikan apl lama tanpa menyimpan."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melebihi had memori"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Longgokan timbunan telah dikumpulkan; ketik untuk berkongsi"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Kongsikan longgokan timbunan?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Kad SIM ditambah"</string> <string name="sim_added_message" msgid="6599945301141050216">"Mulakan semula peranti anda untuk mengakses rangkaian mudah alih."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Mulakan semula"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktifkan perkhidmatan mudah alih"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Muat turun apl pembawa untuk mengaktifkan SIM baharu"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Muat turun apl"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baharu dimasukkan"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketik untuk menyediakannya"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Tetapkan masa"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index 77b83cce2879..176ecff72c71 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -93,7 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS မက်ဆေ့ဂျ်များ"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"အသံမေးလ် မက်ဆေ့ဂျ်များ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ခေါ်ဆိုမှု"</string> - <string name="notification_channel_sim" msgid="4052095493875188564">"ဆင်းမ် အခြေအနေ"</string> + <string name="notification_channel_sim" msgid="4052095493875188564">"ဆင်းမ်ကဒ် အခြေအနေ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏"</string> @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"အက်ပ်များကို စတင်နေ"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> က အလုပ်လုပ်နေသည်"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"အက်ပ်သို့ပြောင်းရန် တို့ပါ"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"အက်ပ်များကို ပြောင်းမလား?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"အခြား အက်ပ်တစ်ခု အလုပ်လုပ်နေ၍ သင်က အသစ် တစ်ခုကို မစမီ ၎င်းကို ရပ်ပစ်ရမည်။"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>သို့ပြန်သွားရန်"</string> - <string name="old_app_description" msgid="2082094275580358049">"pp အသစ်ကို မစတင်ပါနှင့်။"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>စတင်ပါ"</string> - <string name="new_app_description" msgid="1932143598371537340">"အက်ပ်အဟောင်းကို မသိမ်းဆည်းဘဲ ရပ်လိုက်ပါ။"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> သိမ်းထားနိုင်မှု အကန့်အသတ် ကျော်လွန်နေ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"သိမ်းဆည်းနိုင်မှု ပမာဏကျော်လွန်သွားပါပြီ။ မျှဝေရန် တို့ပါ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"အရေးပေါ် သိမ်းထားပေးမှု ကို မျှဝေမလား။"</string> @@ -1199,7 +1204,7 @@ <string name="sim_added_message" msgid="6599945301141050216">"မိုးဘိုင်းကွန်ရက်ကို ဆက်သွယ်ရန် စက်ကို ပြန် စ ပါ"</string> <string name="sim_restart_button" msgid="4722407842815232347">"အစက ပြန်စရန်"</string> <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"မိုဘိုင်းဝန်ဆောင်မှု စတင်ဖွင့်လှစ်ရန်"</string> - <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"သင့်ဆင်းမ် အသစ်ကို စတင်အသုံးပြုရန် ဝန်ဆောင်မှုပေးသူအက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"သင့်ဆင်းမ်ကဒ်အသစ်ကို စတင်အသုံးပြုရန် ဝန်ဆောင်မှုပေးသူအက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ"</string> <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"အက်ပ် ဒေါင်းလုဒ်လုပ်ရန်"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM အသစ်ထည့်သွင်းလိုက်ပါသည်"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"၎င်းကိုတပ်ဆင်ရန် တို့ပါ"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 59b4ffaff152..b1a254fee2ff 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS-meldinger"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talepostmeldinger"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-anrop"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Motpart ba om TTY-modus FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Motpart ba om TTY-modus HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Motpart ba om TTY-modus VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string> <string name="global_action_assist" msgid="3892832961594295030">"Hjelp"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Låsing"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Nytt varsel"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Tips: Dobbelttrykk for å zoome inn og ut."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string> <string name="setup_autofill" msgid="7103495070180590814">"Konfig. autofyll"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Autofyll"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starter apper."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Ferdigstiller oppstart."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Trykk for å bytte til appen"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vil du bytte app?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"En annen app kjører og må stoppes før du kan starte en ny app."</string> - <string name="old_app_action" msgid="493129172238566282">"Gå tilbake til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ikke start den nye appen."</string> - <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Stopp den gamle appen uten å lagre."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er over minnegrensen"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnedumpen («heap dump») er samlet inn – trykk for å dele"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele minnedumpen («heap dump»)?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM-kort er lagt til"</string> <string name="sim_added_message" msgid="6599945301141050216">"Start enheten på nytt for å få tilgang til det mobile nettverket."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Start på nytt"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktiver mobiltjeneste"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Last ned operatørappen for å aktivere det nye SIM-kortet ditt"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Last ned appen"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Et nytt SIM-kort er satt inn"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Trykk for å konfigurere"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Stille klokken"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 76850841b8e2..1eb0028df69b 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS सन्देशहरू"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"भ्वाइस मेल सन्देशहरू"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कल"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM को स्थिति"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"सहकर्मी अनुरोध गरियो। TTY मोड HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"सहकर्मी अनुरोध गरियो। TTY मोड VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"सेटिङहरू"</string> <string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"लकडाउन गर्नु…"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"नयाँ सूचना"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"भर्चुअल किबोर्ड"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"जुक्ति: जुमलाई ठूलो र सानो पार्न दुई पटक हान्नुहोस्।"</string> <string name="autofill_this_form" msgid="4616758841157816676">"स्वतः भर्ने"</string> <string name="setup_autofill" msgid="7103495070180590814">"अटोफिल सेटअप गर्नुहोस्"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"स्वतः भरण"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$१$२$३"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1094,13 +1091,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"सुरुवात अनुप्रयोगहरू।"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"बुट पुरा हुँदै।"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"अनुप्रयोगमा स्विच गर्न ट्याप गर्नुहोस्"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अनुप्रयोगहरू स्विच गर्ने हो?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"अर्को अनुप्रयोग पहिले नै चालु छ जुन तपाईंले एउटा नयाँ सुरु गर्नु अघि बन्द गर्नुपर्ने हुन्छ।"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> मा फर्कनुहोस्"</string> - <string name="old_app_description" msgid="2082094275580358049">"नयाँ अनुप्रयोग सुरु नगर्नुहोस्।"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरु गर्नुहोस्"</string> - <string name="new_app_description" msgid="1932143598371537340">"बचत नगरी पुरानो अनुप्रयोग रोक्नुहोस्।"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ले मेमोरी सीमा नाघ्यो"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"हिप डम्पलाई संग्रह गरिएको छ, साझेदारी गर्न छुनुहोस्"</string> <string name="dump_heap_title" msgid="5864292264307651673">"हिप डम्प साझेदारी गर्नुहुन्छ?"</string> @@ -1206,12 +1208,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM कार्ड थप गरियो"</string> <string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क पहुँच गर्न तपाईँको उपकरण पुनःस्टार्ट गर्नुहोस्।"</string> <string name="sim_restart_button" msgid="4722407842815232347">"पुनः सुरु गर्नुहोस्"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा सक्रिय गर्नुहोस्"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"आफ्नो नयाँ SIM सक्रिय गर्न सेवा प्रदायकको अनुप्रयोग डाउनलोड गर्नुहोस्"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अनुप्रयोग डाउनलोड गर्नुहोस्"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"नयाँ SIM घुसाइयो"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"समय मिलाउनुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 87be867e3356..c0965e538d3a 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps starten."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Opstarten afronden."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tik om over te schakelen naar de app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Schakelen tussen apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Er wordt al een andere app uitgevoerd die moet worden gestopt voordat u een nieuwe app kunt starten."</string> - <string name="old_app_action" msgid="493129172238566282">"Terug naar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"De nieuwe app niet starten."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> starten"</string> - <string name="new_app_description" msgid="1932143598371537340">"De oude app stoppen zonder opslaan."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> heeft geheugenlimiet overschreden"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump is verzameld. Tik om te delen."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Heap dump delen?"</string> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index c4f068b3a372..5672d480fbd7 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS ਸੁਨੇਹੇ"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"ਸਿਮ ਅਵਸਥਾ"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"ਸੈਟਿੰਗਾਂ"</string> <string name="global_action_assist" msgid="3892832961594295030">"ਸਹਾਇਤਾ ਕਰੋ"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"ਲਾਕਡਾਊਨ"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"ਨਵੀਂ ਸੂਚਨਾ"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"ਨੁਕਤਾ: ਜ਼ੂਮ ਵਧਾਉਣ ਅਤੇ ਘਟਾਉਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।"</string> <string name="autofill_this_form" msgid="4616758841157816676">"ਆਟੋਫਿਲ"</string> <string name="setup_autofill" msgid="7103495070180590814">"ਆਟੋਫਿਲ ਸੈਟ ਅਪ ਕਰੋ"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"ਆਟੋਫਿਲ"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ਐਪਸ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ਬੂਟ ਪੂਰਾ ਕਰ ਰਿਹਾ ਹੈ।"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ਵਾਪਸ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ਕੀ ਐਪਾਂ \'ਤੇ ਸਵਿੱਚ ਕਰਨਾ ਹੈ?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ਦੂਜਾ ਐਪ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ, ਜਿਸਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕ ਨਵਾਂ ਐਪ ਚਾਲੂ ਕਰ ਸਕਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੋਕਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਤੇ ਵਾਪਸ ਜਾਓ"</string> - <string name="old_app_description" msgid="2082094275580358049">"ਨਵਾਂ ਐਪ ਚਾਲੂ ਨਾ ਕਰੋ।"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕਰੋ"</string> - <string name="new_app_description" msgid="1932143598371537340">"ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਬਿਨਾਂ ਪੁਰਾਣਾ ਐਪ ਬੰਦ ਕਰੋ।"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਮੈਮਰੀ ਸੀਮਾ ਵਧ ਗਈ ਹੈ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ਹੀਪ ਡੰਪ ਇਕੱਤਰ ਕੀਤਾ ਗਿਆ; ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ਕੀ ਹੀਪ ਡੰਪ ਸ਼ੇਅਰ ਕਰਨਾ ਹੈ?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM ਕਾਰਡ ਜੋੜਿਆ ਗਿਆ"</string> <string name="sim_added_message" msgid="6599945301141050216">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਲਈ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string> <string name="sim_restart_button" msgid="4722407842815232347">"ਰੀਸਟਾਰਟ ਕਰੋ"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ਮੋਬਾਈਲ ਸੇਵਾ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ਆਪਣੇ ਨਵੇਂ ਸਿਮ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕੈਰੀਅਰ ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"ਨਵੀਂ SIM ਦਾਖਲ ਕੀਤੀ ਗਈ"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"ਇਸ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"ਸਮਾਂ ਸੈੱਟ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index f7ba675cce6a..2172aaed2687 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uruchamianie aplikacji."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Kończenie uruchamiania."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Działa <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Kliknij, by przełączyć na aplikację"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Czy przełączyć aplikacje?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Działa już inna aplikacja, którą trzeba zatrzymać, aby możliwe było uruchomienie nowej."</string> - <string name="old_app_action" msgid="493129172238566282">"Powrót do aplikacji <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nie uruchamiaj nowej aplikacji."</string> - <string name="new_app_action" msgid="5472756926945440706">"Uruchom <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zatrzymaj starą aplikację bez zapisywania."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył limit pamięci"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Pobrano zrzut sterty – kliknij, by go udostępnić"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Udostępnić zrzut stosu?"</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 4c88bc6f29d6..45512a567b73 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para alternar para o app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro app já está em execução e deve ser interrompido antes que você inicie um novo app."</string> - <string name="old_app_action" msgid="493129172238566282">"Voltar para <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Parar o app antigo sem salvar."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index c9e0a6051785..a3c8087139ad 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"A iniciar aplicações"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"A concluir o arranque."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para mudar para a aplicação"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Mudar de aplicação?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Já está em execução outra aplicação, que terá de ser parada para que possa iniciar uma nova."</string> - <string name="old_app_action" msgid="493129172238566282">"Regressar a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Não iniciar a nova aplicação."</string> - <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Parar a aplicação antiga sem guardar."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite da memória"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Pretende partilhar a captura da área dinâmica para dados?"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4c88bc6f29d6..45512a567b73 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para alternar para o app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro app já está em execução e deve ser interrompido antes que você inicie um novo app."</string> - <string name="old_app_action" msgid="493129172238566282">"Voltar para <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Parar o app antigo sem salvar."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 792e7e2cf252..0e25356c2617 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1105,13 +1105,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Se pornesc aplicațiile."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Se finalizează pornirea."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Atingeți ca să comutați la aplicație"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Comutați între aplicații?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"O altă aplicație rulează deja și trebuie oprită înainte a putea porni o aplicație nouă."</string> - <string name="old_app_action" msgid="493129172238566282">"Reveniți la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nu porniți aplicația nouă."</string> - <string name="new_app_action" msgid="5472756926945440706">"Porniți <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Opriți vechea aplicație fără să salvați."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Datele privind memoria au fost culese; atingeți pentru a trimite"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string> @@ -1867,7 +1872,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicație dăunătoare detectată"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vrea să afișeze porțiuni din <xliff:g id="APP_2">%2$s</xliff:g>"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Editați"</string> - <string name="notification_channel_system_changes" msgid="5072715579030948646">"Modificări ale Sistem"</string> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"Modificări de sistem"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Funcția Nu deranja s-a schimbat"</string> <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Atingeți pentru a verifica setările de comportament pentru întreruperi"</string> </resources> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 0689833c4254..bea3f8b87392 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск приложений."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Окончание загрузки..."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Приложение <xliff:g id="APP">%1$s</xliff:g> запущено"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Нажмите, чтобы перейти в приложение."</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Переключение приложений"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Выполняется другое приложение, которое необходимо остановить перед запуском нового."</string> - <string name="old_app_action" msgid="493129172238566282">"Вернуться к приложению <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Не запускать новое приложение."</string> - <string name="new_app_action" msgid="5472756926945440706">"Запустить приложение <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Остановить старое приложение без сохранения изменений."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Объем памяти процесса \"<xliff:g id="PROC">%1$s</xliff:g>\" превышен"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Создан дамп кучи. Нажмите, чтобы отправить его."</string> <string name="dump_heap_title" msgid="5864292264307651673">"Отправить дамп кучи?"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 5db0730a4022..7106d9ddc778 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -1087,13 +1087,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"යෙදුම් ආරම්භ කරමින්."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"ඇරඹුම අවසාන කරමින්."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ධාවනය වෙමින්"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"යෙදුමට මාරු වීමට තට්ටු කරන්න"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"යෙදුම් මාරු වනවාද?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"අලුත් යෙදුමක් ආරම්භ කිරීමට පෙර තවමත් ක්රියාවෙහි යෙදෙමින් පවතින යෙදුම නැවැත්විය යුතුයි."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> වෙත ආපසු යන්න"</string> - <string name="old_app_description" msgid="2082094275580358049">"නව යෙදුම ආරම්භ නොකරන්න."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> අරඹන්න"</string> - <string name="new_app_description" msgid="1932143598371537340">"සුරැකීමකින් තොරව පරණ යෙදුම නවත්වන්න."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> මතකයේ සීමාව ඉක්මවා ඇත"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ඉවත දැමීම් ගොඩ රැස් කර ඇත. බෙදා ගැනීමට තට්ටු කරන්න"</string> <string name="dump_heap_title" msgid="5864292264307651673">"සංච නික්ෂේපය බෙදාගන්න ද?"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 4f7f59904222..8317c7586509 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Prebieha spúšťanie aplikácií."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Prebieha dokončovanie spúšťania."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Klepnutím prepnite na aplikáciu"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Prepnúť aplikácie?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Pred spustením novej aplikácie treba zastaviť inú spustenú aplikáciu."</string> - <string name="old_app_action" msgid="493129172238566282">"Návrat k <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Nespúšťať novú aplikáciu."</string> - <string name="new_app_action" msgid="5472756926945440706">"Spustiť <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Zastaviť starú aplikáciu bez uloženia."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> prekročil limit pamäte"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Boli zhromaždené zálohy údajov; zdieľajte ich klepnutím"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Chcete zdieľať zálohy údajov?"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index dacff539b13a..7642544cb5fa 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -95,8 +95,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Sporočila SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sporočila v odzivniku"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Klicanje prek Wi-Fi-ja"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Stanje kartice SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Enakovredna naprava je zahtevala način TTY FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Enakovredna naprava je zahtevala način TTY HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Enakovredna naprava je zahtevala način TTY VCO"</string> @@ -246,8 +245,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string> <string name="global_action_assist" msgid="3892832961594295030">"Pomoč"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Zakleni"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Novo obvestilo"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Navidezna tipkovnica"</string> @@ -834,8 +832,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Nasvet: Tapnite dvakrat, če želite povečati ali pomanjšati."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Samoizp."</string> <string name="setup_autofill" msgid="7103495070180590814">"Nastavi samoizp."</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Samodejno izpolnjevanje"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1128,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon aplikacij."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončevanje zagona."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dotaknite se, če želite preklopiti na aplikacijo"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite preklopiti aplikacije?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Preden zaženete novo aplikacijo, ustavite izvajano."</string> - <string name="old_app_action" msgid="493129172238566282">"Vrni se na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ne zaženite nove aplikacije."</string> - <string name="new_app_action" msgid="5472756926945440706">"Začni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Ustavi prejšnjo aplikacijo brez shranjevanja."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> je presegel omejitev pomnilnika"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Izvoz kopice je zbran; dotaknite se za deljenje z drugimi"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Deljenje izvoza kopice z drugimi?"</string> @@ -1244,12 +1246,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Kartica SIM dodana"</string> <string name="sim_added_message" msgid="6599945301141050216">"Za dostop do mobilnega omrežja znova zaženite napravo."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Vnovičen zagon"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilno storitev"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Prenesite aplikacijo operaterja, da boste lahko aktivirali novo kartico SIM"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Prenos aplikacije"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova kartica SIM je vstavljena"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Dotaknite se za nastavitev"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Nastavi uro"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index f3b912d63d6f..a98122285371 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Mesazhet SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesazhet e postës zanore"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Telefonata me Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Statusi i kartës SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Homologu yt kërkoi modalitet \"TTY\" të plotë"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\""</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\""</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Cilësimet"</string> <string name="global_action_assist" msgid="3892832961594295030">"Ndihma"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Ndihma zanore"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Blloko"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Njoftim i ri"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Këshillë! Trokit dy herë për të zmadhuar dhe zvogëluar."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Plotësim automatik"</string> <string name="setup_autofill" msgid="7103495070180590814">"Konfiguro plotësuesin automatik"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Plotësim automatik"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikacionet e fillimit."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Po përfundon nisjen."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> është në punë"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Trokit për të kaluar tek aplikacioni"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Të ndryshohen aplikacionet?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Një tjetër aplikacion është në punë dhe duhet ndaluar përpara se të nisësh një tjetër."</string> - <string name="old_app_action" msgid="493129172238566282">"Kthehu në <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Mos e fillo aplikacion të ri."</string> - <string name="new_app_action" msgid="5472756926945440706">"Fillo <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Ndalo aplikacionin e vjetër pa e ruajtur."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> e ka kaluar kufirin e memories"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Stiva e skedarëve fiktivë është mbledhur; trokit për t\'i ndarë"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Të ndahet stiva e skedarëve fiktivë?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Karta SIM u shtua"</string> <string name="sim_added_message" msgid="6599945301141050216">"Rinise pajisjen për të pasur qasje në rrjetin celular."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Rifillo"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizo shërbimin celular"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Shkarko aplikacionin e operatorit celular për të aktivizuar kartën e re SIM"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Shkarko aplikacionin"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Është futur kartë e re SIM"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Trokit për ta konfiguruar"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Cakto kohën"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index ced2b5125509..aa5226bd700b 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1105,13 +1105,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Покретање апликација."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Завршавање покретања."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Додирните да бисте прешли на апликацију"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Желите ли да пређете на другу апликацију?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Већ је покренута друга апликација која мора да буде заустављена да бисте могли да покренете нову."</string> - <string name="old_app_action" msgid="493129172238566282">"Врати се у <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Не покрећите нову апликацију."</string> - <string name="new_app_action" msgid="5472756926945440706">"Покрени <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Зауставља стару апликацију без чувања."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> премашује ограничење меморије"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Снимак динамичког дела меморије је направљен; додирните за дељење"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Желите ли да делите снимак динамичког дела меморије?"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index be9e3dd230cb..e713c30641af 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Sms"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Röstmeddelanden"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-samtal"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Status för SIM-kort"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Peer-enheten begärde texttelefonläget FULL"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Peer-enheten begärde texttelefonläget HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Peer-enheten begärde texttelefonläget VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string> <string name="global_action_assist" msgid="3892832961594295030">"Hjälp"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Låsning"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Ny avisering"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuellt tangentbord"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Tips! Dubbelknacka om du vill zooma in eller ut."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string> <string name="setup_autofill" msgid="7103495070180590814">"Ange Autofyll"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Autofyll"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Appar startas."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Uppgraderingen är klar."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> körs"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tryck om du vill byta till appen"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vill du byta app?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"En annan app som körs måste avslutas innan du kan starta en ny."</string> - <string name="old_app_action" msgid="493129172238566282">"Gå tillbaka till <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Starta inte den nya appen."</string> - <string name="new_app_action" msgid="5472756926945440706">"Starta <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Avbryt den gamla appen utan att spara."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Minnesgränsen har överskridits för <xliff:g id="PROC">%1$s</xliff:g>"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"En minnesdump har skapats – tryck här om du vill dela den"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Vill du dela minnesdumpen?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM-kort lades till"</string> <string name="sim_added_message" msgid="6599945301141050216">"Du måste starta om enheten för att ansluta till det mobila nätverket."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Starta om"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivera mobiltjänst"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Ladda ned operatörens app och aktivera det nya SIM-kortet"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ladda ned appen"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Nytt SIM-kort har satts in"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Tryck om du vill konfigurera"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Ange tid"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 1c9ae55a406a..3eeed7f759a6 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1083,13 +1083,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Programu zinaanza"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Inamaliza kuwasha."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> inaendelea"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Gusa ili uende kwenye programu"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Badilisha programu?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Programmu nyingine tayari inaendeshwa na lazima hiyo ikomeshwe kabla ya kuanza nyingine mpya."</string> - <string name="old_app_action" msgid="493129172238566282">"Rejea katika <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Usianzishe programu mpya."</string> - <string name="new_app_action" msgid="5472756926945440706">"Anza <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Komesha programu ya zamani bila kuhifadhi."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> imezidi kiwango cha hifadhi kinachotakikana"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Imezidi kikomo cha hifadhi; gusa ili uishiriki"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Ungependa kushiriki picha ya binafsi?"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index f912b6d345da..e251ca411b18 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS செய்திகள்"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"குரலஞ்சல் செய்திகள்"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"வைஃபை அழைப்பு"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"சிம் நிலை"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string> <string name="global_action_assist" msgid="3892832961594295030">"உதவி"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"பூட்டு"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"புதிய அறிவிப்பு"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"விர்ச்சுவல் விசைப்பலகை"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"உதவிக்குறிப்பு: அளவைப் பெரிதாக்க மற்றும் குறைக்க இருமுறைத் தட்டவும்."</string> <string name="autofill_this_form" msgid="4616758841157816676">"தன்னிரப்பி"</string> <string name="setup_autofill" msgid="7103495070180590814">"தன்னிரப்பியை அமை"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"தன்னிரப்பி"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"பயன்பாடுகள் தொடங்கப்படுகின்றன."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"துவக்குதலை முடிக்கிறது."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> இயங்குகிறது"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"பயன்பாட்டிற்கு மாற, தட்டவும்"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"பயன்பாடுகளை மாற்றவா?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ஏற்கனவே ஒரு பயன்பாடு இயக்கத்தில் உள்ளது, புதிய ஒன்றைத் தொடங்கும்போது முன்பு இதை நிறுத்த வேண்டும்."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> க்குத் திரும்பு"</string> - <string name="old_app_description" msgid="2082094275580358049">"புதிய பயன்பாட்டைத் தொடங்க வேண்டாம்."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ஐத் தொடங்கு"</string> - <string name="new_app_description" msgid="1932143598371537340">"சேமிக்காமல், பழைய பயன்பாட்டை நிறுத்தவும்."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"நினைவக வரம்பை <xliff:g id="PROC">%1$s</xliff:g> மீறியது"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ஹீப் டம்ப் சேகரிக்கப்பட்டது; பகிர, தட்டவும்"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ஹீப் டம்பைப் பகிரவா?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"சிம் கார்டு சேர்க்கப்பட்டது"</string> <string name="sim_added_message" msgid="6599945301141050216">"மொபைல் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்."</string> <string name="sim_restart_button" msgid="4722407842815232347">"மீண்டும் தொடங்கு"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"மொபைல் சேவையை இயக்கு"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"உங்கள் புதிய சிம்மை இயக்க, தொலைத்தொடர்பு நிறுவனத்தின் பயன்பாட்டைப் பதிவிறக்கவும்"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"பயன்பாட்டைப் பதிவிறக்கு"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"புதிய சிம் செருகப்பட்டது"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"அமைக்க, தட்டவும்"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"நேரத்தை அமை"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b123224bc5eb..b05ce97c3fca 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS సందేశాలు"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"వాయిస్ మెయిల్ సందేశాలు"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi కాలింగ్"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM స్థితి"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"అవతలి వారు FULL TTY మోడ్ని అభ్యర్థించారు"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్లు"</string> <string name="global_action_assist" msgid="3892832961594295030">"సహాయం"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ అసిస్టెంట్"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"లాక్ చేయి"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"కొత్త నోటిఫికేషన్"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"వర్చువల్ కీబోర్డ్"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"చిట్కా: దగ్గరకు మరియు దూరానికి జూమ్ చేయడానికి రెండు సార్లు నొక్కండి."</string> <string name="autofill_this_form" msgid="4616758841157816676">"స్వీయ పూరింపు"</string> <string name="setup_autofill" msgid="7103495070180590814">"స్వీయ పూరణను సెటప్ చేయండి"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"స్వీయ పూరింపు"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"అనువర్తనాలను ప్రారంభిస్తోంది."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"బూట్ను ముగిస్తోంది."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"అనువర్తనానికి మారడానికి నొక్కండి"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"అనువర్తనాలను మార్చాలా?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"మరో యాప్ ఇప్పటికే అమలవుతోంది, మీరు మరోదాన్ని ప్రారంభించడానికి ముందు అది తప్పనిసరిగా ఆపివేయబడాలి."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>కు తిరిగి వెళ్లండి"</string> - <string name="old_app_description" msgid="2082094275580358049">"కొత్త యాప్ను ప్రారంభించవద్దు."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>ని ప్రారంభించండి"</string> - <string name="new_app_description" msgid="1932143598371537340">"పాత యాప్ను సేవ్ చేయకుండానే ఆపివేయండి."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> మెమరీ పరిమితిని మించిపోయింది"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"కుప్పలు తెప్పలుగా సేకరించబడింది; షేర్ చేయడానికి నొక్కండి"</string> <string name="dump_heap_title" msgid="5864292264307651673">"హీప్ డంప్ను భాగస్వామ్యం చేయాలా?"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"సిమ్ కార్డు జోడించబడింది"</string> <string name="sim_added_message" msgid="6599945301141050216">"మొబైల్ నెట్వర్క్ను యాక్సెస్ చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి."</string> <string name="sim_restart_button" msgid="4722407842815232347">"పునఃప్రారంభించు"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"మొబైల్ సేవను సక్రియం చేయండి"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"మీ కొత్త SIMని సక్రియం చేయడానికి క్యారియర్ యాప్ను డౌన్లోడ్ చేయండి"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"యాప్ని డౌన్లోడ్ చేయి"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"కొత్త SIM చొప్పించారు"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"దీన్ని సెటప్ చేయడానికి నొక్కండి"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"సమయాన్ని సెట్ చేయండి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 8444ff0496bf..7aa594a1acb0 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"กำลังเริ่มต้นแอปพลิเคชัน"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"เสร็จสิ้นการบูต"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงาน"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"แตะเพื่อสลับไปยังแอป"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"สลับแอปพลิเคชันหรือไม่"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"มีแอปพลิเคชันอื่นที่กำลังทำงานอยู่แล้ว ซึ่งต้องหยุดทำงานก่อนที่คุณจะเริ่มแอปพลิเคชันใหม่ได้"</string> - <string name="old_app_action" msgid="493129172238566282">"กลับสู่ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"อย่าเริ่มแอปพลิเคชันใหม่"</string> - <string name="new_app_action" msgid="5472756926945440706">"เริ่มต้น <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"หยุดการทำงานของแอปพลิเคชันเก่าโดยไม่บันทึก"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string> <string name="dump_heap_title" msgid="5864292264307651673">"แชร์ฮีพดัมพ์ไหม"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 6c8e47da1736..9bb64e09813c 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Sinisimulan ang apps."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Pagtatapos ng pag-boot."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"I-tap upang lumipat sa app"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Lumipat ng apps?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"May tumatakbo nang isa pang app na dapat na ihinto bago ka makapagsimula ng bago."</string> - <string name="old_app_action" msgid="493129172238566282">"Bumalik sa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Huwag simulan ang bagong app."</string> - <string name="new_app_action" msgid="5472756926945440706">"Simulan ang <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Ihinto ang lumang app nang hindi nagse-save."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Lumampas ang <xliff:g id="PROC">%1$s</xliff:g> sa limitasyon ng memory"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Nakolekta na ang heap dump; i-tap upang ibahagi"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Ibahagi ang heap dump?"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 88583887a2c2..e63e319b45d4 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS mesajları"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sesli mesajlar"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Kablosuz çağrı"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM durumu"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"Karşı taraf TTY Modunu TAM yaptı"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"Karşı taraf TTY Modunu HCO yaptı"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"Karşı taraf TTY Modunu VCO yaptı"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string> <string name="global_action_assist" msgid="3892832961594295030">"Asist"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Sesli Yardım"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Tam gizlilik"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Yeni bildirim"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sanal klavye"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez dokunun."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Otomatik Doldur"</string> <string name="setup_autofill" msgid="7103495070180590814">"Otomatik doldurma ayarla"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Otomatik doldur"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1072,7 +1069,7 @@ <string name="screen_compat_mode_hint" msgid="1064524084543304459">"Bunu Sistem ayarları > Uygulamalar > İndirilenler bölümünden yeniden etkinleştirin."</string> <string name="unsupported_display_size_message" msgid="6545327290756295232">"<xliff:g id="APP_NAME">%1$s</xliff:g> geçerli Ekran boyutu ayarını desteklemiyor ve beklenmedik bir şekilde davranabilir."</string> <string name="unsupported_display_size_show" msgid="7969129195360353041">"Her zaman göster"</string> - <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması Android OS\'un uyumlu olmayan önceki bir sürümü için geliştirilmiştir ve beklenmedik şekilde davranabilir. Uygulamanın güncellenmiş bir sürümü mevcut olabilir."</string> + <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması Android OS\'in uyumlu olmayan önceki bir sürümü için geliştirilmiştir ve beklenmedik şekilde davranabilir. Uygulamanın güncellenmiş bir sürümü mevcut olabilir."</string> <string name="unsupported_compile_sdk_show" msgid="2681877855260970231">"Her zaman göster"</string> <string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Güncellemeleri denetle"</string> <string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması (<xliff:g id="PROCESS">%2$s</xliff:g> işlemi) kendiliğinden uyguladığı StrictMode politikasını ihlal etti."</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uygulamalar başlatılıyor"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Açılış tamamlanıyor."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Uygulamaya geçmek için dokunun"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Uygulama değiştirilsin mi?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Başka bir uygulama zaten çalışıyor. Yeni bir uygulama başlatmadan bu uygulama durdurulmalıdır."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> öğesine geri dön"</string> - <string name="old_app_description" msgid="2082094275580358049">"Yeni uygulamayı başlatmayın."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> uygulamasını başlat"</string> - <string name="new_app_description" msgid="1932143598371537340">"Kaydetmeden eski uygulamayı durdurun."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> bellek sınırını aştı"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın dökümü toplandı. Paylaşmak için dokunun"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Yığın dökümü paylaşılsın mı?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM kart eklendi"</string> <string name="sim_added_message" msgid="6599945301141050216">"Mobil ağa erişmek için cihazınızı yeniden başlatın."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Yeniden başlat"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil hizmeti etkinleştirin"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yeni SIM\'inizi etkinleştirmek için operatörün uygulamasını indirin"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Uygulama indir"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart takıldı"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Kurmak için dokunun"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Saati ayarlayın"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index b9fba79cf45c..61f74bf684a7 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1125,13 +1125,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск програм."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Завершення завантаження."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"Працює <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Торкніться, щоб відкрити додаток"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Переключитися між програмами?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Уже працює інша програма, яку потрібно зупинити перед тим, як запускати нову програму."</string> - <string name="old_app_action" msgid="493129172238566282">"Поверн. до <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Не запускати нову програму."</string> - <string name="new_app_action" msgid="5472756926945440706">"Запуст. <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Зупинити попередню програму без збереження."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"Процес <xliff:g id="PROC">%1$s</xliff:g> перевищив ліміт пам’яті"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Дані динамічної пам’яті зібрано. Торкніться, щоб поділитися"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Поділитися даними динамічної пам’яті?"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index f9e26ca7bda1..73a1146ecc5f 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"SMS پیغامات"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"صوتی میل پیغامات"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi کالنگ"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM کا اسٹیٹس"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"ہمسر نے TTY وضع مکمل کی درخواست کی"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"ہمسر نے TTY وضع HCO کی درخواست کی"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"ہمسر نے TTY وضع VCO کی درخواست کی"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string> <string name="global_action_assist" msgid="3892832961594295030">"اسسٹ"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"مقفل"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"نئی اطلاع"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ورچوئل کی بورڈ"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"تجویز: زوم ان اور آؤٹ کیلئے دو بار تھپتھپائیں۔"</string> <string name="autofill_this_form" msgid="4616758841157816676">"آٹوفل"</string> <string name="setup_autofill" msgid="7103495070180590814">"آٹوفل مقرر کریں"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"آٹو فل"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">"، "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"ایپس شروع ہو رہی ہیں۔"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"بوٹ مکمل ہو رہا ہے۔"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> چل رہی ہے"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ایپ پر سوئچ کرنے کیلئے تھپتھپائیں"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ایپس سوئچ کریں؟"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ایک دوسری ایپ پہلے سے چل رہی ہے، جس کا بند ہونا ضروری ہے تاکہ آپ ایک نئی ایپ شروع کر سکیں۔"</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> پر واپس جائیں"</string> - <string name="old_app_description" msgid="2082094275580358049">"نئی ایپ شروع نہ کریں۔"</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> شروع کریں"</string> - <string name="new_app_description" msgid="1932143598371537340">"محفوظ کیے بغیر پرانی ایپ بند کریں۔"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> میموری کی حد سے تجاوز کرگئی"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"ہیپ ڈمپ جمع ہو گیا ہے، اشتراک کرنے کیلئے تھپتھپائیں"</string> <string name="dump_heap_title" msgid="5864292264307651673">"ہیپ ڈمپ کا اشتراک کریں؟"</string> @@ -1201,12 +1203,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM شامل کیا گیا"</string> <string name="sim_added_message" msgid="6599945301141050216">"موبائل نیٹ ورک تک رسائی کیلئے اپنا آلہ دوبارہ سٹارٹ کریں۔"</string> <string name="sim_restart_button" msgid="4722407842815232347">"دوبارہ شروع کریں"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"موبائل سروس فعال کریں"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"اپنا نیا SIM فعال کرنے کیلئے کیریئر ایپ ڈاؤن لوڈ کریں"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ایپ ڈاؤن لوڈ کریں"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"نئی SIM داخل ہو گئی"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"اسے سیٹ اپ کرنے کیلئے تھپتھپائیں"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"وقت سیٹ کریں"</string> @@ -1840,6 +1839,6 @@ <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string> <string name="screenshot_edit" msgid="7867478911006447565">"ترمیم کریں"</string> <string name="notification_channel_system_changes" msgid="5072715579030948646">"سسٹم کی تبدیلیاں"</string> - <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string> <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"مداخلتوں کے مد نظر اپنے برتاؤ کی ترتیبات چیک کرنے کیلئے تھپتھپائیں"</string> </resources> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index 735a66cef194..3d48f843497f 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ilovalar ishga tushirilmoqda."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Tizimni yuklashni tugatish."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ilovaga o‘tish uchun bosing"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Ilovalar almashtirilsinmi?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Boshqa ilova ishlab turibdi. Yangisini ishga tushirishdan oldin avvalgisini yoping."</string> - <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>ga qaytish"</string> - <string name="old_app_description" msgid="2082094275580358049">"Yangi ilova ishga tushirilmasin."</string> - <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>ni ishga tushirish"</string> - <string name="new_app_description" msgid="1932143598371537340">"O‘zgarishlarni saqlamasdan, eski ilova yopilsin"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> foydalanish uchun ajratilgan xotira chegarasidan o‘tib ketdi"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hip-damp yaratildi; uni yuborish uchun bosing"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Hip-damp ma’lumotlari bilan ulashasizmi?"</string> @@ -1833,7 +1838,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararli ilova aniqlandi"</string> <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ilovasi <xliff:g id="APP_2">%2$s</xliff:g> ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda"</string> <string name="screenshot_edit" msgid="7867478911006447565">"Tahrirlash"</string> - <string name="notification_channel_system_changes" msgid="5072715579030948646">"Tizimda o‘zgartirishlar"</string> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"Tizimga oid o‘zgarishlar"</string> <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string> <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ularni tekshirish uchun bosing."</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 303ef78731f7..1671cd6d3fd5 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"Tin nhắn SMS"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"Thư thoại"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Gọi qua Wi-Fi"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"Trạng thái SIM"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string> <string name="global_action_assist" msgid="3892832961594295030">"Hỗ trợ"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"Khóa"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"Thông báo mới"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bàn phím ảo"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"Mẹo: Nhấn đúp để phóng to và thu nhỏ."</string> <string name="autofill_this_form" msgid="4616758841157816676">"Tự động điền"</string> <string name="setup_autofill" msgid="7103495070180590814">"Thiết lập Tự động điền"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"Tự động điền"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Khởi động ứng dụng."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Hoàn tất khởi động."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Nhấn để chuyển sang ứng dụng"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Chuyển đổi ứng dụng?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bạn phải dừng một ứng dụng khác hiện đang chạy trước khi khởi động một ứng dụng mới."</string> - <string name="old_app_action" msgid="493129172238566282">"Quay lại <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Không khởi động ứng dụng mới."</string> - <string name="new_app_action" msgid="5472756926945440706">"Bắt đầu <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Dừng ứng dụng cũ mà không lưu."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> đã vượt quá giới hạn bộ nhớ"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tệp báo lỗi đã được thu thập; nhấn để chia sẻ"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Chia sẻ tệp báo lỗi?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"Đã thêm thẻ SIM"</string> <string name="sim_added_message" msgid="6599945301141050216">"Khởi động lại thiết bị của bạn để truy cập mạng di động."</string> <string name="sim_restart_button" msgid="4722407842815232347">"Khởi động lại"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Kích hoạt dịch vụ di động"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Tải xuống ứng dụng của nhà cung cấp dịch vụ để kích hoạt SIM mới"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Tải xuống ứng dụng"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"Đã lắp SIM mới"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"Nhấn để thiết lập"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"Đặt giờ"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 2c430232a9a4..ff11ef55d723 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"短信"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"语音邮件"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN 通话"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡状态"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"对方请求使用“TTY 完整”模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"对方请求使用“TTY HCO”模式"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"对方请求使用“TTY VCO”模式"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"设置"</string> <string name="global_action_assist" msgid="3892832961594295030">"助理"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"语音助理"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"锁定"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虚拟键盘"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"提示:点按两次可放大或缩小。"</string> <string name="autofill_this_form" msgid="4616758841157816676">"自动填充"</string> <string name="setup_autofill" msgid="7103495070180590814">"设置自动填充"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"自动填充"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在启动应用。"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"即将完成启动。"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>正在运行"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"点按即可切换到应用"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切换应用吗?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"已有一个应用正在运行,要启动新的应用,您必须先停止该应用。"</string> - <string name="old_app_action" msgid="493129172238566282">"返回至<xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"不启动新的应用。"</string> - <string name="new_app_action" msgid="5472756926945440706">"启动<xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"停止旧的应用,但不保存。"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>占用的内存已超出限制"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆转储数据;点按即可共享"</string> <string name="dump_heap_title" msgid="5864292264307651673">"要共享堆转储数据吗?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"已添加SIM卡"</string> <string name="sim_added_message" msgid="6599945301141050216">"请重新启动您的设备,以便访问移动网络。"</string> <string name="sim_restart_button" msgid="4722407842815232347">"重新启动"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"激活移动网络服务"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下载运营商应用即可激活您的新 SIM 卡"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下载应用"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新 SIM 卡"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"点按即可进行设置"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"设置时间"</string> @@ -1838,7 +1837,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"检测到有害应用"</string> <string name="slices_permission_request" msgid="8484943441501672932">"“<xliff:g id="APP_0">%1$s</xliff:g>”想要显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块"</string> <string name="screenshot_edit" msgid="7867478911006447565">"编辑"</string> - <string name="notification_channel_system_changes" msgid="5072715579030948646">"系统更改"</string> - <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"“勿扰”设置已更改"</string> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"系统变更"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"“勿扰”设置有变更"</string> <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"点按即可查看您的干扰行为设置"</string> </resources> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index e837ae7219fc..5bf1a37fa9c9 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"短訊"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"留言訊息"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"對方曾要求 TTY 完整模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"對方曾要求 TTY 模式 (HCO)"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"對方曾要求 TTY 模式 (VCO)"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> <string name="global_action_assist" msgid="3892832961594295030">"協助"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"語音助手"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"鎖定"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"提示:輕按兩下即可放大縮小。"</string> <string name="autofill_this_form" msgid="4616758841157816676">"自動填入"</string> <string name="setup_autofill" msgid="7103495070180590814">"設定自動填入功能"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"自動填入"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"正在執行 <xliff:g id="APP">%1$s</xliff:g>"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"輕按即可切換至應用程式"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切換應用程式?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"另一個應用程式已在執行,您必須停止執行該應用程式,才能啟動新的應用程式。"</string> - <string name="old_app_action" msgid="493129172238566282">"返回 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"請勿啟動新的應用程式。"</string> - <string name="new_app_action" msgid="5472756926945440706">"啟動 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"停止舊的應用程式,且不儲存。"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 的記憶體用量已超過限額"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆轉儲;輕按即可分享"</string> <string name="dump_heap_title" msgid="5864292264307651673">"分享堆轉儲?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string> <string name="sim_added_message" msgid="6599945301141050216">"重新啟動裝置,才能使用流動網絡。"</string> <string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟動流動服務"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載流動網絡供應商應用程式,即可啟用新 SIM 卡"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"輕按即可設定"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"設定時間"</string> @@ -1838,10 +1837,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害的應用程式"</string> <string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊"</string> <string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"請勿騷擾已變更"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕按即可查看您的干擾行為設定"</string> </resources> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 2bff3884c256..ed24a35f5183 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -93,8 +93,7 @@ <string name="notification_channel_sms" msgid="3441746047346135073">"簡訊"</string> <string name="notification_channel_voice_mail" msgid="3954099424160511919">"語音留言"</string> <string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string> - <!-- no translation found for notification_channel_sim (4052095493875188564) --> - <skip /> + <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string> <string name="peerTtyModeFull" msgid="6165351790010341421">"通訊對象要求使用 TTY 的 FULL 模式"</string> <string name="peerTtyModeHco" msgid="5728602160669216784">"通訊對象要求使用 TTY 的 HCO 模式"</string> <string name="peerTtyModeVco" msgid="1742404978686538049">"通訊對象要求使用 TTY 的 VCO 模式"</string> @@ -240,8 +239,7 @@ <string name="global_action_settings" msgid="1756531602592545966">"設定"</string> <string name="global_action_assist" msgid="3892832961594295030">"協助"</string> <string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string> - <!-- no translation found for global_action_lockdown (1099326950891078929) --> - <skip /> + <string name="global_action_lockdown" msgid="1099326950891078929">"鎖定"</string> <string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string> <string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string> <string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string> @@ -828,8 +826,7 @@ <string name="double_tap_toast" msgid="4595046515400268881">"提示:輕觸兩下即可縮放。"</string> <string name="autofill_this_form" msgid="4616758841157816676">"自動填入功能"</string> <string name="setup_autofill" msgid="7103495070180590814">"設定自動填入功能"</string> - <!-- no translation found for autofill_window_title (921006636895825007) --> - <skip /> + <string name="autofill_window_title" msgid="921006636895825007">"自動填入"</string> <string name="autofill_address_name_separator" msgid="6350145154779706772">" //*** Empty segment here as a separator ***//"</string> <string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string> <string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string> @@ -1088,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 執行中"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"輕觸即可切換至應用程式"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切換應用程式?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"其他應用程式已在執行中,你必須停止執行該應用程式,才能啟動新的應用程式。"</string> - <string name="old_app_action" msgid="493129172238566282">"返回 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"請勿啟動新的應用程式。"</string> - <string name="new_app_action" msgid="5472756926945440706">"啟動 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"停止舊的應用程式且不儲存。"</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 已超出記憶體上限"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"已取得記憶體快照資料;輕觸即可分享"</string> <string name="dump_heap_title" msgid="5864292264307651673">"分享記憶體快照資料?"</string> @@ -1200,12 +1202,9 @@ <string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string> <string name="sim_added_message" msgid="6599945301141050216">"請重新啟動裝置,才能使用行動網路。"</string> <string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string> - <!-- no translation found for install_carrier_app_notification_title (9056007111024059888) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_text (3346681446158696001) --> - <skip /> - <!-- no translation found for install_carrier_app_notification_button (3094206295081900849) --> - <skip /> + <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟用行動服務"</string> + <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載電信業者應用程式以啟用你的新 SIM 卡"</string> + <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string> <string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string> <string name="carrier_app_notification_text" msgid="1132487343346050225">"輕觸這裡即可進行設定"</string> <string name="time_picker_dialog_title" msgid="8349362623068819295">"設定時間"</string> @@ -1838,10 +1837,7 @@ <string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害應用程式"</string> <string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string> <string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string> - <!-- no translation found for notification_channel_system_changes (5072715579030948646) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) --> - <skip /> - <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) --> - <skip /> + <string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string> + <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"「零打擾」設定已變更"</string> + <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕觸即可查看你的干擾行為設定"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index e292e3af8e93..74bca258e5b1 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1085,13 +1085,18 @@ <string name="android_upgrading_starting_apps" msgid="451464516346926713">"Qalisa izinhlelo zokusebenza."</string> <string name="android_upgrading_complete" msgid="1405954754112999229">"Qedela ukuqala kabusha."</string> <string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> iyasebenza"</string> - <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Thepha ukuze ushintshele kuhlelo lokusebenza"</string> - <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Shintsha izinhlelo zokusebenza?"</string> - <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Olunye uhlelo lokusebenza luvele luyasebenza lokho kumele kumiswe ngaphambi kokuba uqalise olusha."</string> - <string name="old_app_action" msgid="493129172238566282">"Buyisela ku:<xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="old_app_description" msgid="2082094275580358049">"Ungayiqali uhlelo lokusebenza entsha."</string> - <string name="new_app_action" msgid="5472756926945440706">"Qala <xliff:g id="OLD_APP">%1$s</xliff:g>"</string> - <string name="new_app_description" msgid="1932143598371537340">"Misa uhlelo lokusebenza endala ngaphandle kokulondoloza."</string> + <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_title (387882830435195342) --> + <skip /> + <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) --> + <skip /> + <!-- no translation found for old_app_action (3044685170829526403) --> + <skip /> + <!-- no translation found for new_app_action (6694851182870774403) --> + <skip /> + <!-- no translation found for new_app_description (5894852887817332322) --> + <skip /> <string name="dump_heap_notification" msgid="2618183274836056542">"I-<xliff:g id="PROC">%1$s</xliff:g> idlule umkhawulo wememori"</string> <string name="dump_heap_notification_detail" msgid="6901391084243999274">"Ukulahlwa kwehipu kuqoqiwe; thepha ukuze wabelane"</string> <string name="dump_heap_title" msgid="5864292264307651673">"Yabelana ngokulahlwa kwehipu?"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index d26567e9a3f5..96a83f837fb3 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5905,6 +5905,9 @@ <!-- Identifier of the image file. This attribute is mandatory. It must be an image file with multiple frames, e.g. gif or webp --> <attr name="src" /> + <!-- Indicates if the drawable needs to be mirrored when its layout direction is + RTL (right-to-left). --> + <attr name="autoMirrored" /> </declare-styleable> <!-- Drawable used to draw bitmaps. --> @@ -6328,6 +6331,9 @@ <!-- Special option for window animations: if this window is on top of a wallpaper, don't animate the wallpaper with it. --> <attr name="detachWallpaper" format="boolean" /> + <!-- Special option for window animations: show the wallpaper behind when running this + animation. --> + <attr name="showWallpaper" format="boolean" /> </declare-styleable> <declare-styleable name="AnimationSet"> @@ -8000,6 +8006,8 @@ <attr name="icon"/> <!-- The activity to launch when the setting is clicked on. --> <attr name="settingsActivity"/> + <!-- The user restriction for this preference. --> + <attr name="userRestriction"/> </declare-styleable> <!-- =============================== --> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 3697f3e02925..3b963d1ea079 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2518,6 +2518,32 @@ in the display pipeline plus some slack just to be sure. --> <integer name="config_drawLockTimeoutMillis">120</integer> + <!-- An array of device capabilities defined by GSMA SGP.22 v2.0. + The first item is the capability name that the device supports. The second item is the + major version. The minor and revision versions are default to 0s. + The device capabilities and their definition in the spec are: + gsm : gsmSupportedRelease + utran : utranSupportedRelease + cdma1x : cdma2000onexSupportedRelease + hrpd : cdma2000hrpdSupportedRelease + ehrpd : cdma2000ehrpdSupportedRelease + eutran : eutranSupportedRelease + nfc : contactlessSupportedRelease + crl : rspCrlSupportedVersion + --> + <string-array translatable="false" name="config_telephonyEuiccDeviceCapabilities"> + <!-- Example: + <item>"gsm,11"</item> + <item>"utran,11"</item> + <item>"cdma1x,1"</item> + <item>"hrpd,3"</item> + <item>"ehrpd,12"</item> + <item>"eutran,11"</item> + <item>"nfc,1"</item> + <item>"crl,1"</item> + --> + </string-array> + <!-- default telephony hardware configuration for this platform. --> <!-- this string array should be overridden by the device to present a list diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 82fefef5fef6..a5ba4c63d0fb 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2870,6 +2870,8 @@ <public name="outlineAmbientShadowColor" /> <public name="maxLongVersionCode" /> <public name="urlBarResourceId" /> + <!-- @hide @SystemApi --> + <public name="userRestriction" /> </public-group> <public-group type="style" first-id="0x010302e0"> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index e61860232abd..5c9f86396772 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -2106,6 +2106,10 @@ <string name="keyguard_accessibility_face_unlock">Face unlock.</string> <!-- Accessibility description of the pin lock. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_pin_unlock">Pin unlock.</string> + <!-- Accessibility description of the sim pin lock. [CHAR_LIMIT=none] --> + <string name="keyguard_accessibility_sim_pin_unlock">Sim Pin unlock.</string> + <!-- Accessibility description of the sim puk lock. [CHAR_LIMIT=none] --> + <string name="keyguard_accessibility_sim_puk_unlock">Sim Puk unlock.</string> <!-- Accessibility description of the password lock. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_password_unlock">Password unlock.</string> <!-- Accessibility description of the unlock pattern area. [CHAR_LIMIT=none] --> @@ -3200,9 +3204,10 @@ <string name="sim_restart_button">Restart</string> <!-- See Carrier_App_Dialog. This is the message of that dialog. --> <string name="install_carrier_app_notification_title">Activate mobile service</string> - <string name="install_carrier_app_notification_text"> - Download the carrier app to activate your new SIM - </string> + <!-- Notification message that shows when the user inserts a SIM card that requires a carrier app download, but the app name is unknown --> + <string name="install_carrier_app_notification_text">Download the carrier app to activate your new SIM</string> + <!-- Notification message that shows when the user inserts a SIM card that requires a carrier app download. App name is known --> + <string name="install_carrier_app_notification_text_app_name">Download the <xliff:g id="app_name">%1$s</xliff:g> app to activate your new SIM</string> <!-- See Carrier_App_Notification. This is the button of that dialog. --> <string name="install_carrier_app_notification_button">Download app</string> <!-- See carrier_app_notification. This is the headline. --> @@ -3768,31 +3773,23 @@ <string name="extract_edit_menu_button">Edit</string> <!-- Notification title when data usage has exceeded warning threshold. [CHAR LIMIT=50] --> - <string name="data_usage_warning_title">Data usage alert</string> + <string name="data_usage_warning_title">Data warning</string> <!-- Notification body when data usage has exceeded warning threshold. [CHAR LIMIT=32] --> - <string name="data_usage_warning_body">Tap to view usage and settings.</string> + <string name="data_usage_warning_body">You've used <xliff:g id="app" example="3.8GB">%s</xliff:g> of data</string> - <!-- Notification title when 2G-3G data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] --> - <string name="data_usage_3g_limit_title">2G-3G data limit reached</string> - <!-- Notification title when 4G data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] --> - <string name="data_usage_4g_limit_title">4G data limit reached</string> <!-- Notification title when mobile data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=50] --> <string name="data_usage_mobile_limit_title">Mobile data limit reached</string> <!-- Notification title when Wi-Fi data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] --> <string name="data_usage_wifi_limit_title">Wi-Fi data limit reached</string> <!-- Notification body when data usage has exceeded limit threshold, and has been disabled. --> - <string name="data_usage_limit_body">Data paused for rest of cycle</string> + <string name="data_usage_limit_body">Data paused for the rest of your cycle</string> - <!-- Notification title when 2G-3G data usage has exceeded limit threshold. [CHAR LIMIT=32] --> - <string name="data_usage_3g_limit_snoozed_title">2G-3G data limit exceeded</string> - <!-- Notification title when 4G data usage has exceeded limit threshold. [CHAR LIMIT=32] --> - <string name="data_usage_4g_limit_snoozed_title">4G data limit exceeded</string> <!-- Notification title when mobile data usage has exceeded limit threshold. [CHAR LIMIT=32] --> - <string name="data_usage_mobile_limit_snoozed_title">Mobile data limit exceeded</string> + <string name="data_usage_mobile_limit_snoozed_title">Over your mobile data limit</string> <!-- Notification title when Wi-Fi data usage has exceeded limit threshold. [CHAR LIMIT=32] --> - <string name="data_usage_wifi_limit_snoozed_title">Wi-Fi data limit exceeded</string> + <string name="data_usage_wifi_limit_snoozed_title">Over your Wi-Fi data limit</string> <!-- Notification body when data usage has exceeded limit threshold. --> - <string name="data_usage_limit_snoozed_body"><xliff:g id="size" example="3.8GB">%s</xliff:g> over specified limit.</string> + <string name="data_usage_limit_snoozed_body">You've gone <xliff:g id="size" example="3.8GB">%s</xliff:g> over your set limit</string> <!-- Notification title when background data usage is limited. [CHAR LIMIT=32] --> <string name="data_usage_restricted_title">Background data restricted</string> @@ -3800,9 +3797,11 @@ <string name="data_usage_restricted_body">Tap to remove restriction.</string> <!-- Notification title when there has been recent excessive data usage. [CHAR LIMIT=32] --> - <string name="data_usage_rapid_title">Large data usage</string> + <string name="data_usage_rapid_title">High mobile data usage</string> <!-- Notification body when there has been recent excessive data usage. [CHAR LIMIT=128] --> - <string name="data_usage_rapid_body">Your data usage over the last few days is larger than normal. Tap to view usage and settings.</string> + <string name="data_usage_rapid_body">Your apps have used more data than usual</string> + <!-- Notification body when there has been recent excessive data usage by a specific app. [CHAR LIMIT=128] --> + <string name="data_usage_rapid_app_body"><xliff:g id="app" example="Calculator">%s</xliff:g> has used more data than usual</string> <!-- SSL Certificate dialogs --> <!-- Title for an SSL Certificate dialog --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0493c2bec0d3..1b00c670b555 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -808,7 +808,6 @@ <java-symbol type="string" name="number_picker_increment_scroll_action" /> <java-symbol type="string" name="number_picker_increment_scroll_mode" /> <java-symbol type="string" name="old_app_action" /> - <java-symbol type="string" name="old_app_description" /> <java-symbol type="string" name="older" /> <java-symbol type="string" name="open_permission_deny" /> <java-symbol type="string" name="orgTypeCustom" /> @@ -1222,6 +1221,7 @@ <java-symbol type="array" name="config_disabledUntilUsedPreinstalledCarrierApps" /> <java-symbol type="array" name="config_callBarringMMI" /> <java-symbol type="array" name="config_globalActionsList" /> + <java-symbol type="array" name="config_telephonyEuiccDeviceCapabilities" /> <java-symbol type="array" name="config_telephonyHardware" /> <java-symbol type="array" name="config_keySystemUuidMapping" /> <java-symbol type="array" name="config_gpsParameters" /> @@ -1970,10 +1970,6 @@ <java-symbol type="string" name="config_wimaxServiceClassname" /> <java-symbol type="string" name="config_wimaxServiceJarLocation" /> <java-symbol type="string" name="config_wimaxStateTrackerClassname" /> - <java-symbol type="string" name="data_usage_3g_limit_snoozed_title" /> - <java-symbol type="string" name="data_usage_3g_limit_title" /> - <java-symbol type="string" name="data_usage_4g_limit_snoozed_title" /> - <java-symbol type="string" name="data_usage_4g_limit_title" /> <java-symbol type="string" name="data_usage_limit_body" /> <java-symbol type="string" name="data_usage_limit_snoozed_body" /> <java-symbol type="string" name="data_usage_mobile_limit_snoozed_title" /> @@ -1986,6 +1982,7 @@ <java-symbol type="string" name="data_usage_wifi_limit_title" /> <java-symbol type="string" name="data_usage_rapid_title" /> <java-symbol type="string" name="data_usage_rapid_body" /> + <java-symbol type="string" name="data_usage_rapid_app_body" /> <java-symbol type="string" name="default_wallpaper_component" /> <java-symbol type="string" name="device_storage_monitor_notification_channel" /> <java-symbol type="string" name="dlg_ok" /> @@ -2776,6 +2773,7 @@ <java-symbol type="string" name="install_carrier_app_notification_title" /> <java-symbol type="string" name="install_carrier_app_notification_text" /> + <java-symbol type="string" name="install_carrier_app_notification_text_app_name" /> <java-symbol type="string" name="install_carrier_app_notification_button" /> <java-symbol type="string" name="carrier_app_notification_title" /> <java-symbol type="string" name="carrier_app_notification_text" /> @@ -3233,6 +3231,11 @@ <java-symbol type="string" name="unsupported_compile_sdk_check_update" /> <java-symbol type="string" name="battery_saver_warning_title" /> + <java-symbol type="string" name="keyguard_accessibility_pattern_unlock" /> + <java-symbol type="string" name="keyguard_accessibility_pin_unlock" /> + <java-symbol type="string" name="keyguard_accessibility_sim_pin_unlock" /> + <java-symbol type="string" name="keyguard_accessibility_sim_puk_unlock" /> + <java-symbol type="string" name="keyguard_accessibility_password_unlock" /> <java-symbol type="string" name="global_action_logout" /> <java-symbol type="string" name="config_mainBuiltInDisplayCutout" /> diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf Binary files differnew file mode 100644 index 000000000000..47ab623b43e8 --- /dev/null +++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx new file mode 100644 index 000000000000..55402770746e --- /dev/null +++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx @@ -0,0 +1,181 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2017 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. +--> +<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0"> + + <GlyphOrder> + <GlyphID id="0" name=".notdef"/> + <GlyphID id="1" name="1em"/> + </GlyphOrder> + + <head> + <tableVersion value="1.0"/> + <fontRevision value="1.0"/> + <checkSumAdjustment value="0x640cdb2f"/> + <magicNumber value="0x5f0f3cf5"/> + <flags value="00000000 00000011"/> + <unitsPerEm value="1000"/> + <created value="Fri Mar 17 07:26:00 2017"/> + <macStyle value="00000000 00000000"/> + <lowestRecPPEM value="7"/> + <fontDirectionHint value="2"/> + <glyphDataFormat value="0"/> + </head> + + <hhea> + <tableVersion value="0x10000"/> + <ascent value="10000"/> + <descent value="-10000"/> + <lineGap value="0"/> + <caretSlopeRise value="1"/> + <caretSlopeRun value="0"/> + <caretOffset value="0"/> + <reserved0 value="0"/> + <reserved1 value="0"/> + <reserved2 value="0"/> + <reserved3 value="0"/> + <metricDataFormat value="0"/> + </hhea> + + <maxp> + <tableVersion value="0x10000"/> + <maxZones value="0"/> + <maxTwilightPoints value="0"/> + <maxStorage value="0"/> + <maxFunctionDefs value="0"/> + <maxInstructionDefs value="0"/> + <maxStackElements value="0"/> + <maxSizeOfInstructions value="0"/> + <maxComponentElements value="0"/> + </maxp> + + <OS_2> + <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex' + will be recalculated by the compiler --> + <version value="3"/> + <xAvgCharWidth value="594"/> + <usWeightClass value="400"/> + <usWidthClass value="5"/> + <fsType value="00000000 00001000"/> + <ySubscriptXSize value="650"/> + <ySubscriptYSize value="600"/> + <ySubscriptXOffset value="0"/> + <ySubscriptYOffset value="75"/> + <ySuperscriptXSize value="650"/> + <ySuperscriptYSize value="600"/> + <ySuperscriptXOffset value="0"/> + <ySuperscriptYOffset value="350"/> + <yStrikeoutSize value="50"/> + <yStrikeoutPosition value="300"/> + <sFamilyClass value="0"/> + <panose> + <bFamilyType value="0"/> + <bSerifStyle value="0"/> + <bWeight value="5"/> + <bProportion value="0"/> + <bContrast value="0"/> + <bStrokeVariation value="0"/> + <bArmStyle value="0"/> + <bLetterForm value="0"/> + <bMidline value="0"/> + <bXHeight value="0"/> + </panose> + <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/> + <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/> + <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/> + <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/> + <achVendID value="UKWN"/> + <fsSelection value="00000000 01000000"/> + <usFirstCharIndex value="32"/> + <usLastCharIndex value="122"/> + <sTypoAscender value="800"/> + <sTypoDescender value="-200"/> + <sTypoLineGap value="200"/> + <usWinAscent value="1000"/> + <usWinDescent value="200"/> + <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/> + <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/> + <sxHeight value="500"/> + <sCapHeight value="700"/> + <usDefaultChar value="0"/> + <usBreakChar value="32"/> + <usMaxContext value="0"/> + </OS_2> + + <hmtx> + <mtx name=".notdef" width="1000" lsb="0"/> + <mtx name="1em" width="1000" lsb="0"/> + </hmtx> + + <cmap> + <tableVersion version="0"/> + <cmap_format_4 platformID="3" platEncID="10" language="0"> + <map code="0x000A" name="1em" /> <!-- LINE FEED --> + <map code="0x000D" name="1em" /> <!-- CARRIAGE RETURN --> + </cmap_format_4> + </cmap> + + <loca> + <!-- The 'loca' table will be calculated by the compiler --> + </loca> + + <glyf> + <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" /> + <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" /> + </glyf> + + <name> + <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409"> + Copyright (C) 2017 The Android Open Source Project + </namerecord> + <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> + Sample Font + </namerecord> + <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> + Regular + </namerecord> + <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> + Sample Font + </namerecord> + <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409"> + SampleFont-Regular + </namerecord> + <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409"> + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + 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. + </namerecord> + <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409"> + http://www.apache.org/licenses/LICENSE-2.0 + </namerecord> + </name> + + <post> + <formatType value="3.0"/> + <italicAngle value="0.0"/> + <underlinePosition value="-75"/> + <underlineThickness value="50"/> + <isFixedPitch value="0"/> + <minMemType42 value="0"/> + <maxMemType42 value="0"/> + <minMemType1 value="0"/> + <maxMemType1 value="0"/> + </post> + +</ttFont> diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java index bc6fc15db163..58ee7a783589 100644 --- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java +++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java @@ -19,6 +19,7 @@ package android.app.backup; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags; import android.content.Context; import android.support.test.filters.LargeTest; import android.test.AndroidTestCase; @@ -43,8 +44,8 @@ public class FullBackupTest extends AndroidTestCase { private XmlPullParser mXpp; private Context mContext; - Map<String, Set<String>> includeMap; - Set<String> excludesSet; + Map<String, Set<PathWithRequiredFlags>> includeMap; + Set<PathWithRequiredFlags> excludesSet; @Override public void setUp() throws Exception { @@ -52,8 +53,8 @@ public class FullBackupTest extends AndroidTestCase { mXpp = mFactory.newPullParser(); mContext = getContext(); - includeMap = new ArrayMap(); - excludesSet = new ArraySet(); + includeMap = new ArrayMap<>(); + excludesSet = new ArraySet<>(); } public void testparseBackupSchemeFromXml_onlyInclude() throws Exception { @@ -68,11 +69,127 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size()); assertEquals("Unexpected number of <include/>s", 1, includeMap.size()); - Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); assertEquals("Invalid path parsed for <include/>", new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); + include.getPath()); + assertEquals("Invalid requireFlags parsed for <include/>", 0, include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionFlag() throws Exception { + mXpp.setInput(new StringReader( + "<full-backup-content>" + + "<include path=\"onlyInclude.txt\" domain=\"file\"" + + " requireFlags=\"clientSideEncryption\"/>" + + "</full-backup-content>")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of <include/>s", 1, includeMap.size()); + + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for <include/>", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for <include/>", + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlag() throws Exception { + mXpp.setInput(new StringReader( + "<full-backup-content>" + + "<include path=\"onlyInclude.txt\" domain=\"file\"" + + " requireFlags=\"deviceToDeviceTransfer\"/>" + + "</full-backup-content>")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of <include/>s", 1, includeMap.size()); + + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for <include/>", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for <include/>", + BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionAndD2DFlags() + throws Exception { + mXpp.setInput(new StringReader( + "<full-backup-content>" + + "<include path=\"onlyInclude.txt\" domain=\"file\"" + + " requireFlags=\"clientSideEncryption|deviceToDeviceTransfer\"/>" + + "</full-backup-content>")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of <include/>s", 1, includeMap.size()); + + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for <include/>", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for <include/>", + BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED + | BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlagAndIngoreGarbage() + throws Exception { + mXpp.setInput(new StringReader( + "<full-backup-content>" + + "<include path=\"onlyInclude.txt\" domain=\"file\"" + + " requireFlags=\"deviceToDeviceTransfer|garbageFlag\"/>" + + "</full-backup-content>")); + + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + + assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size()); + assertEquals("Unexpected number of <include/>s", 1, includeMap.size()); + + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); + PathWithRequiredFlags include = fileDomainIncludes.iterator().next(); + assertEquals("Invalid path parsed for <include/>", + new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(), + include.getPath()); + assertEquals("Invalid requireFlags parsed for <include/>", + BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER, + include.getRequiredFlags()); + } + + public void testparseBackupSchemeFromXml_onlyExcludeRequireFlagsNotSupported() + throws Exception { + mXpp.setInput(new StringReader( + "<full-backup-content>" + + "<exclude path=\"onlyExclude.txt\" domain=\"file\"" + + " requireFlags=\"deviceToDeviceTransfer\"/>" + + "</full-backup-content>")); + + try { + FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); + bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); + fail("Having more than 3 attributes in exclude should throw an XmlPullParserException"); + } catch (XmlPullParserException expected) {} } public void testparseBackupSchemeFromXml_onlyExclude() throws Exception { @@ -88,7 +205,7 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Unexpected number of <exclude/>s", 1, excludesSet.size()); assertEquals("Invalid path parsed for <exclude/>", new File(mContext.getFilesDir(), "onlyExclude.txt").getCanonicalPath(), - excludesSet.iterator().next()); + excludesSet.iterator().next().getPath()); } public void testparseBackupSchemeFromXml_includeAndExclude() throws Exception { @@ -101,16 +218,16 @@ public class FullBackupTest extends AndroidTestCase { FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); - Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); assertEquals("Invalid path parsed for <include/>", new File(mContext.getFilesDir(), "include.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); + fileDomainIncludes.iterator().next().getPath()); assertEquals("Unexpected number of <exclude/>s", 1, excludesSet.size()); assertEquals("Invalid path parsed for <exclude/>", new File(mContext.getFilesDir(), "exclude.txt").getCanonicalPath(), - excludesSet.iterator().next()); + excludesSet.iterator().next().getPath()); } public void testparseBackupSchemeFromXml_lotsOfIncludesAndExcludes() throws Exception { @@ -126,61 +243,74 @@ public class FullBackupTest extends AndroidTestCase { "<include path=\"include4.xml\" domain=\"sharedpref\"/>" + "</full-backup-content>")); - FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext); bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap); - Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size()); assertEquals("Invalid path parsed for <include/>", new File(mContext.getFilesDir(), "include1.txt").getCanonicalPath(), - fileDomainIncludes.iterator().next()); - - Set<String> databaseDomainIncludes = includeMap.get(FullBackup.DATABASE_TREE_TOKEN); + fileDomainIncludes.iterator().next().getPath()); + + Set<PathWithRequiredFlags> databaseDomainIncludes = + includeMap.get(FullBackup.DATABASE_TREE_TOKEN); + Set<String> databaseDomainIncludesPaths = new ArraySet<>(); + for (PathWithRequiredFlags databaseInclude : databaseDomainIncludes) { + databaseDomainIncludesPaths.add(databaseInclude.getPath()); + } // Three expected here because of "-journal" and "-wal" files assertEquals("Didn't find expected database domain include.", 3, databaseDomainIncludes.size()); assertTrue("Invalid path parsed for <include/>", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File(mContext.getDatabasePath("foo").getParentFile(), "include2.txt") .getCanonicalPath())); assertTrue("Invalid path parsed for <include/>", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File( mContext.getDatabasePath("foo").getParentFile(), "include2.txt-journal") .getCanonicalPath())); assertTrue("Invalid path parsed for <include/>", - databaseDomainIncludes.contains( + databaseDomainIncludesPaths.contains( new File( mContext.getDatabasePath("foo").getParentFile(), "include2.txt-wal") .getCanonicalPath())); - List<String> sharedPrefDomainIncludes = new ArrayList<String>( + List<PathWithRequiredFlags> sharedPrefDomainIncludes = new ArrayList<PathWithRequiredFlags>( includeMap.get(FullBackup.SHAREDPREFS_TREE_TOKEN)); - Collections.sort(sharedPrefDomainIncludes); + ArrayList<String> sharedPrefDomainIncludesPaths = new ArrayList<>(); + for (PathWithRequiredFlags sharedPrefInclude : sharedPrefDomainIncludes) { + sharedPrefDomainIncludesPaths.add(sharedPrefInclude.getPath()); + } + // Sets are annoying to iterate over b/c order isn't enforced - convert to an array and + // sort lexicographically. + Collections.sort(sharedPrefDomainIncludesPaths); assertEquals("Didn't find expected sharedpref domain include.", 3, sharedPrefDomainIncludes.size()); assertEquals("Invalid path parsed for <include/>", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3") .getCanonicalPath(), - sharedPrefDomainIncludes.get(0)); + sharedPrefDomainIncludesPaths.get(0)); assertEquals("Invalid path parsed for <include/>", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3.xml") .getCanonicalPath(), - sharedPrefDomainIncludes.get(1)); + sharedPrefDomainIncludesPaths.get(1)); assertEquals("Invalid path parsed for <include/>", new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include4.xml") .getCanonicalPath(), - sharedPrefDomainIncludes.get(2)); + sharedPrefDomainIncludesPaths.get(2)); assertEquals("Unexpected number of <exclude/>s", 7, excludesSet.size()); // Sets are annoying to iterate over b/c order isn't enforced - convert to an array and // sort lexicographically. - List<String> arrayedSet = new ArrayList<String>(excludesSet); + ArrayList<String> arrayedSet = new ArrayList<>(); + for (PathWithRequiredFlags exclude : excludesSet) { + arrayedSet.add(exclude.getPath()); + } Collections.sort(arrayedSet); assertEquals("Invalid path parsed for <exclude/>", @@ -260,9 +390,10 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size()); - Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } + public void testDoubleDotInPath_isIgnored() throws Exception { mXpp.setInput(new StringReader( "<full-backup-content>" + @@ -274,7 +405,7 @@ public class FullBackupTest extends AndroidTestCase { assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size()); - Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); + Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN); assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes); } diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 38e20a18ea89..f4d4c444da9b 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -155,6 +155,7 @@ public class SettingsBackupTest { Settings.Global.CAPTIVE_PORTAL_USER_AGENT, Settings.Global.CAR_DOCK_SOUND, Settings.Global.CARRIER_APP_WHITELIST, + Settings.Global.CARRIER_APP_NAMES, Settings.Global.CAR_UNDOCK_SOUND, Settings.Global.CDMA_CELL_BROADCAST_SMS, Settings.Global.CDMA_ROAMING_MODE, @@ -305,6 +306,7 @@ public class SettingsBackupTest { Settings.Global.NETWORK_SWITCH_NOTIFICATION_RATE_LIMIT_MILLIS, Settings.Global.NETWORK_WATCHLIST_ENABLED, Settings.Global.NEW_CONTACT_AGGREGATOR, + Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE, Settings.Global.NITZ_UPDATE_DIFF, Settings.Global.NITZ_UPDATE_SPACING, Settings.Global.NOTIFICATION_SNOOZE_OPTIONS, @@ -376,6 +378,7 @@ public class SettingsBackupTest { Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES, Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE, Settings.Global.SYS_VDSO, + Settings.Global.SYS_UIDCPUPOWER, Settings.Global.FPS_DEVISOR, Settings.Global.TCP_DEFAULT_INIT_RWND, Settings.Global.TETHER_DUN_APN, @@ -521,6 +524,7 @@ public class SettingsBackupTest { Settings.Secure.NFC_PAYMENT_FOREGROUND, Settings.Secure.NIGHT_DISPLAY_ACTIVATED, Settings.Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME, + Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED, Settings.Secure.PACKAGE_VERIFIER_STATE, Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT, Settings.Secure.PARENTAL_CONTROL_LAST_UPDATE, diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java new file mode 100644 index 000000000000..0c9c4c17171c --- /dev/null +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java @@ -0,0 +1,110 @@ +/* + * 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.security.keystore.recovery; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class KeyChainProtectionParamsTest { + + private static final byte[] SALT = new byte[] { 0, 1, 2, 3, 4, 5 }; + private static final byte[] SECRET = new byte[] { 5, 4, 3, 2, 1, 0 }; + private static final int USER_SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN; + private static final int LOCK_SCREEN_UI_FORMAT = KeyChainProtectionParams.UI_FORMAT_PATTERN; + + @Test + public void build_setsSecret() { + assertArrayEquals(SECRET, createTestParams().getSecret()); + } + + @Test + public void build_setsLockScreenUiFormat() { + assertEquals(LOCK_SCREEN_UI_FORMAT, createTestParams().getLockScreenUiFormat()); + } + + @Test + public void build_setsUserSecretType() { + assertEquals(USER_SECRET_TYPE, createTestParams().getUserSecretType()); + } + + @Test + public void build_setsKeyDerivationParams() { + KeyChainProtectionParams protParams = createTestParams(); + KeyDerivationParams keyDerivationParams = protParams.getKeyDerivationParams(); + + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + @Test + public void writeToParcel_writesSecret() { + KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams()); + + assertArrayEquals(SECRET, protParams.getSecret()); + } + + @Test + public void writeToParcel_writesUserSecretType() { + KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams()); + + assertEquals(USER_SECRET_TYPE, protParams.getUserSecretType()); + } + + @Test + public void writeToParcel_writesLockScreenUiFormat() { + KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams()); + + assertEquals(LOCK_SCREEN_UI_FORMAT, protParams.getLockScreenUiFormat()); + } + + @Test + public void writeToParcel_writesKeyDerivationParams() { + KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams()); + KeyDerivationParams keyDerivationParams = protParams.getKeyDerivationParams(); + + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + private KeyChainProtectionParams writeToThenReadFromParcel(KeyChainProtectionParams params) { + Parcel parcel = Parcel.obtain(); + params.writeToParcel(parcel, /*flags=*/ 0); + parcel.setDataPosition(0); + KeyChainProtectionParams fromParcel = + KeyChainProtectionParams.CREATOR.createFromParcel(parcel); + parcel.recycle(); + return fromParcel; + } + + private KeyChainProtectionParams createTestParams() { + return new KeyChainProtectionParams.Builder() + .setKeyDerivationParams(KeyDerivationParams.createSha256Params(SALT)) + .setSecret(SECRET) + .setUserSecretType(USER_SECRET_TYPE) + .setLockScreenUiFormat(LOCK_SCREEN_UI_FORMAT) + .build(); + } +} diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java new file mode 100644 index 000000000000..8d6fbd563d6c --- /dev/null +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java @@ -0,0 +1,195 @@ +/* + * 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.security.keystore.recovery; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import com.google.common.collect.Lists; + +import org.junit.Test; +import org.junit.runner.RunWith; + +// TODO(b/73862682): Add tests for RecoveryCertPath +@RunWith(AndroidJUnit4.class) +@SmallTest +public class KeyChainSnapshotTest { + + private static final int COUNTER_ID = 42; + private static final int SNAPSHOT_VERSION = 13; + private static final byte[] SALT = new byte[] { 0, 1, 0, 1 }; + private static final byte[] SERVER_PARAMS = new byte[] { 6, 7, 9, 2 }; + private static final byte[] RECOVERY_KEY_BLOB = new byte[] { 9, 1, 4, 6, 7 }; + private static final int MAX_ATTEMPTS = 10; + private static final int LOCK_SCREEN_UI_FORMAT = KeyChainProtectionParams.UI_FORMAT_PASSWORD; + private static final int USER_SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN; + private static final String KEY_ALIAS = "steph"; + private static final byte[] KEY_MATERIAL = new byte[] { 3, 5, 7, 9, 1 }; + + @Test + public void build_setsCounterId() { + assertEquals(COUNTER_ID, createKeyChainSnapshot().getCounterId()); + } + + @Test + public void build_setsSnapshotVersion() { + assertEquals(SNAPSHOT_VERSION, createKeyChainSnapshot().getSnapshotVersion()); + } + + @Test + public void build_setsMaxAttempts() { + assertEquals(MAX_ATTEMPTS, createKeyChainSnapshot().getMaxAttempts()); + } + + @Test + public void build_setsServerParams() { + assertArrayEquals(SERVER_PARAMS, createKeyChainSnapshot().getServerParams()); + } + + @Test + public void build_setsRecoveryKeyBlob() { + assertArrayEquals(RECOVERY_KEY_BLOB, + createKeyChainSnapshot().getEncryptedRecoveryKeyBlob()); + } + + @Test + public void build_setsKeyChainProtectionParams() { + KeyChainSnapshot snapshot = createKeyChainSnapshot(); + + assertEquals(1, snapshot.getKeyChainProtectionParams().size()); + KeyChainProtectionParams keyChainProtectionParams = + snapshot.getKeyChainProtectionParams().get(0); + assertEquals(USER_SECRET_TYPE, keyChainProtectionParams.getUserSecretType()); + assertEquals(LOCK_SCREEN_UI_FORMAT, keyChainProtectionParams.getLockScreenUiFormat()); + KeyDerivationParams keyDerivationParams = keyChainProtectionParams.getKeyDerivationParams(); + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + @Test + public void build_setsWrappedApplicationKeys() { + KeyChainSnapshot snapshot = createKeyChainSnapshot(); + + assertEquals(1, snapshot.getWrappedApplicationKeys().size()); + WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0); + assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias()); + assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial()); + } + + @Test + public void writeToParcel_writesCounterId() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertEquals(COUNTER_ID, snapshot.getCounterId()); + } + + @Test + public void writeToParcel_writesSnapshotVersion() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertEquals(SNAPSHOT_VERSION, snapshot.getSnapshotVersion()); + } + + @Test + public void writeToParcel_writesMaxAttempts() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertEquals(MAX_ATTEMPTS, snapshot.getMaxAttempts()); + } + + @Test + public void writeToParcel_writesServerParams() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertArrayEquals(SERVER_PARAMS, snapshot.getServerParams()); + } + + @Test + public void writeToParcel_writesKeyRecoveryBlob() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertArrayEquals(RECOVERY_KEY_BLOB, snapshot.getEncryptedRecoveryKeyBlob()); + } + + @Test + public void writeToParcel_writesKeyChainProtectionParams() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertEquals(1, snapshot.getKeyChainProtectionParams().size()); + KeyChainProtectionParams keyChainProtectionParams = + snapshot.getKeyChainProtectionParams().get(0); + assertEquals(USER_SECRET_TYPE, keyChainProtectionParams.getUserSecretType()); + assertEquals(LOCK_SCREEN_UI_FORMAT, keyChainProtectionParams.getLockScreenUiFormat()); + KeyDerivationParams keyDerivationParams = keyChainProtectionParams.getKeyDerivationParams(); + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + @Test + public void writeToParcel_writesWrappedApplicationKeys() { + KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot()); + + assertEquals(1, snapshot.getWrappedApplicationKeys().size()); + WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0); + assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias()); + assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial()); + } + + private static KeyChainSnapshot createKeyChainSnapshot() { + return new KeyChainSnapshot.Builder() + .setCounterId(COUNTER_ID) + .setSnapshotVersion(SNAPSHOT_VERSION) + .setServerParams(SERVER_PARAMS) + .setMaxAttempts(MAX_ATTEMPTS) + .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_BLOB) + .setKeyChainProtectionParams(Lists.newArrayList(createKeyChainProtectionParams())) + .setWrappedApplicationKeys(Lists.newArrayList(createWrappedApplicationKey())) + .build(); + } + + private static KeyChainProtectionParams createKeyChainProtectionParams() { + return new KeyChainProtectionParams.Builder() + .setKeyDerivationParams(createKeyDerivationParams()) + .setUserSecretType(USER_SECRET_TYPE) + .setLockScreenUiFormat(LOCK_SCREEN_UI_FORMAT) + .build(); + } + + private static KeyDerivationParams createKeyDerivationParams() { + return KeyDerivationParams.createSha256Params(SALT); + } + + private static WrappedApplicationKey createWrappedApplicationKey() { + return new WrappedApplicationKey.Builder() + .setAlias(KEY_ALIAS) + .setEncryptedKeyMaterial(KEY_MATERIAL) + .build(); + } + + private static KeyChainSnapshot writeToThenReadFromParcel(KeyChainSnapshot params) { + Parcel parcel = Parcel.obtain(); + params.writeToParcel(parcel, /*flags=*/ 0); + parcel.setDataPosition(0); + KeyChainSnapshot fromParcel = KeyChainSnapshot.CREATOR.createFromParcel(parcel); + parcel.recycle(); + return fromParcel; + } +} diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java new file mode 100644 index 000000000000..b6af9bbd772a --- /dev/null +++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java @@ -0,0 +1,74 @@ +/* + * 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.security.keystore.recovery; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class KeyDerivationParamsTest { + + private static final byte[] SALT = new byte[] { 0, 1, 2, 3 }; + + @Test + public void createSha256Params_setsAlgorithm() { + KeyDerivationParams keyDerivationParams = KeyDerivationParams.createSha256Params(SALT); + + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + } + + @Test + public void createSha256Params_setsSalt() { + KeyDerivationParams keyDerivationParams = KeyDerivationParams.createSha256Params(SALT); + + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + @Test + public void writeToParcel_writesAlgorithm() { + KeyDerivationParams keyDerivationParams = + writeToThenReadFromParcel(KeyDerivationParams.createSha256Params(SALT)); + + assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm()); + } + + @Test + public void writeToParcel_writesSalt() { + KeyDerivationParams keyDerivationParams = + writeToThenReadFromParcel(KeyDerivationParams.createSha256Params(SALT)); + + assertArrayEquals(SALT, keyDerivationParams.getSalt()); + } + + private KeyDerivationParams writeToThenReadFromParcel(KeyDerivationParams params) { + Parcel parcel = Parcel.obtain(); + params.writeToParcel(parcel, /*flags=*/ 0); + parcel.setDataPosition(0); + KeyDerivationParams fromParcel = + KeyDerivationParams.CREATOR.createFromParcel(parcel); + parcel.recycle(); + return fromParcel; + } +} diff --git a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java new file mode 100644 index 000000000000..15afbddf6f02 --- /dev/null +++ b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017 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.security.keystore.recovery; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class WrappedApplicationKeyTest { + + private static final String ALIAS = "karlin"; + private static final byte[] KEY_MATERIAL = new byte[] { 0, 1, 2, 3, 4 }; + + private Parcel mParcel; + + @Before + public void setUp() { + mParcel = Parcel.obtain(); + } + + @After + public void tearDown() { + mParcel.recycle(); + } + + @Test + public void build_setsAlias() { + assertEquals(ALIAS, buildTestKey().getAlias()); + } + + @Test + public void build_setsEncryptedKeyMaterial() { + assertArrayEquals(KEY_MATERIAL, buildTestKey().getEncryptedKeyMaterial()); + } + + @Test + public void writeToParcel_writesAliasToParcel() { + buildTestKey().writeToParcel(mParcel, /*flags=*/ 0); + + mParcel.setDataPosition(0); + WrappedApplicationKey readFromParcel = + WrappedApplicationKey.CREATOR.createFromParcel(mParcel); + assertEquals(ALIAS, readFromParcel.getAlias()); + } + + @Test + public void writeToParcel_writesKeyMaterial() { + buildTestKey().writeToParcel(mParcel, /*flags=*/ 0); + + mParcel.setDataPosition(0); + WrappedApplicationKey readFromParcel = + WrappedApplicationKey.CREATOR.createFromParcel(mParcel); + assertArrayEquals(KEY_MATERIAL, readFromParcel.getEncryptedKeyMaterial()); + } + + private WrappedApplicationKey buildTestKey() { + return new WrappedApplicationKey.Builder() + .setAlias(ALIAS) + .setEncryptedKeyMaterial(KEY_MATERIAL) + .build(); + } +} diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java index d817278330d4..25217125bbf4 100644 --- a/core/tests/coretests/src/android/text/StaticLayoutTest.java +++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java @@ -822,6 +822,9 @@ public class StaticLayoutTest { + " <family>" + " <font weight='400' style='normal'>ascent3em-descent4em.ttf</font>" + " </family>" + + " <family>" + + " <font weight='400' style='normal'>ascent10em-descent10em.ttf</font>" + + " </family>" + "</familyset>"; try (FontFallbackSetup setup = @@ -833,7 +836,7 @@ public class StaticLayoutTest { assertEquals(2 * textSize, paint.descent(), 0.0f); final int paraWidth = 5 * textSize; - final String text = "aaaaa aabaa aaaaa"; // This should result in three lines. + final String text = "aaaaa\naabaa\naaaaa\n"; // This should result in three lines. // Old line spacing. All lines should get their ascent and descents from the first font. StaticLayout layout = StaticLayout.Builder @@ -841,13 +844,17 @@ public class StaticLayoutTest { .setIncludePad(false) .setUseLineSpacingFromFallbacks(false) .build(); - assertEquals(3, layout.getLineCount()); + assertEquals(4, layout.getLineCount()); assertEquals(-textSize, layout.getLineAscent(0)); assertEquals(2 * textSize, layout.getLineDescent(0)); assertEquals(-textSize, layout.getLineAscent(1)); assertEquals(2 * textSize, layout.getLineDescent(1)); assertEquals(-textSize, layout.getLineAscent(2)); assertEquals(2 * textSize, layout.getLineDescent(2)); + // The last empty line spacing should be the default line spacing. + // Maybe good to be a previous line spacing? + assertEquals(-textSize, layout.getLineAscent(3)); + assertEquals(2 * textSize, layout.getLineDescent(3)); // New line spacing. The second line has a 'b', so it needs more ascent and descent. layout = StaticLayout.Builder @@ -855,26 +862,52 @@ public class StaticLayoutTest { .setIncludePad(false) .setUseLineSpacingFromFallbacks(true) .build(); - assertEquals(3, layout.getLineCount()); + assertEquals(4, layout.getLineCount()); assertEquals(-textSize, layout.getLineAscent(0)); assertEquals(2 * textSize, layout.getLineDescent(0)); assertEquals(-3 * textSize, layout.getLineAscent(1)); assertEquals(4 * textSize, layout.getLineDescent(1)); assertEquals(-textSize, layout.getLineAscent(2)); assertEquals(2 * textSize, layout.getLineDescent(2)); + assertEquals(-textSize, layout.getLineAscent(3)); + assertEquals(2 * textSize, layout.getLineDescent(3)); // The default is the old line spacing, for backward compatibility. layout = StaticLayout.Builder .obtain(text, 0, text.length(), paint, paraWidth) .setIncludePad(false) .build(); - assertEquals(3, layout.getLineCount()); + assertEquals(4, layout.getLineCount()); assertEquals(-textSize, layout.getLineAscent(0)); assertEquals(2 * textSize, layout.getLineDescent(0)); assertEquals(-textSize, layout.getLineAscent(1)); assertEquals(2 * textSize, layout.getLineDescent(1)); assertEquals(-textSize, layout.getLineAscent(2)); assertEquals(2 * textSize, layout.getLineDescent(2)); + assertEquals(-textSize, layout.getLineAscent(3)); + assertEquals(2 * textSize, layout.getLineDescent(3)); + + layout = StaticLayout.Builder + .obtain("\n", 0, 1, paint, textSize) + .setIncludePad(false) + .setUseLineSpacingFromFallbacks(false) + .build(); + assertEquals(2, layout.getLineCount()); + assertEquals(-textSize, layout.getLineAscent(0)); + assertEquals(2 * textSize, layout.getLineDescent(0)); + assertEquals(-textSize, layout.getLineAscent(1)); + assertEquals(2 * textSize, layout.getLineDescent(1)); + + layout = StaticLayout.Builder + .obtain("\n", 0, 1, paint, textSize) + .setIncludePad(false) + .setUseLineSpacingFromFallbacks(true) + .build(); + assertEquals(2, layout.getLineCount()); + assertEquals(-textSize, layout.getLineAscent(0)); + assertEquals(2 * textSize, layout.getLineDescent(0)); + assertEquals(-textSize, layout.getLineAscent(1)); + assertEquals(2 * textSize, layout.getLineDescent(1)); } } diff --git a/core/tests/coretests/src/android/view/DisplayCutoutTest.java b/core/tests/coretests/src/android/view/DisplayCutoutTest.java index ee4bc34d0876..d80735326568 100644 --- a/core/tests/coretests/src/android/view/DisplayCutoutTest.java +++ b/core/tests/coretests/src/android/view/DisplayCutoutTest.java @@ -18,10 +18,14 @@ package android.view; import static android.view.DisplayCutout.NO_CUTOUT; import static android.view.DisplayCutout.fromBoundingRect; +import static android.view.DisplayCutout.fromSpec; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.sameInstance; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import android.graphics.Rect; @@ -271,6 +275,30 @@ public class DisplayCutoutTest { } @Test + public void fromSpec_caches() { + DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 1f); + assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), sameInstance(cached)); + } + + @Test + public void fromSpec_wontCacheIfSpecChanges() { + DisplayCutout cached = fromSpec("L1,0 L1000,1000 L0,1 z", 200, 1f); + assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached))); + } + + @Test + public void fromSpec_wontCacheIfScreenWidthChanges() { + DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 2000, 1f); + assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached))); + } + + @Test + public void fromSpec_wontCacheIfDensityChanges() { + DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 2f); + assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached))); + } + + @Test public void parcel_unparcel_nocutout() { Parcel p = Parcel.obtain(); diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java index b135025f6d21..ba9b963796f9 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityNodeInfoTest.java @@ -38,10 +38,10 @@ public class AccessibilityNodeInfoTest { public void testStandardActions_serializationFlagIsValid() { AccessibilityAction brokenStandardAction = CollectionUtils.find( new ArrayList<>(AccessibilityAction.sStandardActions), - action -> Integer.bitCount(action.mSerializationFlag) != 1); + action -> Long.bitCount(action.mSerializationFlag) != 1); if (brokenStandardAction != null) { String message = "Invalid serialization flag(0x" - + Integer.toHexString(brokenStandardAction.mSerializationFlag) + + Long.toHexString(brokenStandardAction.mSerializationFlag) + ") in " + brokenStandardAction; if (brokenStandardAction.mSerializationFlag == 0L) { message += "\nThis is likely due to an overflow"; @@ -56,7 +56,7 @@ public class AccessibilityNodeInfoTest { && action.getId() != action.mSerializationFlag); if (brokenStandardAction != null) { fail("Serialization flag(0x" - + Integer.toHexString(brokenStandardAction.mSerializationFlag) + + Long.toHexString(brokenStandardAction.mSerializationFlag) + ") is different from legacy action id(0x" + Integer.toHexString(brokenStandardAction.getId()) + ") in " + brokenStandardAction); diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java new file mode 100644 index 000000000000..984eede55684 --- /dev/null +++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2017 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 static org.junit.Assert.assertEquals; + +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class TextClassifierConstantsTest { + + @Test + public void testEntityListParsing() { + final TextClassifierConstants constants = TextClassifierConstants.loadFromString( + "entity_list_default=phone," + + "entity_list_not_editable=address:flight," + + "entity_list_editable=date:datetime"); + assertEquals(1, constants.getEntityListDefault().size()); + assertEquals("phone", constants.getEntityListDefault().get(0)); + assertEquals(2, constants.getEntityListNotEditable().size()); + assertEquals("address", constants.getEntityListNotEditable().get(0)); + assertEquals("flight", constants.getEntityListNotEditable().get(1)); + assertEquals(2, constants.getEntityListEditable().size()); + assertEquals("date", constants.getEntityListEditable().get(0)); + assertEquals("datetime", constants.getEntityListEditable().get(1)); + } +} diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java new file mode 100644 index 000000000000..b920ca30d6a1 --- /dev/null +++ b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2017 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.logging; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.mock; + +import android.metrics.LogMaker; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.util.ArrayMap; +import android.view.textclassifier.TextClassifier; +import android.view.textclassifier.TextLinks; + +import com.android.internal.logging.MetricsLogger; +import com.android.internal.logging.nano.MetricsProto.MetricsEvent; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class GenerateLinksLoggerTest { + + private static final String PACKAGE_NAME = "packageName"; + private static final String ZERO = "0"; + private static final int LATENCY_MS = 123; + + @Test + public void testLogGenerateLinks() { + final String phoneText = "+12122537077"; + final String addressText = "1600 Amphitheater Parkway, Mountain View, CA"; + final String testText = "The number is " + phoneText + ", the address is " + addressText; + final int phoneOffset = testText.indexOf(phoneText); + final int addressOffset = testText.indexOf(addressText); + + final Map<String, Float> phoneEntityScores = new ArrayMap<>(); + phoneEntityScores.put(TextClassifier.TYPE_PHONE, 0.9f); + phoneEntityScores.put(TextClassifier.TYPE_OTHER, 0.1f); + final Map<String, Float> addressEntityScores = new ArrayMap<>(); + addressEntityScores.put(TextClassifier.TYPE_ADDRESS, 1f); + + TextLinks links = new TextLinks.Builder(testText) + .addLink(phoneOffset, phoneOffset + phoneText.length(), phoneEntityScores) + .addLink(addressOffset, addressOffset + addressText.length(), addressEntityScores) + .build(); + + // Set up mock. + MetricsLogger metricsLogger = mock(MetricsLogger.class); + ArgumentCaptor<LogMaker> logMakerCapture = ArgumentCaptor.forClass(LogMaker.class); + doNothing().when(metricsLogger).write(logMakerCapture.capture()); + + // Generate the log. + GenerateLinksLogger logger = new GenerateLinksLogger(1 /* sampleRate */, metricsLogger); + logger.logGenerateLinks(testText, links, PACKAGE_NAME, LATENCY_MS); + + // Validate. + List<LogMaker> logs = logMakerCapture.getAllValues(); + assertEquals(3, logs.size()); + assertHasLog(logs, "" /* entityType */, 2, phoneText.length() + addressText.length(), + testText.length()); + assertHasLog(logs, TextClassifier.TYPE_ADDRESS, 1, addressText.length(), + testText.length()); + assertHasLog(logs, TextClassifier.TYPE_PHONE, 1, phoneText.length(), + testText.length()); + } + + private void assertHasLog(List<LogMaker> logs, String entityType, int numLinks, + int linkTextLength, int textLength) { + for (LogMaker log : logs) { + if (!entityType.equals(getEntityType(log))) { + continue; + } + assertEquals(PACKAGE_NAME, log.getPackageName()); + assertNotNull(Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID))); + assertEquals(numLinks, getIntValue(log, MetricsEvent.FIELD_LINKIFY_NUM_LINKS)); + assertEquals(linkTextLength, getIntValue(log, MetricsEvent.FIELD_LINKIFY_LINK_LENGTH)); + assertEquals(textLength, getIntValue(log, MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH)); + assertEquals(LATENCY_MS, getIntValue(log, MetricsEvent.FIELD_LINKIFY_LATENCY)); + return; + } + fail("No log for entity type \"" + entityType + "\""); + } + + private static String getEntityType(LogMaker log) { + return Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE), ""); + } + + private static int getIntValue(LogMaker log, int eventField) { + return Integer.parseInt(Objects.toString(log.getTaggedData(eventField), ZERO)); + } +} diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java index 449e3743e3aa..a15d33711252 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java @@ -398,6 +398,17 @@ public class AccessibilityShortcutControllerTest { } @Test + public void testOnAccessibilityShortcut_forServiceWithNoSummary_doesNotCrash() + throws Exception { + configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN); + configureValidShortcutService(); + when(mServiceInfo.loadSummary(any())).thenReturn(null); + Settings.Secure.putInt(mContentResolver, ACCESSIBILITY_SHORTCUT_DIALOG_SHOWN, 1); + getController().performAccessibilityShortcut(); + verify(mAccessibilityManagerService).performAccessibilityShortcut(); + } + + @Test public void testOnAccessibilityShortcut_forFrameworkFeature_callsServiceWithNoToast() throws Exception { configureShortcutEnabled(ENABLED_EXCEPT_LOCK_SCREEN); diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk index bd6d73dddcab..d26425b08874 100644 --- a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk +++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk @@ -56,7 +56,7 @@ LOCAL_CERTIFICATE := platform LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v1 LOCAL_AAPT_FLAGS += --version-code 1 --version-name v1 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v1/res -LOCAL_MANIFEST_FILE := app/AndroidManifest.xml +LOCAL_MANIFEST_FILE := app/v1/AndroidManifest.xml include $(BUILD_PACKAGE) include $(CLEAR_VARS) @@ -67,7 +67,7 @@ LOCAL_CERTIFICATE := platform LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v2 LOCAL_AAPT_FLAGS += --version-code 2 --version-name v2 LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v2/res -LOCAL_MANIFEST_FILE := app/AndroidManifest.xml +LOCAL_MANIFEST_FILE := app/v2/AndroidManifest.xml include $(BUILD_PACKAGE) my_package_prefix := diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/AndroidManifest.xml b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v1/AndroidManifest.xml index 73804ebd211f..73804ebd211f 100644 --- a/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/AndroidManifest.xml +++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v1/AndroidManifest.xml diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml new file mode 100644 index 000000000000..9ec7d06ce5d7 --- /dev/null +++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml @@ -0,0 +1,21 @@ +<?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.server.om.hosttest.app_overlay"> + <overlay android:targetPackage="com.android.server.om.hosttest.update_overlay_test" + android:category="android.theme" /> +</manifest> diff --git a/data/etc/hiddenapi-package-whitelist.xml b/data/etc/hiddenapi-package-whitelist.xml index 54d8a2331663..1d46d42a9750 100644 --- a/data/etc/hiddenapi-package-whitelist.xml +++ b/data/etc/hiddenapi-package-whitelist.xml @@ -21,6 +21,81 @@ which apps should be allowed to access the entire private API. --> <config> + <hidden-api-whitelisted-app package="android.car.cluster.loggingrenderer" /> + <hidden-api-whitelisted-app package="android.car.input.service" /> + <hidden-api-whitelisted-app package="android.car.usb.handler" /> + <hidden-api-whitelisted-app package="android.ext.services" /> + <hidden-api-whitelisted-app package="android.ext.shared" /> + <hidden-api-whitelisted-app package="com.android.backupconfirm" /> + <hidden-api-whitelisted-app package="com.android.bluetooth" /> + <hidden-api-whitelisted-app package="com.android.bluetoothdebug" /> + <hidden-api-whitelisted-app package="com.android.bluetoothmidiservice" /> + <hidden-api-whitelisted-app package="com.android.calllogbackup" /> + <hidden-api-whitelisted-app package="com.android.captiveportallogin" /> + <hidden-api-whitelisted-app package="com.android.car" /> + <hidden-api-whitelisted-app package="com.android.car.hvac" /> + <hidden-api-whitelisted-app package="com.android.car.mapsplaceholder" /> + <hidden-api-whitelisted-app package="com.android.car.media" /> + <hidden-api-whitelisted-app package="com.android.car.media.localmediaplayer" /> + <hidden-api-whitelisted-app package="com.android.car.radio" /> + <hidden-api-whitelisted-app package="com.android.car.settings" /> + <hidden-api-whitelisted-app package="com.android.car.systemupdater" /> + <hidden-api-whitelisted-app package="com.android.car.trust" /> + <hidden-api-whitelisted-app package="com.android.carrierconfig" /> + <hidden-api-whitelisted-app package="com.android.carrierdefaultapp" /> + <hidden-api-whitelisted-app package="com.android.cellbroadcastreceiver" /> + <hidden-api-whitelisted-app package="com.android.certinstaller" /> + <hidden-api-whitelisted-app package="com.android.customlocale2" /> + <hidden-api-whitelisted-app package="com.android.defcontainer" /> + <hidden-api-whitelisted-app package="com.android.documentsui" /> + <hidden-api-whitelisted-app package="com.android.egg" /> + <hidden-api-whitelisted-app package="com.android.email.policy" /> + <hidden-api-whitelisted-app package="com.android.emergency" /> + <hidden-api-whitelisted-app package="com.android.externalstorage" /> + <hidden-api-whitelisted-app package="com.android.fakeoemfeatures" /> + <hidden-api-whitelisted-app package="com.android.gallery" /> + <hidden-api-whitelisted-app package="com.android.hotspot2" /> + <hidden-api-whitelisted-app package="com.android.inputdevices" /> + <hidden-api-whitelisted-app package="com.android.keychain" /> + <hidden-api-whitelisted-app package="com.android.location.fused" /> + <hidden-api-whitelisted-app package="com.android.managedprovisioning" /> + <hidden-api-whitelisted-app package="com.android.mms.service" /> + <hidden-api-whitelisted-app package="com.android.mtp" /> + <hidden-api-whitelisted-app package="com.android.nfc" /> + <hidden-api-whitelisted-app package="com.android.osu" /> + <hidden-api-whitelisted-app package="com.android.packageinstaller" /> + <hidden-api-whitelisted-app package="com.android.pacprocessor" /> + <hidden-api-whitelisted-app package="com.android.phone" /> + <hidden-api-whitelisted-app package="com.android.pmc" /> + <hidden-api-whitelisted-app package="com.android.providers.blockednumber" /> <hidden-api-whitelisted-app package="com.android.providers.contacts" /> + <hidden-api-whitelisted-app package="com.android.providers.downloads" /> + <hidden-api-whitelisted-app package="com.android.providers.downloads.ui" /> + <hidden-api-whitelisted-app package="com.android.providers.media" /> + <hidden-api-whitelisted-app package="com.android.providers.settings" /> + <hidden-api-whitelisted-app package="com.android.providers.telephony" /> + <hidden-api-whitelisted-app package="com.android.providers.userdictionary" /> + <hidden-api-whitelisted-app package="com.android.provision" /> + <hidden-api-whitelisted-app package="com.android.proxyhandler" /> + <hidden-api-whitelisted-app package="com.android.sdksetup" /> + <hidden-api-whitelisted-app package="com.android.se" /> + <hidden-api-whitelisted-app package="com.android.server.telecom" /> + <hidden-api-whitelisted-app package="com.android.service.ims" /> + <hidden-api-whitelisted-app package="com.android.service.ims.presence" /> + <hidden-api-whitelisted-app package="com.android.settings" /> + <hidden-api-whitelisted-app package="com.android.sharedstoragebackup" /> + <hidden-api-whitelisted-app package="com.android.shell" /> + <hidden-api-whitelisted-app package="com.android.stk" /> + <hidden-api-whitelisted-app package="com.android.support.car.lenspicker" /> + <hidden-api-whitelisted-app package="com.android.systemui" /> + <hidden-api-whitelisted-app package="com.android.systemui.theme.dark" /> + <hidden-api-whitelisted-app package="com.android.timezone.updater" /> + <hidden-api-whitelisted-app package="com.android.traceur" /> + <hidden-api-whitelisted-app package="com.android.tv.settings" /> + <hidden-api-whitelisted-app package="com.android.vpndialogs" /> + <hidden-api-whitelisted-app package="com.android.wallpaper.livepicker" /> + <hidden-api-whitelisted-app package="com.android.wallpaperbackup" /> + <hidden-api-whitelisted-app package="com.android.wallpapercropper" /> + <hidden-api-whitelisted-app package="com.googlecode.android_scripting" /> </config> diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java index 598807d0309d..f70d6e1223df 100644 --- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java @@ -16,8 +16,6 @@ package android.graphics.drawable; -import dalvik.annotation.optimization.FastNative; - import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -25,8 +23,6 @@ import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.content.res.TypedArray; -import android.util.AttributeSet; -import android.view.InflateException; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; @@ -35,20 +31,21 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.Handler; import android.os.Looper; +import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import com.android.internal.R; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; +import dalvik.annotation.optimization.FastNative; -import libcore.io.IoUtils; import libcore.util.NativeAllocationRegistry; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; import java.io.InputStream; -import java.lang.Runnable; import java.util.ArrayList; /** @@ -72,11 +69,14 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { mAssetFd = afd; } - public final long mNativePtr; + final long mNativePtr; // These just keep references so the native code can continue using them. private final InputStream mInputStream; private final AssetFileDescriptor mAssetFd; + + int[] mThemeAttrs = null; + boolean mAutoMirrored = false; } private State mState; @@ -99,17 +99,27 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { * <p>By default, the loop count in the encoded data is respected.</p> */ public void setLoopCount(int loopCount) { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called setLoopCount on empty AnimatedImageDrawable"); } nSetLoopCount(mState.mNativePtr, loopCount); } /** + * Retrieve the number of times the animation will loop. + */ + public int getLoopCount() { + if (mState.mNativePtr == 0) { + throw new IllegalStateException("called getLoopCount on empty AnimatedImageDrawable"); + } + return nGetLoopCount(mState.mNativePtr); + } + + /** * Create an empty AnimatedImageDrawable. */ public AnimatedImageDrawable() { - mState = null; + mState = new State(0, null, null); } @Override @@ -123,6 +133,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { private void updateStateFromTypedArray(TypedArray a, int srcDensityOverride) throws XmlPullParserException { + State oldState = mState; final Resources r = a.getResources(); final int srcResId = a.getResourceId(R.styleable.AnimatedImageDrawable_src, 0); if (srcResId != 0) { @@ -172,6 +183,16 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { mIntrinsicWidth = other.mIntrinsicWidth; mIntrinsicHeight = other.mIntrinsicHeight; } + + mState.mThemeAttrs = a.extractThemeAttrs(); + if (mState.mNativePtr == 0 && (mState.mThemeAttrs == null + || mState.mThemeAttrs[R.styleable.AnimatedImageDrawable_src] == 0)) { + throw new XmlPullParserException(a.getPositionDescription() + + ": <animated-image> requires a valid 'src' attribute"); + } + + mState.mAutoMirrored = a.getBoolean( + R.styleable.AnimatedImageDrawable_autoMirrored, oldState.mAutoMirrored); } /** @@ -225,7 +246,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { @Override public void draw(@NonNull Canvas canvas) { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called draw on empty AnimatedImageDrawable"); } @@ -256,7 +277,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { + " 255! provided " + alpha); } - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called setAlpha on empty AnimatedImageDrawable"); } @@ -266,7 +287,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { @Override public int getAlpha() { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called getAlpha on empty AnimatedImageDrawable"); } return nGetAlpha(mState.mNativePtr); @@ -274,7 +295,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called setColorFilter on empty AnimatedImageDrawable"); } @@ -298,11 +319,28 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { } @Override + public void setAutoMirrored(boolean mirrored) { + if (mState.mAutoMirrored != mirrored) { + mState.mAutoMirrored = mirrored; + invalidateSelf(); + } + } + + @Override + public final boolean isAutoMirrored() { + return mState.mAutoMirrored; + } + + @Override public boolean setVisible(boolean visible, boolean restart) { if (!super.setVisible(visible, restart)) { return false; } + if (mState.mNativePtr == 0) { + throw new IllegalStateException("called setVisible on empty AnimatedImageDrawable"); + } + if (!visible) { nMarkInvisible(mState.mNativePtr); } @@ -319,7 +357,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { */ @Override public boolean isRunning() { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called isRunning on empty AnimatedImageDrawable"); } return nIsRunning(mState.mNativePtr); @@ -336,7 +374,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { */ @Override public void start() { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called start on empty AnimatedImageDrawable"); } @@ -354,7 +392,7 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { */ @Override public void stop() { - if (mState == null) { + if (mState.mNativePtr == 0) { throw new IllegalStateException("called stop on empty AnimatedImageDrawable"); } if (nStop(mState.mNativePtr)) { @@ -470,6 +508,8 @@ public class AnimatedImageDrawable extends Drawable implements Animatable2 { @FastNative private static native boolean nStop(long nativePtr); @FastNative + private static native int nGetLoopCount(long nativePtr); + @FastNative private static native void nSetLoopCount(long nativePtr, int loopCount); // Pass the drawable down to native so it can call onAnimationEnd. private static native void nSetOnAnimationEndListener(long nativePtr, diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index e2aba0401036..ded427eb244a 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -545,9 +545,7 @@ public class KeyStore { try { args = args != null ? args : new KeymasterArguments(); entropy = entropy != null ? entropy : new byte[0]; - OperationResult res = mBinder.begin(getToken(), alias, purpose, pruneable, args, entropy, uid); - // This result is -26 (KEY_USER_NOT_AUTHENTICATED) but why?? - return res; + return mBinder.begin(getToken(), alias, purpose, pruneable, args, entropy, uid); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); return null; @@ -565,8 +563,7 @@ public class KeyStore { try { arguments = arguments != null ? arguments : new KeymasterArguments(); input = input != null ? input : new byte[0]; - OperationResult res = mBinder.update(token, arguments, input); - return res; + return mBinder.update(token, arguments, input); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); return null; @@ -621,9 +618,9 @@ public class KeyStore { * @return {@code KeyStore.NO_ERROR} on success, otherwise an error value corresponding to * a {@code KeymasterDefs.KM_ERROR_} value or {@code KeyStore} ResponseCode. */ - public int addAuthToken(byte[] authToken, int userId) { + public int addAuthToken(byte[] authToken) { try { - return mBinder.addAuthToken(authToken, userId); + return mBinder.addAuthToken(authToken); } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); return SYSTEM_ERROR; @@ -835,14 +832,14 @@ public class KeyStore { public InvalidKeyException getInvalidKeyException( String keystoreKeyAlias, int uid, KeyStoreException e) { switch (e.getErrorCode()) { - case LOCKED: // 2 + case LOCKED: return new UserNotAuthenticatedException(); - case KeymasterDefs.KM_ERROR_KEY_EXPIRED: // -25 + case KeymasterDefs.KM_ERROR_KEY_EXPIRED: return new KeyExpiredException(); - case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID: // -2 + case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID: return new KeyNotYetValidException(); - case KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED: // -26 - case OP_AUTH_NEEDED: // 15 + case KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED: + case OP_AUTH_NEEDED: { // We now need to determine whether the key/operation can become usable if user // authentication is performed, or whether it can never become usable again. @@ -882,7 +879,7 @@ public class KeyStore { // None of the key's SIDs can ever be authenticated return new KeyPermanentlyInvalidatedException(); } - case UNINITIALIZED: // 3 + case UNINITIALIZED: return new KeyPermanentlyInvalidatedException(); default: return new InvalidKeyException("Keystore operation failed", e); diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java index 419eb24e1cc1..09b3b9b523b4 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java @@ -243,7 +243,13 @@ public abstract class AndroidKeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { // Check that user authentication related parameters are acceptable. This method // will throw an IllegalStateException if there are issues (e.g., secure lock screen // not set up). - KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), spec); + KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), + spec.isUserAuthenticationRequired(), + spec.getUserAuthenticationValidityDurationSeconds(), + spec.isUserAuthenticationValidWhileOnBody(), + spec.isInvalidatedByBiometricEnrollment(), + GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */, + spec.isUserConfirmationRequired()); } catch (IllegalStateException | IllegalArgumentException e) { throw new InvalidAlgorithmParameterException(e); } @@ -279,7 +285,16 @@ public abstract class AndroidKeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes); args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterPaddings); args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests); - KeymasterUtils.addUserAuthArgs(args, spec); + KeymasterUtils.addUserAuthArgs(args, + spec.isUserAuthenticationRequired(), + spec.getUserAuthenticationValidityDurationSeconds(), + spec.isUserAuthenticationValidWhileOnBody(), + spec.isInvalidatedByBiometricEnrollment(), + GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */, + spec.isUserConfirmationRequired()); + if (spec.isTrustedUserPresenceRequired()) { + args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED); + } KeymasterUtils.addMinMacLengthAuthorizationIfNecessary( args, mKeymasterAlgorithm, diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java index d68a33de2c61..e33e3cd4e92b 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -344,7 +344,13 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato // Check that user authentication related parameters are acceptable. This method // will throw an IllegalStateException if there are issues (e.g., secure lock screen // not set up). - KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), mSpec); + KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), + mSpec.isUserAuthenticationRequired(), + mSpec.getUserAuthenticationValidityDurationSeconds(), + mSpec.isUserAuthenticationValidWhileOnBody(), + mSpec.isInvalidatedByBiometricEnrollment(), + GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */, + mSpec.isUserConfirmationRequired()); } catch (IllegalArgumentException | IllegalStateException e) { throw new InvalidAlgorithmParameterException(e); } @@ -535,7 +541,13 @@ public abstract class AndroidKeyStoreKeyPairGeneratorSpi extends KeyPairGenerato args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterSignaturePaddings); args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests); - KeymasterUtils.addUserAuthArgs(args, mSpec); + KeymasterUtils.addUserAuthArgs(args, + mSpec.isUserAuthenticationRequired(), + mSpec.getUserAuthenticationValidityDurationSeconds(), + mSpec.isUserAuthenticationValidWhileOnBody(), + mSpec.isInvalidatedByBiometricEnrollment(), + GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */, + mSpec.isUserConfirmationRequired()); args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, mSpec.getKeyValidityStart()); args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME, mSpec.getKeyValidityForOriginationEnd()); diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java index fc86ca0443b0..05cc74a0bec9 100644 --- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java @@ -497,7 +497,13 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterEncryptionPaddings); importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING, KeyProperties.SignaturePadding.allToKeymaster(spec.getSignaturePaddings())); - KeymasterUtils.addUserAuthArgs(importArgs, spec); + KeymasterUtils.addUserAuthArgs(importArgs, + spec.isUserAuthenticationRequired(), + spec.getUserAuthenticationValidityDurationSeconds(), + spec.isUserAuthenticationValidWhileOnBody(), + spec.isInvalidatedByBiometricEnrollment(), + spec.getBoundToSpecificSecureUserId(), + spec.isUserConfirmationRequired()); importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, spec.getKeyValidityStart()); importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME, @@ -694,7 +700,13 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi { int[] keymasterPaddings = KeyProperties.EncryptionPadding.allToKeymaster( params.getEncryptionPaddings()); args.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterPaddings); - KeymasterUtils.addUserAuthArgs(args, params); + KeymasterUtils.addUserAuthArgs(args, + params.isUserAuthenticationRequired(), + params.getUserAuthenticationValidityDurationSeconds(), + params.isUserAuthenticationValidWhileOnBody(), + params.isInvalidatedByBiometricEnrollment(), + params.getBoundToSpecificSecureUserId(), + params.isUserConfirmationRequired()); KeymasterUtils.addMinMacLengthAuthorizationIfNecessary( args, keymasterAlgorithm, diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index d0814c6f2f93..da23c70f58bb 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -21,7 +21,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.KeyguardManager; import android.hardware.fingerprint.FingerprintManager; -import android.security.GateKeeper; import android.security.KeyStore; import android.text.TextUtils; @@ -233,7 +232,7 @@ import javax.security.auth.x500.X500Principal; * key = (SecretKey) keyStore.getKey("key2", null); * }</pre> */ -public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAuthArgs { +public final class KeyGenParameterSpec implements AlgorithmParameterSpec { private static final X500Principal DEFAULT_CERT_SUBJECT = new X500Principal("CN=fake"); private static final BigInteger DEFAULT_CERT_SERIAL_NUMBER = new BigInteger("1"); @@ -266,7 +265,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu private final boolean mInvalidatedByBiometricEnrollment; private final boolean mIsStrongBoxBacked; private final boolean mUserConfirmationRequired; - private final boolean mUnlockedDeviceRequired; /** * @hide should be built with Builder @@ -297,8 +295,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu boolean userAuthenticationValidWhileOnBody, boolean invalidatedByBiometricEnrollment, boolean isStrongBoxBacked, - boolean userConfirmationRequired, - boolean unlockedDeviceRequired) { + boolean userConfirmationRequired) { if (TextUtils.isEmpty(keyStoreAlias)) { throw new IllegalArgumentException("keyStoreAlias must not be empty"); } @@ -347,7 +344,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment; mIsStrongBoxBacked = isStrongBoxBacked; mUserConfirmationRequired = userConfirmationRequired; - mUnlockedDeviceRequired = unlockedDeviceRequired; } /** @@ -673,22 +669,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu } /** - * Returns {@code true} if the key cannot be used unless the device screen is unlocked. - * - * @see Builder#SetUnlockedDeviceRequired(boolean) - */ - public boolean isUnlockedDeviceRequired() { - return mUnlockedDeviceRequired; - } - - /** - * @hide - */ - public long getBoundToSpecificSecureUserId() { - return GateKeeper.INVALID_SECURE_USER_ID; - } - - /** * Builder of {@link KeyGenParameterSpec} instances. */ public final static class Builder { @@ -719,7 +699,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu private boolean mInvalidatedByBiometricEnrollment = true; private boolean mIsStrongBoxBacked = false; private boolean mUserConfirmationRequired; - private boolean mUnlockedDeviceRequired = false; /** * Creates a new instance of the {@code Builder}. @@ -1288,18 +1267,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu } /** - * Sets whether the keystore requires the screen to be unlocked before allowing decryption - * using this key. If this is set to {@code true}, any attempt to decrypt using this key - * while the screen is locked will fail. A locked device requires a PIN, password, - * fingerprint, or other trusted factor to access. - */ - @NonNull - public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) { - mUnlockedDeviceRequired = unlockedDeviceRequired; - return this; - } - - /** * Builds an instance of {@code KeyGenParameterSpec}. */ @NonNull @@ -1330,8 +1297,7 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAu mUserAuthenticationValidWhileOnBody, mInvalidatedByBiometricEnrollment, mIsStrongBoxBacked, - mUserConfirmationRequired, - mUnlockedDeviceRequired); + mUserConfirmationRequired); } } } diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java index 7f8259b89962..b5b328192f21 100644 --- a/keystore/java/android/security/keystore/KeyProtection.java +++ b/keystore/java/android/security/keystore/KeyProtection.java @@ -212,7 +212,7 @@ import javax.crypto.Mac; * ... * }</pre> */ -public final class KeyProtection implements ProtectionParameter, UserAuthArgs { +public final class KeyProtection implements ProtectionParameter { private final Date mKeyValidityStart; private final Date mKeyValidityForOriginationEnd; private final Date mKeyValidityForConsumptionEnd; @@ -229,8 +229,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { private final long mBoundToSecureUserId; private final boolean mCriticalToDeviceEncryption; private final boolean mUserConfirmationRequired; - private final boolean mTrustedUserPresenceRequired; - private final boolean mUnlockedDeviceRequired; private KeyProtection( Date keyValidityStart, @@ -244,13 +242,11 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, int userAuthenticationValidityDurationSeconds, - boolean trustedUserPresenceRequired, boolean userAuthenticationValidWhileOnBody, boolean invalidatedByBiometricEnrollment, long boundToSecureUserId, boolean criticalToDeviceEncryption, - boolean userConfirmationRequired, - boolean unlockedDeviceRequired) { + boolean userConfirmationRequired) { mKeyValidityStart = Utils.cloneIfNotNull(keyValidityStart); mKeyValidityForOriginationEnd = Utils.cloneIfNotNull(keyValidityForOriginationEnd); mKeyValidityForConsumptionEnd = Utils.cloneIfNotNull(keyValidityForConsumptionEnd); @@ -269,8 +265,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { mBoundToSecureUserId = boundToSecureUserId; mCriticalToDeviceEncryption = criticalToDeviceEncryption; mUserConfirmationRequired = userConfirmationRequired; - mTrustedUserPresenceRequired = trustedUserPresenceRequired; - mUnlockedDeviceRequired = unlockedDeviceRequired; } /** @@ -443,14 +437,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** - * Returns {@code true} if the key is authorized to be used only if a test of user presence has - * been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls. - */ - public boolean isTrustedUserPresenceRequired() { - return mTrustedUserPresenceRequired; - } - - /** * Returns {@code true} if the key will be de-authorized when the device is removed from the * user's body. This option has no effect on keys that don't have an authentication validity * duration, and has no effect if the device lacks an on-body sensor. @@ -508,15 +494,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** - * Returns {@code true} if the key cannot be used unless the device screen is unlocked. - * - * @see Builder#SetRequireDeviceUnlocked(boolean) - */ - public boolean isUnlockedDeviceRequired() { - return mUnlockedDeviceRequired; - } - - /** * Builder of {@link KeyProtection} instances. */ public final static class Builder { @@ -535,9 +512,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { private boolean mUserAuthenticationValidWhileOnBody; private boolean mInvalidatedByBiometricEnrollment = true; private boolean mUserConfirmationRequired; - private boolean mTrustedUserPresenceRequired = false; - private boolean mUnlockedDeviceRequired = false; - private long mBoundToSecureUserId = GateKeeper.INVALID_SECURE_USER_ID; private boolean mCriticalToDeviceEncryption = false; @@ -837,16 +811,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** - * Sets whether a test of user presence is required to be performed between the - * {@code Signature.initSign()} and {@code Signature.sign()} method calls. - */ - @NonNull - public Builder setTrustedUserPresenceRequired(boolean required) { - mTrustedUserPresenceRequired = required; - return this; - } - - /** * Sets whether the key will remain authorized only until the device is removed from the * user's body up to the limit of the authentication validity period (see * {@link #setUserAuthenticationValidityDurationSeconds} and @@ -928,18 +892,6 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { } /** - * Sets whether the keystore requires the screen to be unlocked before allowing decryption - * using this key. If this is set to {@code true}, any attempt to decrypt using this key - * while the screen is locked will fail. A locked device requires a PIN, password, - * fingerprint, or other trusted factor to access. - */ - @NonNull - public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) { - mUnlockedDeviceRequired = unlockedDeviceRequired; - return this; - } - - /** * Builds an instance of {@link KeyProtection}. * * @throws IllegalArgumentException if a required field is missing @@ -958,13 +910,11 @@ public final class KeyProtection implements ProtectionParameter, UserAuthArgs { mRandomizedEncryptionRequired, mUserAuthenticationRequired, mUserAuthenticationValidityDurationSeconds, - mTrustedUserPresenceRequired, mUserAuthenticationValidWhileOnBody, mInvalidatedByBiometricEnrollment, mBoundToSecureUserId, mCriticalToDeviceEncryption, - mUserConfirmationRequired, - mUnlockedDeviceRequired); + mUserConfirmationRequired); } } } diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java index 5bd0e7406ff9..4e28601f17a1 100644 --- a/keystore/java/android/security/keystore/KeymasterUtils.java +++ b/keystore/java/android/security/keystore/KeymasterUtils.java @@ -18,7 +18,6 @@ package android.security.keystore; import android.util.Log; import android.hardware.fingerprint.FingerprintManager; -import android.os.UserHandle; import android.security.GateKeeper; import android.security.KeyStore; import android.security.keymaster.KeymasterArguments; @@ -102,27 +101,22 @@ public abstract class KeymasterUtils { * require user authentication. */ public static void addUserAuthArgs(KeymasterArguments args, - UserAuthArgs spec) { - if (spec.isTrustedUserPresenceRequired()) { - args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED); - } - - if (spec.isUserConfirmationRequired()) { + boolean userAuthenticationRequired, + int userAuthenticationValidityDurationSeconds, + boolean userAuthenticationValidWhileOnBody, + boolean invalidatedByBiometricEnrollment, + long boundToSpecificSecureUserId, + boolean userConfirmationRequired) { + if (userConfirmationRequired) { args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED); } - if (spec.isUnlockedDeviceRequired()) { - args.addBoolean(KeymasterDefs.KM_TAG_UNLOCKED_DEVICE_REQUIRED); - // Once keymaster is properly ignoring this tag, it should be added to every auth list - args.addUnsignedInt(KeymasterDefs.KM_TAG_USER_ID, UserHandle.getCallingUserId()); - } - - if (!spec.isUserAuthenticationRequired()) { + if (!userAuthenticationRequired) { args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED); return; } - if (spec.getUserAuthenticationValidityDurationSeconds() == -1) { + if (userAuthenticationValidityDurationSeconds == -1) { // Every use of this key needs to be authorized by the user. This currently means // fingerprint-only auth. FingerprintManager fingerprintManager = @@ -138,9 +132,9 @@ public abstract class KeymasterUtils { } long sid; - if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) { - sid = spec.getBoundToSpecificSecureUserId(); - } else if (spec.isInvalidatedByBiometricEnrollment()) { + if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) { + sid = boundToSpecificSecureUserId; + } else if (invalidatedByBiometricEnrollment) { // The fingerprint-only SID will change on fingerprint enrollment or removal of all, // enrolled fingerprints, invalidating the key. sid = fingerprintOnlySid; @@ -153,14 +147,14 @@ public abstract class KeymasterUtils { args.addUnsignedLong( KeymasterDefs.KM_TAG_USER_SECURE_ID, KeymasterArguments.toUint64(sid)); args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, KeymasterDefs.HW_AUTH_FINGERPRINT); - if (spec.isUserAuthenticationValidWhileOnBody()) { + if (userAuthenticationValidWhileOnBody) { throw new ProviderException("Key validity extension while device is on-body is not " + "supported for keys requiring fingerprint authentication"); } } else { long sid; - if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) { - sid = spec.getBoundToSpecificSecureUserId(); + if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) { + sid = boundToSpecificSecureUserId; } else { // The key is authorized for use for the specified amount of time after the user has // authenticated. Whatever unlocks the secure lock screen should authorize this key. @@ -171,8 +165,8 @@ public abstract class KeymasterUtils { args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, KeymasterDefs.HW_AUTH_PASSWORD | KeymasterDefs.HW_AUTH_FINGERPRINT); args.addUnsignedInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT, - spec.getUserAuthenticationValidityDurationSeconds()); - if (spec.isUserAuthenticationValidWhileOnBody()) { + userAuthenticationValidityDurationSeconds); + if (userAuthenticationValidWhileOnBody) { args.addBoolean(KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY); } } diff --git a/keystore/java/android/security/keystore/UserAuthArgs.java b/keystore/java/android/security/keystore/UserAuthArgs.java deleted file mode 100644 index 3a7017ecaa88..000000000000 --- a/keystore/java/android/security/keystore/UserAuthArgs.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2017 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.security.keystore; - -/** - * @hide - * - * This is an interface to encapsulate the user authentication arguments that - * are passed to KeymasterUtils.addUserAuthArgs. Classes that represent - * authorization characteristics for new or imported keys can implement this - * interface to be passed to that method. - */ -public interface UserAuthArgs { - - boolean isUserAuthenticationRequired(); - int getUserAuthenticationValidityDurationSeconds(); - boolean isUserAuthenticationValidWhileOnBody(); - boolean isInvalidatedByBiometricEnrollment(); - boolean isTrustedUserPresenceRequired(); - boolean isUnlockedDeviceRequired(); - boolean isUserConfirmationRequired(); - long getBoundToSpecificSecureUserId(); - -} diff --git a/libs/hwui/hwui/AnimatedImageDrawable.h b/libs/hwui/hwui/AnimatedImageDrawable.h index 07469d288787..a5260be0097e 100644 --- a/libs/hwui/hwui/AnimatedImageDrawable.h +++ b/libs/hwui/hwui/AnimatedImageDrawable.h @@ -72,6 +72,7 @@ public: // already stopped) bool stop(); bool isRunning(); + int getRepetitionCount() const { return mSkAnimatedImage->getRepetitionCount(); } void setRepetitionCount(int count) { mSkAnimatedImage->setRepetitionCount(count); } void setOnAnimationEndListener(std::unique_ptr<OnAnimationEndListener> listener) { diff --git a/libs/hwui/renderthread/DrawFrameTask.cpp b/libs/hwui/renderthread/DrawFrameTask.cpp index 8372331c0352..778e7689d0f9 100644 --- a/libs/hwui/renderthread/DrawFrameTask.cpp +++ b/libs/hwui/renderthread/DrawFrameTask.cpp @@ -94,12 +94,20 @@ void DrawFrameTask::run() { // Grab a copy of everything we need CanvasContext* context = mContext; + std::function<void(int64_t)> callback = std::move(mFrameCallback); // From this point on anything in "this" is *UNSAFE TO ACCESS* if (canUnblockUiThread) { unblockUiThread(); } + // Even if we aren't drawing this vsync pulse the next frame number will still be accurate + if (CC_UNLIKELY(callback)) { + context->enqueueFrameWork([callback, frameNr = context->getFrameNumber()]() { + callback(frameNr); + }); + } + if (CC_LIKELY(canDrawThisFrame)) { context->draw(); } else { diff --git a/libs/hwui/renderthread/DrawFrameTask.h b/libs/hwui/renderthread/DrawFrameTask.h index ea51ae4a42b7..d8c43e0d8ca8 100644 --- a/libs/hwui/renderthread/DrawFrameTask.h +++ b/libs/hwui/renderthread/DrawFrameTask.h @@ -74,6 +74,10 @@ public: void run(); + void setFrameCallback(std::function<void(int64_t)>&& callback) { + mFrameCallback = std::move(callback); + } + private: void postAndWait(); bool syncFrameState(TreeInfo& info); @@ -96,6 +100,8 @@ private: int64_t mSyncQueued; int64_t mFrameInfo[UI_THREAD_FRAME_INFO_SIZE]; + + std::function<void(int64_t)> mFrameCallback; }; } /* namespace renderthread */ diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 79e46ed9e65f..4be7a57daedf 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -270,6 +270,10 @@ void RenderProxy::setContentDrawBounds(int left, int top, int right, int bottom) mDrawFrameTask.setContentDrawBounds(left, top, right, bottom); } +void RenderProxy::setFrameCallback(std::function<void(int64_t)>&& callback) { + mDrawFrameTask.setFrameCallback(std::move(callback)); +} + void RenderProxy::serializeDisplayListTree() { mRenderThread.queue().post([=]() { mContext->serializeDisplayListTree(); }); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index bc57d9255ad5..3425c5c68a72 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -115,6 +115,7 @@ public: ANDROID_API void removeRenderNode(RenderNode* node); ANDROID_API void drawRenderNode(RenderNode* node); ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom); + ANDROID_API void setFrameCallback(std::function<void(int64_t)>&& callback); ANDROID_API void addFrameMetricsObserver(FrameMetricsObserver* observer); ANDROID_API void removeFrameMetricsObserver(FrameMetricsObserver* observer); diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp index 9d246ffc9a4a..21c91a26745b 100644 --- a/libs/hwui/renderthread/VulkanManager.cpp +++ b/libs/hwui/renderthread/VulkanManager.cpp @@ -310,7 +310,7 @@ void VulkanManager::createBuffers(VulkanSurface* surface, VkFormat format, VkExt for (uint32_t i = 0; i < surface->mImageCount; ++i) { GrVkImageInfo info; info.fImage = surface->mImages[i]; - info.fAlloc = {VK_NULL_HANDLE, 0, 0, 0}; + info.fAlloc = GrVkAlloc(); info.fImageLayout = VK_IMAGE_LAYOUT_UNDEFINED; info.fImageTiling = VK_IMAGE_TILING_OPTIMAL; info.fFormat = format; diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp index e3af65532f85..0a90f85cda0e 100644 --- a/libs/input/PointerController.cpp +++ b/libs/input/PointerController.cpp @@ -24,15 +24,11 @@ #include <log/log.h> -// ToDo: Fix code to be warning free -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" #include <SkBitmap.h> #include <SkCanvas.h> #include <SkColor.h> #include <SkPaint.h> #include <SkBlendMode.h> -#pragma GCC diagnostic pop namespace android { diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 9ff964b3f0d4..5b627ec2ed56 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -53,6 +53,7 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import android.util.Slog; import android.view.KeyEvent; @@ -3913,6 +3914,21 @@ public class AudioManager { } /** + * Indicate Hearing Aid connection state change. + * @param device Bluetooth device connected/disconnected + * @param state new connection state (BluetoothProfile.STATE_xxx) + * {@hide} + */ + public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) { + final IAudioService service = getService(); + try { + service.setHearingAidDeviceConnectionState(device, state); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** * Indicate A2DP source or sink connection state change. * @param device Bluetooth device connected/disconnected * @param state new connection state (BluetoothProfile.STATE_xxx) @@ -4769,6 +4785,28 @@ public class AudioManager { } /** + * Convert {@link AudioDeviceInfo} to {@link MicrophoneInfo}. + * @hide + */ + public static MicrophoneInfo microphoneInfoFromAudioDeviceInfo(AudioDeviceInfo deviceInfo) { + int deviceType = deviceInfo.getType(); + int micLocation = (deviceType == AudioDeviceInfo.TYPE_BUILTIN_MIC + || deviceType == AudioDeviceInfo.TYPE_TELEPHONY) ? MicrophoneInfo.LOCATION_MAINBODY + : deviceType == AudioDeviceInfo.TYPE_UNKNOWN ? MicrophoneInfo.LOCATION_UNKNOWN + : MicrophoneInfo.LOCATION_PERIPHERAL; + MicrophoneInfo microphone = new MicrophoneInfo( + deviceInfo.getPort().name() + deviceInfo.getId(), + deviceInfo.getPort().type(), deviceInfo.getAddress(), micLocation, + MicrophoneInfo.GROUP_UNKNOWN, MicrophoneInfo.INDEX_IN_THE_GROUP_UNKNOWN, + MicrophoneInfo.POSITION_UNKNOWN, MicrophoneInfo.ORIENTATION_UNKNOWN, + new ArrayList<Pair<Float, Float>>(), new ArrayList<Pair<Integer, Integer>>(), + MicrophoneInfo.SENSITIVITY_UNKNOWN, MicrophoneInfo.SPL_UNKNOWN, + MicrophoneInfo.SPL_UNKNOWN, MicrophoneInfo.DIRECTIONALITY_UNKNOWN); + microphone.setId(deviceInfo.getId()); + return microphone; + } + + /** * Returns a list of {@link MicrophoneInfo} that corresponds to the characteristics * of all available microphones. The list is empty when no microphones are available * on the device. An error during the query will result in an IOException being thrown. @@ -4785,6 +4823,15 @@ public class AudioManager { return new ArrayList<MicrophoneInfo>(); // Always return a list. } setPortIdForMicrophones(microphones); + AudioDeviceInfo[] devices = getDevicesStatic(GET_DEVICES_INPUTS); + for (AudioDeviceInfo device : devices) { + if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_MIC || + device.getType() == AudioDeviceInfo.TYPE_TELEPHONY) { + continue; + } + MicrophoneInfo microphone = microphoneInfoFromAudioDeviceInfo(device); + microphones.add(microphone); + } return microphones; } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 384753018bc8..4f0dccb8a088 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -41,6 +41,7 @@ import android.os.ServiceManager; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import com.android.internal.annotations.GuardedBy; @@ -1630,6 +1631,20 @@ public class AudioRecord implements AudioRouting return new ArrayList<MicrophoneInfo>(); } AudioManager.setPortIdForMicrophones(activeMicrophones); + + // Use routed device when there is not information returned by hal. + if (activeMicrophones.size() == 0) { + AudioDeviceInfo device = getRoutedDevice(); + if (device != null) { + MicrophoneInfo microphone = AudioManager.microphoneInfoFromAudioDeviceInfo(device); + ArrayList<Pair<Integer, Integer>> channelMapping = new ArrayList<>(); + for (int i = 0; i < mChannelCount; i++) { + channelMapping.add(new Pair(i, MicrophoneInfo.CHANNEL_MAPPING_DIRECT)); + } + microphone.setChannelMapping(channelMapping); + activeMicrophones.add(microphone); + } + } return activeMicrophones; } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 05ba4c35c21d..74e7c452216a 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -151,6 +151,8 @@ interface IAudioService { void setWiredDeviceConnectionState(int type, int state, String address, String name, String caller); + void setHearingAidDeviceConnectionState(in BluetoothDevice device, int state); + int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state, int profile); void handleBluetoothA2dpDeviceConfigChange(in BluetoothDevice device); diff --git a/media/java/android/media/MediaBrowser2.java b/media/java/android/media/MediaBrowser2.java index e1d078d95325..dea38a80d6b3 100644 --- a/media/java/android/media/MediaBrowser2.java +++ b/media/java/android/media/MediaBrowser2.java @@ -31,7 +31,6 @@ import java.util.concurrent.Executor; /** * Browses media content offered by a {@link MediaLibraryService2}. - * @hide */ public class MediaBrowser2 extends MediaController2 { // Equals to the ((MediaBrowser2Provider) getProvider()) @@ -51,7 +50,7 @@ public class MediaBrowser2 extends MediaController2 { * @param rootMediaId media id of the library root. Can be {@code null} * @param rootExtra extra of the library root. Can be {@code null} */ - public void onGetRootResult(Bundle rootHints, @Nullable String rootMediaId, + public void onGetLibraryRootDone(Bundle rootHints, @Nullable String rootMediaId, @Nullable Bundle rootExtra) { } /** @@ -62,11 +61,11 @@ public class MediaBrowser2 extends MediaController2 { * {@link MediaLibrarySession#notifyChildrenChanged(String, int, Bundle)} for the parent. * * @param parentId parent id that you've specified with {@link #subscribe(String, Bundle)} - * @param childCount number of children + * @param itemCount number of children * @param extras extra bundle from the library service. Can be differ from extras that * you've specified with {@link #subscribe(String, Bundle)}. */ - public void onChildrenChanged(@NonNull String parentId, int childCount, + public void onChildrenChanged(@NonNull String parentId, int itemCount, @Nullable Bundle extras) { } /** @@ -81,7 +80,7 @@ public class MediaBrowser2 extends MediaController2 { * @param result result. Can be {@code null} * @param extras extra bundle from the library service */ - public void onChildrenLoaded(@NonNull String parentId, int page, int pageSize, + public void onGetChildrenDone(@NonNull String parentId, int page, int pageSize, @Nullable List<MediaItem2> result, @Nullable Bundle extras) { } /** @@ -93,7 +92,7 @@ public class MediaBrowser2 extends MediaController2 { * @param mediaId media id * @param result result. Can be {@code null} */ - public void onItemLoaded(@NonNull String mediaId, @Nullable MediaItem2 result) { } + public void onGetItemDone(@NonNull String mediaId, @Nullable MediaItem2 result) { } /** * Called when there's change in the search result requested by the previous @@ -121,7 +120,7 @@ public class MediaBrowser2 extends MediaController2 { * @param result result. Can be {@code null}. * @param extras extra bundle from the library service */ - public void onSearchResultLoaded(@NonNull String query, int page, int pageSize, + public void onGetSearchResultDone(@NonNull String query, int page, int pageSize, @Nullable List<MediaItem2> result, @Nullable Bundle extras) { } } @@ -140,10 +139,10 @@ public class MediaBrowser2 extends MediaController2 { /** * Get the library root. Result would be sent back asynchronously with the - * {@link BrowserCallback#onGetRootResult(Bundle, String, Bundle)}. + * {@link BrowserCallback#onGetLibraryRootDone(Bundle, String, Bundle)}. * * @param rootHints hint for the root - * @see BrowserCallback#onGetRootResult(Bundle, String, Bundle) + * @see BrowserCallback#onGetLibraryRootDone(Bundle, String, Bundle) */ public void getLibraryRoot(Bundle rootHints) { mProvider.getLibraryRoot_impl(rootHints); @@ -177,7 +176,7 @@ public class MediaBrowser2 extends MediaController2 { /** * Get list of children under the parent. Result would be sent back asynchronously with the - * {@link BrowserCallback#onChildrenLoaded(String, int, int, List, Bundle)}. + * {@link BrowserCallback#onGetChildrenDone(String, int, int, List, Bundle)}. * * @param parentId parent id for getting the children. * @param page page number to get the result. Starts from {@code 1} @@ -190,7 +189,7 @@ public class MediaBrowser2 extends MediaController2 { /** * Get the media item with the given media id. Result would be sent back asynchronously with the - * {@link BrowserCallback#onItemLoaded(String, MediaItem2)}. + * {@link BrowserCallback#onGetItemDone(String, MediaItem2)}. * * @param mediaId media id for specifying the item */ @@ -212,7 +211,7 @@ public class MediaBrowser2 extends MediaController2 { /** * Get the search result from lhe library service. Result would be sent back asynchronously with - * the {@link BrowserCallback#onSearchResultLoaded(String, int, int, List, Bundle)}. + * the {@link BrowserCallback#onGetSearchResultDone(String, int, int, List, Bundle)}. * * @param query search query that you've specified with {@link #search(String, Bundle)} * @param page page number to get search result. Starts from {@code 1} diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java index 6682e086ee96..0114240816ab 100644 --- a/media/java/android/media/MediaController2.java +++ b/media/java/android/media/MediaController2.java @@ -19,13 +19,13 @@ package android.media; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.app.PendingIntent; import android.content.Context; import android.media.MediaSession2.Command; import android.media.MediaSession2.CommandButton; import android.media.MediaSession2.CommandGroup; import android.media.MediaSession2.ControllerInfo; +import android.media.MediaSession2.ErrorCode; import android.media.MediaSession2.PlaylistParams; import android.media.session.MediaSessionManager; import android.media.update.ApiLoader; @@ -64,9 +64,8 @@ import java.util.concurrent.Executor; * <p> * @see MediaSession2 * @see MediaSessionService2 - * @hide */ -public class MediaController2 implements AutoCloseable { +public class MediaController2 implements AutoCloseable, MediaPlaylistController { /** * Interface for listening to change in activeness of the {@link MediaSession2}. It's * active if and only if it has set a player. @@ -126,19 +125,69 @@ public class MediaController2 implements AutoCloseable { /** * Called when the playlist is changed. + * <p> + * When it's called, you should invalidate previous playback information such as position, + * player state, current item, etc. * * @param playlist A new playlist set by the session. */ + // TODO(jaewan): Enhance doc public void onPlaylistChanged(@NonNull List<MediaItem2> playlist) { } /** * Called when the playback state is changed. * * @param state latest playback state + * @hide */ + // TODo(jaewan): Remove public void onPlaybackStateChanged(@NonNull PlaybackState2 state) { } /** + * Called when the player state is changed. + * + * @param state + */ + public void onPlayerStateChanged(int state) { } + + /** + * Called when the player's position is changed + * + * @param updateTimeMs timestamp when the position information is sent from the session + * @param positionMs position in millis + */ + public void onPositionUpdated(long updateTimeMs, long positionMs) { } + + /** + * Called when playback speed is changed. + * + * @param speed speed + */ + public void onPlaybackSpeedChanged(float speed) { } + + /** + * Called when the player's buffering position + * + * @param positionMs buffering position in millis + */ + public void onBufferedPositionChanged(long positionMs) { } + + /** + * Called when a error from + * + * @param errorCode error code + * @param extra extra information + */ + public void onError(@ErrorCode int errorCode, int extra) { } + + /** + * Called when the player's current playing item is changed + * + * @param item new item + */ + public void onCurrentPlaylistItemChanged(MediaItem2 item) { } + + /** * Called when the playlist parameters are changed. * * @param params The new play list parameters. @@ -166,7 +215,6 @@ public class MediaController2 implements AutoCloseable { /** * @hide */ - @SystemApi public PlaybackInfo(PlaybackInfoProvider provider) { mProvider = provider; } @@ -174,7 +222,6 @@ public class MediaController2 implements AutoCloseable { /** * @hide */ - @SystemApi public PlaybackInfoProvider getProvider() { return mProvider; } @@ -281,7 +328,6 @@ public class MediaController2 implements AutoCloseable { /** * @hide */ - @SystemApi public MediaController2Provider getProvider() { return mProvider; } @@ -325,7 +371,7 @@ public class MediaController2 implements AutoCloseable { * Request that the player prepare its playback. In other words, other sessions can continue * to play during the preparation of this session. This method can be used to speed up the * start of the playback. Once the preparation is done, the session will change its playback - * state to {@link PlaybackState2#STATE_PAUSED}. Afterwards, {@link #play} can be called to + * state to {@link MediaPlayerBase#STATE_PAUSED}. Afterwards, {@link #play} can be called to * start playback. */ public void prepare() { @@ -360,12 +406,13 @@ public class MediaController2 implements AutoCloseable { /** * Sets the index of current DataSourceDesc in the play list to be played. * - * @param index the index of DataSourceDesc in the play list you want to play + * @param item the index of DataSourceDesc in the play list you want to play * @throws IllegalArgumentException if the play list is null * @throws NullPointerException if index is outside play list range */ - public void setCurrentPlaylistItem(int index) { - mProvider.setCurrentPlaylistItem_impl(index); + @Override + public void skipToPlaylistItem(@NonNull MediaItem2 item) { + mProvider.skipToPlaylistItem_impl(item); } /** @@ -375,7 +422,7 @@ public class MediaController2 implements AutoCloseable { * @param params A {@link PlaylistParams} object to set. * @throws IllegalArgumentException if given {@param param} is null. */ - public void setPlaylistParams(PlaylistParams params) { + public void setPlaylistParams(@NonNull PlaylistParams params) { mProvider.setPlaylistParams_impl(params); } @@ -428,12 +475,11 @@ public class MediaController2 implements AutoCloseable { mProvider.playFromUri_impl(uri, extras); } - /** * Request that the player prepare playback for a specific media id. In other words, other * sessions can continue to play during the preparation of this session. This method can be * used to speed up the start of the playback. Once the preparation is done, the session - * will change its playback state to {@link PlaybackState2#STATE_PAUSED}. Afterwards, + * will change its playback state to {@link MediaPlayerBase#STATE_PAUSED}. Afterwards, * {@link #play} can be called to start playback. If the preparation is not needed, * {@link #playFromMediaId} can be directly called without this method. * @@ -450,7 +496,7 @@ public class MediaController2 implements AutoCloseable { * query should be treated as a request to prepare any music. In other words, other sessions * can continue to play during the preparation of this session. This method can be used to * speed up the start of the playback. Once the preparation is done, the session will - * change its playback state to {@link PlaybackState2#STATE_PAUSED}. Afterwards, + * change its playback state to {@link MediaPlayerBase#STATE_PAUSED}. Afterwards, * {@link #play} can be called to start playback. If the preparation is not needed, * {@link #playFromSearch} can be directly called without this method. * @@ -466,7 +512,7 @@ public class MediaController2 implements AutoCloseable { * Request that the player prepare playback for a specific {@link Uri}. In other words, * other sessions can continue to play during the preparation of this session. This method * can be used to speed up the start of the playback. Once the preparation is done, the - * session will change its playback state to {@link PlaybackState2#STATE_PAUSED}. Afterwards, + * session will change its playback state to {@link MediaPlayerBase#STATE_PAUSED}. Afterwards, * {@link #play} can be called to start playback. If the preparation is not needed, * {@link #playFromUri} can be directly called without this method. * @@ -537,12 +583,65 @@ public class MediaController2 implements AutoCloseable { * playback state. * * @return a playback state. Can be {@code null} + * @hide */ public @Nullable PlaybackState2 getPlaybackState() { return mProvider.getPlaybackState_impl(); } /** + * Get the lastly cached player state from {@link ControllerCallback#onPlayerStateChanged(int)}. + * + * @return player state + */ + public int getPlayerState() { + return mProvider.getPlayerState_impl(); + } + + /** + * Get the lastly cached position from {@link ControllerCallback#onPositionUpdated(long, long)}. + * <p> + * This returns the calculated value of the position, based on the difference between the + * update time and current time. + * + * @return position + */ + public long getPosition() { + return mProvider.getPosition_impl(); + } + + /** + * Get the lastly cached playback speed from + * {@link ControllerCallback#onPlaybackSpeedChanged(float)}. + * + * @return speed + */ + public float getPlaybackSpeed() { + return mProvider.getPlaybackSpeed_impl(); + } + + /** + * Get the lastly cached buffered position from + * {@link ControllerCallback#onBufferedPositionChanged(long)}. + * + * @return buffering position in millis + */ + public long getBufferedPosition() { + return mProvider.getBufferedPosition_impl(); + } + + /** + * Get the lastly cached current item from + * {@link ControllerCallback#onCurrentPlaylistItemChanged(MediaItem2)}. + * + * @return index of the current item + */ + @Override + public MediaItem2 getCurrentPlaylistItem() { + return mProvider.getCurrentPlaylistItem_impl(); + } + + /** * Get the current playback info for this session. * * @return The current playback info or null. @@ -584,6 +683,7 @@ public class MediaController2 implements AutoCloseable { * * @return playlist. Can be {@code null} if the controller doesn't have enough permission. */ + @Override public @Nullable List<MediaItem2> getPlaylist() { return mProvider.getPlaylist_impl(); } @@ -603,13 +703,11 @@ public class MediaController2 implements AutoCloseable { * If index is same as the current index of the playlist, current playback * will be stopped and playback moves to next source in the list. * - * @return the removed DataSourceDesc at index in the play list * @throws IllegalArgumentException if the play list is null * @throws IndexOutOfBoundsException if index is outside play list range */ - // TODO(jaewan): Remove with index was previously rejected by council (b/36524925) - // TODO(jaewan): Should we also add movePlaylistItem from index to index? - public void removePlaylistItem(MediaItem2 item) { + @Override + public void removePlaylistItem(@NonNull MediaItem2 item) { mProvider.removePlaylistItem_impl(item); } @@ -620,12 +718,12 @@ public class MediaController2 implements AutoCloseable { * If index is less than or equal to the current index of the play list, * the current index of the play list will be incremented correspondingly. * - * @param index the index you want to add dsd to the play list - * @param item the media item you want to add to the play list + * @param index the index you want to add + * @param item the media item you want to add * @throws IndexOutOfBoundsException if index is outside play list range - * @throws NullPointerException if dsd is null */ - public void addPlaylistItem(int index, MediaItem2 item) { + @Override + public void addPlaylistItem(int index, @NonNull MediaItem2 item) { mProvider.addPlaylistItem_impl(index, item); } } diff --git a/media/java/android/media/MediaItem2.java b/media/java/android/media/MediaItem2.java index 667aac1b426a..b7b75e49eb82 100644 --- a/media/java/android/media/MediaItem2.java +++ b/media/java/android/media/MediaItem2.java @@ -19,7 +19,6 @@ package android.media; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.content.Context; import android.media.update.ApiLoader; import android.media.update.MediaItem2Provider; @@ -35,7 +34,6 @@ import java.lang.annotation.RetentionPolicy; * When it's sent to a controller or browser, it's anonymized and data descriptor wouldn't be sent. * <p> * This object isn't a thread safe. - * @hide */ public class MediaItem2 { /** @hide */ @@ -64,7 +62,9 @@ public class MediaItem2 { * @param mediaId id of this item. It must be unique whithin this app * @param metadata metadata with the media id. * @param flags The flags for this item. + * @hide */ + // TODO(jaewan): Remove this public MediaItem2(@NonNull Context context, @NonNull String mediaId, @NonNull DataSourceDesc dsd, @Nullable MediaMetadata2 metadata, @Flags int flags) { @@ -76,7 +76,6 @@ public class MediaItem2 { * Create a new media item * @hide */ - @SystemApi public MediaItem2(MediaItem2Provider provider) { mProvider = provider; } @@ -156,4 +155,87 @@ public class MediaItem2 { public @Nullable DataSourceDesc getDataSourceDesc() { return mProvider.getDataSourceDesc_impl(); } + + /** + * Build {@link MediaItem2} + */ + // TODO(jaewan): Move it to updatable + public static final class Builder { + private Context mContext; + private @Flags int mFlags; + private String mMediaId; + private MediaMetadata2 mMetadata; + private DataSourceDesc mDataSourceDesc; + + /** + * Constructor for {@link Builder} + * + * @param context + * @param flags + */ + public Builder(@NonNull Context context, @Flags int flags) { + mContext = context; + mFlags = flags; + } + + /** + * Set the media id of this instance. {@code null} for unset. + * <p> + * Media id is used to identify a media contents between session and controller. + * <p> + * If the metadata is set with the {@link #setMetadata(MediaMetadata2)} and it has + * media id, id from {@link #setMediaId(String)} will be ignored and metadata's id will be + * used instead. If the id isn't set neither by {@link #setMediaId(String)} nor + * {@link #setMetadata(MediaMetadata2)}, id will be automatically generated. + * + * @param mediaId media id + * @return this instance for chaining + */ + public Builder setMediaId(@Nullable String mediaId) { + mMediaId = mediaId; + return this; + } + + /** + * Set the metadata of this instance. {@code null} for unset. + * <p> + * If the metadata is set with the {@link #setMetadata(MediaMetadata2)} and it has + * media id, id from {@link #setMediaId(String)} will be ignored and metadata's id will be + * used instead. If the id isn't set neither by {@link #setMediaId(String)} nor + * {@link #setMetadata(MediaMetadata2)}, id will be automatically generated. + * + * @param metadata metadata + * @return this instance for chaining + */ + public Builder setMetadata(@Nullable MediaMetadata2 metadata) { + mMetadata = metadata; + return this; + } + + /** + * Set the data source descriptor for this instance. {@code null} for unset. + * + * @param dataSourceDesc data source descriptor + * @return this instance for chaining + */ + public Builder setDataSourceDesc(@Nullable DataSourceDesc dataSourceDesc) { + mDataSourceDesc = dataSourceDesc; + return this; + } + + /** + * Build {@link MediaItem2}. + * + * @return a new {@link MediaItem2}. + */ + public MediaItem2 build() { + String id = (mMetadata != null) + ? mMetadata.getString(MediaMetadata2.METADATA_KEY_MEDIA_ID) : null; + if (id == null) { + // TODO(jaewan): Double check if its sufficient (e.g. Use UUID instead?) + id = (mMediaId != null) ? mMediaId : toString(); + } + return new MediaItem2(mContext, id, mDataSourceDesc, mMetadata, mFlags); + } + } } diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java index ec37d0e0176a..768d044f1583 100644 --- a/media/java/android/media/MediaLibraryService2.java +++ b/media/java/android/media/MediaLibraryService2.java @@ -19,10 +19,10 @@ package android.media; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.app.PendingIntent; import android.content.Context; -import android.media.MediaSession2.BuilderBase; +import android.media.MediaLibraryService2.MediaLibrarySession.Builder; +import android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback; import android.media.MediaSession2.ControllerInfo; import android.media.update.ApiLoader; import android.media.update.MediaLibraryService2Provider.LibraryRootProvider; @@ -40,7 +40,7 @@ import java.util.concurrent.Executor; * and ask the application to start playing it. They may also be used to control content that * is already playing by way of a {@link MediaSession2}. * <p> - * To extend this class, adding followings directly to your {@code AndroidManifest.xml}. + * When extending this class, also add the following to your {@code AndroidManifest.xml}. * <pre> * <service android:name="component_name_of_your_implementation" > * <intent-filter> @@ -48,11 +48,12 @@ import java.util.concurrent.Executor; * </intent-filter> * </service></pre> * <p> - * A {@link MediaLibraryService2} is extension of {@link MediaSessionService2}. IDs shouldn't + * The {@link MediaLibraryService2} class derives from {@link MediaSessionService2}. IDs shouldn't * be shared between the {@link MediaSessionService2} and {@link MediaSession2}. By * default, an empty string will be used for ID of the service. If you want to specify an ID, * declare metadata in the manifest as follows. - * @hide + * + * @see MediaSessionService2 */ public abstract class MediaLibraryService2 extends MediaSessionService2 { /** @@ -63,15 +64,178 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { /** * Session for the {@link MediaLibraryService2}. Build this object with - * {@link MediaLibrarySessionBuilder} and return in {@link #onCreateSession(String)}. + * {@link Builder} and return in {@link #onCreateSession(String)}. */ - public static class MediaLibrarySession extends MediaSession2 { + public static final class MediaLibrarySession extends MediaSession2 { private final MediaLibrarySessionProvider mProvider; /** + * Callback for the {@link MediaLibrarySession}. + */ + public static class MediaLibrarySessionCallback extends MediaSession2.SessionCallback { + public MediaLibrarySessionCallback(Context context) { + super(context); + } + + /** + * Called to get the root information for browsing by a particular client. + * <p> + * The implementation should verify that the client package has permission + * to access browse media information before returning the root id; it + * should return null if the client is not allowed to access this + * information. + * + * @param controllerInfo information of the controller requesting access to browse media. + * @param rootHints An optional bundle of service-specific arguments to send + * to the media library service when connecting and retrieving the + * root id for browsing, or null if none. The contents of this + * bundle may affect the information returned when browsing. + * @return The {@link LibraryRoot} for accessing this app's content or null. + * @see LibraryRoot#EXTRA_RECENT + * @see LibraryRoot#EXTRA_OFFLINE + * @see LibraryRoot#EXTRA_SUGGESTED + */ + public @Nullable LibraryRoot onGetLibraryRoot(@NonNull ControllerInfo controllerInfo, + @Nullable Bundle rootHints) { + return null; + } + + /** + * Called to get an item. Return result here for the browser. + * <p> + * Return {@code null} for no result or error. + * + * @param mediaId item id to get media item. + * @return a media item. {@code null} for no result or error. + */ + public @Nullable MediaItem2 onGetItem(@NonNull ControllerInfo controllerInfo, + @NonNull String mediaId) { + return null; + } + + /** + * Called to get children of given parent id. Return the children here for the browser. + * <p> + * Return an empty list for no children, and return {@code null} for the error. + * + * @param parentId parent id to get children + * @param page number of page + * @param pageSize size of the page + * @param extras extra bundle + * @return list of children. Can be {@code null}. + */ + public @Nullable List<MediaItem2> onGetChildren(@NonNull ControllerInfo controller, + @NonNull String parentId, int page, int pageSize, @Nullable Bundle extras) { + return null; + } + + /** + * Called when a controller subscribes to the parent. + * <p> + * It's your responsibility to keep subscriptions by your own and call + * {@link MediaLibrarySession#notifyChildrenChanged(ControllerInfo, String, int, Bundle)} + * when the parent is changed. + * + * @param controller controller + * @param parentId parent id + * @param extras extra bundle + */ + public void onSubscribe(@NonNull ControllerInfo controller, @NonNull String parentId, + @Nullable Bundle extras) { + } + + /** + * Called when a controller unsubscribes to the parent. + * + * @param controller controller + * @param parentId parent id + */ + public void onUnsubscribe(@NonNull ControllerInfo controller, + @NonNull String parentId) { + } + + /** + * Called when a controller requests search. + * + * @param query The search query sent from the media browser. It contains keywords + * separated by space. + * @param extras The bundle of service-specific arguments sent from the media browser. + */ + public void onSearch(@NonNull ControllerInfo controllerInfo, @NonNull String query, + @Nullable Bundle extras) { + } + + /** + * Called to get the search result. Return search result here for the browser which has + * requested search previously. + * <p> + * Return an empty list for no search result, and return {@code null} for the error. + * + * @param controllerInfo Information of the controller requesting the search result. + * @param query The search query which was previously sent through + * {@link #onSearch(ControllerInfo, String, Bundle)} call. + * @param page page number. Starts from {@code 1}. + * @param pageSize page size. Should be greater or equal to {@code 1}. + * @param extras The bundle of service-specific arguments sent from the media browser. + * @return search result. {@code null} for error. + */ + public @Nullable List<MediaItem2> onGetSearchResult( + @NonNull ControllerInfo controllerInfo, @NonNull String query, int page, + int pageSize, @Nullable Bundle extras) { + return null; + } + } + + /** + * Builder for {@link MediaLibrarySession}. + */ + // Override all methods just to show them with the type instead of generics in Javadoc. + // This workarounds javadoc issue described in the MediaSession2.BuilderBase. + public static final class Builder extends BuilderBase<MediaLibrarySession, Builder, + MediaLibrarySessionCallback> { + // Builder requires MediaLibraryService2 instead of Context just to ensure that the + // builder can be only instantiated within the MediaLibraryService2. + // Ideally it's better to make it inner class of service to enforce, it violates API + // guideline that Builders should be the inner class of the building target. + public Builder(@NonNull MediaLibraryService2 service, + @NonNull MediaPlayerBase player, + @NonNull @CallbackExecutor Executor callbackExecutor, + @NonNull MediaLibrarySessionCallback callback) { + super((instance) -> ApiLoader.getProvider(service) + .createMediaLibraryService2Builder(service, (Builder) instance, player, + callbackExecutor, callback)); + } + + @Override + public Builder setVolumeProvider(@Nullable VolumeProvider2 volumeProvider) { + return super.setVolumeProvider(volumeProvider); + } + + @Override + public Builder setSessionActivity(@Nullable PendingIntent pi) { + return super.setSessionActivity(pi); + } + + @Override + public Builder setId(String id) { + return super.setId(id); + } + + @Override + public Builder setSessionCallback(@NonNull Executor executor, + @NonNull MediaLibrarySessionCallback callback) { + return super.setSessionCallback(executor, callback); + } + + @Override + public MediaLibrarySession build() { + return super.build(); + } + } + + /** * @hide */ - @SystemApi public MediaLibrarySession(MediaLibrarySessionProvider provider) { super(provider); mProvider = provider; @@ -87,12 +251,12 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * * @param controller controller to notify * @param parentId parent id with changes in its children - * @param childCount number of children. + * @param itemCount number of children. * @param extras extra information from session to controller */ public void notifyChildrenChanged(@NonNull ControllerInfo controller, - @NonNull String parentId, int childCount, @Nullable Bundle extras) { - mProvider.notifyChildrenChanged_impl(controller, parentId, childCount, extras); + @NonNull String parentId, int itemCount, @Nullable Bundle extras) { + mProvider.notifyChildrenChanged_impl(controller, parentId, itemCount, extras); } /** @@ -101,13 +265,13 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * {@link MediaBrowser2#subscribe(String, Bundle)}. * * @param parentId parent id - * @param childCount number of children + * @param itemCount number of children * @param extras extra information from session to controller */ // This is for the backward compatibility. - public void notifyChildrenChanged(@NonNull String parentId, int childCount, + public void notifyChildrenChanged(@NonNull String parentId, int itemCount, @Nullable Bundle extras) { - mProvider.notifyChildrenChanged_impl(parentId, childCount, extras); + mProvider.notifyChildrenChanged_impl(parentId, itemCount, extras); } /** @@ -124,166 +288,6 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { } } - /** - * Callback for the {@link MediaLibrarySession}. - */ - public static class MediaLibrarySessionCallback extends MediaSession2.SessionCallback { - - public MediaLibrarySessionCallback(Context context) { - super(context); - } - - /** - * Called to get the root information for browsing by a particular client. - * <p> - * The implementation should verify that the client package has permission - * to access browse media information before returning the root id; it - * should return null if the client is not allowed to access this - * information. - * - * @param controllerInfo information of the controller requesting access to browse media. - * @param rootHints An optional bundle of service-specific arguments to send - * to the media library service when connecting and retrieving the - * root id for browsing, or null if none. The contents of this - * bundle may affect the information returned when browsing. - * @return The {@link LibraryRoot} for accessing this app's content or null. - * @see LibraryRoot#EXTRA_RECENT - * @see LibraryRoot#EXTRA_OFFLINE - * @see LibraryRoot#EXTRA_SUGGESTED - */ - public @Nullable LibraryRoot onGetRoot(@NonNull ControllerInfo controllerInfo, - @Nullable Bundle rootHints) { - return null; - } - - /** - * Called to get an item. Return result here for the browser. - * <p> - * Return {@code null} for no result or error. - * - * @param itemId item id to get media item. - * @return a media item. {@code null} for no result or error. - */ - public @Nullable MediaItem2 onLoadItem(@NonNull ControllerInfo controllerInfo, - @NonNull String itemId) { - return null; - } - - /** - * Called to get children of given parent id. Return the children here for the browser. - * <p> - * Return an empty list for no children, and return {@code null} for the error. - * - * @param parentId parent id to get children - * @param page number of page - * @param pageSize size of the page - * @param extras extra bundle - * @return list of children. Can be {@code null}. - */ - public @Nullable List<MediaItem2> onLoadChildren(@NonNull ControllerInfo controller, - @NonNull String parentId, int page, int pageSize, @Nullable Bundle extras) { - return null; - } - - /** - * Called when a controller subscribed to the parent. - * <p> - * It's your responsibility to keep subscriptions by your own and call - * {@link MediaLibrarySession#notifyChildrenChanged(ControllerInfo, String, Bundle)} when - * the parent is changed. - * - * @param controller controller - * @param parentId parent id - * @param extras extra bundle - */ - public void onSubscribed(@NonNull ControllerInfo controller, @NonNull String parentId, - @Nullable Bundle extras) { - } - - /** - * Called when a controller unsubscribed to the parent. - * - * @param controller controller - * @param parentId parent id - */ - public void onUnsubscribed(@NonNull ControllerInfo controller, @NonNull String parentId) { - } - - /** - * Called when a controller requests search. - * - * @param query The search query sent from the media browser. It contains keywords separated - * by space. - * @param extras The bundle of service-specific arguments sent from the media browser. - */ - public void onSearch(@NonNull ControllerInfo controllerInfo, @NonNull String query, - @Nullable Bundle extras) { - } - - /** - * Called to get the search result. Return search result here for the browser which has - * requested search previously. - * <p> - * Return an empty list for no search result, and return {@code null} for the error. - * - * @param controllerInfo Information of the controller requesting the search result. - * @param query The search query which was previously sent through - * {@link #onSearch(ControllerInfo, String, Bundle)} call. - * @param page page number. Starts from {@code 1}. - * @param pageSize page size. Should be greater or equal to {@code 1}. - * @param extras The bundle of service-specific arguments sent from the media browser. - * @return search result. {@code null} for error. - */ - public @Nullable List<MediaItem2> onLoadSearchResult(@NonNull ControllerInfo controllerInfo, - @NonNull String query, int page, int pageSize, @Nullable Bundle extras) { - return null; - } - } - - /** - * Builder for {@link MediaLibrarySession}. - */ - // Override all methods just to show them with the type instead of generics in Javadoc. - // This workarounds javadoc issue described in the MediaSession2.BuilderBase. - public class MediaLibrarySessionBuilder extends BuilderBase<MediaLibrarySession, - MediaLibrarySessionBuilder, MediaLibrarySessionCallback> { - public MediaLibrarySessionBuilder( - @NonNull Context context, @NonNull MediaPlayerInterface player, - @NonNull @CallbackExecutor Executor callbackExecutor, - @NonNull MediaLibrarySessionCallback callback) { - super((instance) -> ApiLoader.getProvider(context).createMediaLibraryService2Builder( - context, (MediaLibrarySessionBuilder) instance, player, callbackExecutor, - callback)); - } - - @Override - public MediaLibrarySessionBuilder setVolumeProvider( - @Nullable VolumeProvider2 volumeProvider) { - return super.setVolumeProvider(volumeProvider); - } - - @Override - public MediaLibrarySessionBuilder setSessionActivity(@Nullable PendingIntent pi) { - return super.setSessionActivity(pi); - } - - @Override - public MediaLibrarySessionBuilder setId(String id) { - return super.setId(id); - } - - @Override - public MediaLibrarySessionBuilder setSessionCallback( - @NonNull Executor executor, @NonNull MediaLibrarySessionCallback callback) { - return super.setSessionCallback(executor, callback); - } - - @Override - public MediaLibrarySession build() { - return super.build(); - } - } - @Override MediaSessionService2Provider createProvider() { return ApiLoader.getProvider(this).createMediaLibraryService2(this); @@ -302,7 +306,7 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * * @param sessionId session id written in the AndroidManifest.xml. * @return a new library session - * @see MediaLibrarySessionBuilder + * @see Builder * @see #getSession() * @throws RuntimeException if returned session is invalid */ @@ -322,7 +326,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * supplied as a root hint for retrieving media items that are recently played. * If the media library service can provide such media items, the implementation must return * the key in the root hint when - * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back. + * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called + * back. * * <p>The root hint may contain multiple keys. * @@ -340,7 +345,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * internet connection. * If the media library service can provide such media items, the implementation must return * the key in the root hint when - * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back. + * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called + * back. * * <p>The root hint may contain multiple keys. * @@ -359,7 +365,8 @@ public abstract class MediaLibraryService2 extends MediaSessionService2 { * suggestion. * If the media library service can provide such media items, the implementation must return * the key in the root hint when - * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back. + * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called + * back. * * <p>The root hint may contain multiple keys. * diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java index fabf42bde3c1..b36383105cbc 100644 --- a/media/java/android/media/MediaMetadata2.java +++ b/media/java/android/media/MediaMetadata2.java @@ -19,7 +19,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.StringDef; -import android.annotation.SystemApi; import android.content.Context; import android.graphics.Bitmap; import android.media.update.ApiLoader; @@ -33,15 +32,13 @@ import java.util.Set; /** * Contains metadata about an item, such as the title, artist, etc. - * - * @hide */ +// New version of MediaMetadata with following changes +// - Don't implement Parcelable for updatable support. +// - Also support MediaDescription features. MediaDescription is deprecated instead because +// it was insufficient for controller to display media contents. +// TODO(jaewan): Add @see for APIs from MediaDescription public final class MediaMetadata2 { - // New version of MediaMetadata that no longer implements Parcelable but added from/toBundle() - // for updatable. - // MediaDescription is deprecated because it was insufficient for controller to display media - // contents. Added getExtra() here to support all the features from the MediaDescription. - /** * The title of the media. */ @@ -220,13 +217,25 @@ public final class MediaMetadata2 { /** * A Uri formatted String representing the content. This value is specific to the * service providing the content. It may be used with - * {@link MediaController2#playFromUri(String, Bundle)} + * {@link MediaController2#playFromUri(Uri, Bundle)} * to initiate playback when provided by a {@link MediaBrowser2} connected to * the same app. */ public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI"; /** + * The radio frequency in Float format if this metdata representing radio content. + */ + public static final String METADATA_KEY_RADIO_FREQUENCY = + "android.media.metadata.RADIO_FREQUENCY"; + + /** + * The radio callsign in String format if this metdata representing radio content. + */ + public static final String METADATA_KEY_RADIO_CALLSIGN = + "android.media.metadata.RADIO_CALLSIGN"; + + /** * The bluetooth folder type of the media specified in the section 6.10.2.2 of the Bluetooth * AVRCP 1.5. It should be one of the following: * <ul> @@ -327,9 +336,8 @@ public final class MediaMetadata2 { /** * A {@link Bundle} extra. - * @hide */ - public static final String METADATA_KEY_EXTRA = "android.media.metadata.EXTRA"; + public static final String METADATA_KEY_EXTRAS = "android.media.metadata.EXTRAS"; /** * @hide @@ -339,7 +347,7 @@ public final class MediaMetadata2 { METADATA_KEY_DATE, METADATA_KEY_GENRE, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_ART_URI, METADATA_KEY_ALBUM_ART_URI, METADATA_KEY_DISPLAY_TITLE, METADATA_KEY_DISPLAY_SUBTITLE, METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_KEY_DISPLAY_ICON_URI, - METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI}) + METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI, METADATA_KEY_RADIO_CALLSIGN}) @Retention(RetentionPolicy.SOURCE) public @interface TextKey {} @@ -366,12 +374,18 @@ public final class MediaMetadata2 { @Retention(RetentionPolicy.SOURCE) public @interface RatingKey {} + /** + * @hide + */ + @StringDef({METADATA_KEY_RADIO_FREQUENCY}) + @Retention(RetentionPolicy.SOURCE) + public @interface FloatKey {} + private final MediaMetadata2Provider mProvider; /** * @hide */ - @SystemApi public MediaMetadata2(MediaMetadata2Provider provider) { mProvider = provider; } @@ -399,9 +413,9 @@ public final class MediaMetadata2 { } /** - * Returns the value associated with the given key, or null if no mapping of - * the desired type exists for the given key or a null value is explicitly - * associated with the key. + * Returns the media id, or {@code null} if the id doesn't exist. + *<p> + * This is equivalent to the {@link #getString(String)} with the {@link #METADATA_KEY_MEDIA_ID}. * * @return media id. Can be {@code null} * @see #METADATA_KEY_MEDIA_ID @@ -459,12 +473,23 @@ public final class MediaMetadata2 { } /** + * Return the value associated with the given key, or 0.0f if no long exists + * for the given key. + * + * @param key The key the value is stored under + * @return a float value + */ + public float getFloat(@NonNull @FloatKey String key) { + return mProvider.getFloat_impl(key); + } + + /** * Get the extra {@link Bundle} from the metadata object. * * @return A {@link Bundle} or {@code null} */ - public @Nullable Bundle getExtra() { - return mProvider.getExtra_impl(); + public @Nullable Bundle getExtras() { + return mProvider.getExtras_impl(); } /** @@ -539,7 +564,6 @@ public final class MediaMetadata2 { /** * @hide */ - @SystemApi public Builder(@NonNull MediaMetadata2Provider.BuilderProvider provider) { mProvider = provider; } @@ -594,6 +618,7 @@ public final class MediaMetadata2 { * <li>{@link #METADATA_KEY_DISPLAY_SUBTITLE}</li> * <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li> * <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li> + * <li>{@link #METADATA_KEY_RADIO_CALLSIGN}</li> * </ul> * * @param key The key for referencing this value @@ -667,10 +692,29 @@ public final class MediaMetadata2 { } /** - * Set an extra {@link Bundle} into the metadata. + * Put a float value into the metadata. Custom keys may be used, but if + * the METADATA_KEYs defined in this class are used they may only be one + * of the following: + * <ul> + * <li>{@link #METADATA_KEY_RADIO_FREQUENCY}</li> + * </ul> + * + * @param key The key for referencing this value + * @param value The float value to store + * @return The Builder to allow chaining + */ + public @NonNull Builder putFloat(@NonNull @LongKey String key, float value) { + return mProvider.putFloat_impl(key, value); + } + + /** + * Set a bundle of extras. + * + * @param extras The extras to include with this description or null. + * @return The Builder to allow chaining */ - public @NonNull Builder setExtra(@Nullable Bundle bundle) { - return mProvider.setExtra_impl(bundle); + public Builder setExtras(@Nullable Bundle extras) { + return mProvider.setExtras_impl(extras); } /** diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java index 02c71b283b21..205ce8d512e5 100644 --- a/media/java/android/media/MediaMuxer.java +++ b/media/java/android/media/MediaMuxer.java @@ -328,6 +328,7 @@ final public class MediaMuxer { RandomAccessFile file = null; try { file = new RandomAccessFile(path, "rws"); + file.setLength(0); FileDescriptor fd = file.getFD(); setUpMediaMuxer(fd, format); } finally { diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java index 2f3d972ae6e2..144666003508 100644 --- a/media/java/android/media/MediaPlayer2.java +++ b/media/java/android/media/MediaPlayer2.java @@ -1223,7 +1223,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener * * @return the current position in milliseconds */ - public abstract int getCurrentPosition(); + public abstract long getCurrentPosition(); /** * Gets the duration of the file. @@ -1231,7 +1231,7 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener * @return the duration in milliseconds, if no duration is available * (for example, if streaming live content), -1 is returned. */ - public abstract int getDuration(); + public abstract long getDuration(); /** * Gets the media metadata. @@ -1278,27 +1278,6 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener } /** - * Set the MediaPlayer2 to start when this MediaPlayer2 finishes playback - * (i.e. reaches the end of the stream). - * The media framework will attempt to transition from this player to - * the next as seamlessly as possible. The next player can be set at - * any time before completion, but shall be after setDataSource has been - * called successfully. The next player must be prepared by the - * app, and the application should not call play() on it. - * The next MediaPlayer2 must be different from 'this'. An exception - * will be thrown if next == this. - * The application may call setNextMediaPlayer(null) to indicate no - * next player should be started at the end of playback. - * If the current player is looping, it will keep looping and the next - * player will not be started. - * - * @param next the player to start after this one completes playback. - * - * @hide - */ - public void setNextMediaPlayer(MediaPlayer2 next) { } - - /** * Resets the MediaPlayer2 to its uninitialized state. After calling * this method, you will have to initialize it again by setting the * data source and calling prepareAsync(). @@ -1326,6 +1305,13 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener public abstract void setAudioAttributes(AudioAttributes attributes); /** + * Gets the audio attributes for this MediaPlayer2. + * @return attributes a set of audio attributes + * @throws IllegalArgumentException if the attributes are null or invalid. + */ + public abstract AudioAttributes getAudioAttributes(); + + /** * Sets the player to be looping or non-looping. * * @param looping whether to loop or not @@ -2029,8 +2015,9 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener * Called to give the app the opportunity to configure DRM before the session is created * * @param mp the {@code MediaPlayer2} associated with this callback + * @param srcId the Id of this data source */ - public void onDrmConfig(MediaPlayer2 mp); + public void onDrmConfig(MediaPlayer2 mp, long srcId); } /** @@ -2051,24 +2038,25 @@ public abstract class MediaPlayer2 implements SubtitleController.Listener /** * Called to indicate DRM info is available * - * @param mp the {@code MediaPlayer2} associated with this callback - * @param drmInfo DRM info of the source including PSSH, and subset - * of crypto schemes supported by this device + * @param mp the {@code MediaPlayer2} associated with this callback + * @param srcId the Id of this data source + * @param drmInfo DRM info of the source including PSSH, and subset + * of crypto schemes supported by this device */ - public void onDrmInfo(MediaPlayer2 mp, DrmInfo drmInfo) { } + public void onDrmInfo(MediaPlayer2 mp, long srcId, DrmInfo drmInfo) { } /** * Called to notify the client that {@code prepareDrm} is finished and ready for key request/response. * - * @param mp the {@code MediaPlayer2} associated with this callback - * @param status the result of DRM preparation which can be + * @param mp the {@code MediaPlayer2} associated with this callback + * @param srcId the Id of this data source + * @param status the result of DRM preparation which can be * {@link #PREPARE_DRM_STATUS_SUCCESS}, * {@link #PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR}, * {@link #PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR}, or * {@link #PREPARE_DRM_STATUS_PREPARATION_ERROR}. */ - public void onDrmPrepared(MediaPlayer2 mp, @PrepareDrmStatusCode int status) { } - + public void onDrmPrepared(MediaPlayer2 mp, long srcId, @PrepareDrmStatusCode int status) { } } /** diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index 1b21b5bc2afd..7794e08f074c 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -1889,7 +1889,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { * @return the current position in milliseconds */ @Override - public native int getCurrentPosition(); + public native long getCurrentPosition(); /** * Gets the duration of the file. @@ -1898,7 +1898,7 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { * (for example, if streaming live content), -1 is returned. */ @Override - public native int getDuration(); + public native long getDuration(); /** * Gets the media metadata. @@ -1986,28 +1986,6 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { } /** - * Set the MediaPlayer2 to start when this MediaPlayer2 finishes playback - * (i.e. reaches the end of the stream). - * The media framework will attempt to transition from this player to - * the next as seamlessly as possible. The next player can be set at - * any time before completion, but shall be after setDataSource has been - * called successfully. The next player must be prepared by the - * app, and the application should not call play() on it. - * The next MediaPlayer2 must be different from 'this'. An exception - * will be thrown if next == this. - * The application may call setNextMediaPlayer(null) to indicate no - * next player should be started at the end of playback. - * If the current player is looping, it will keep looping and the next - * player will not be started. - * - * @param next the player to start after this one completes playback. - * - * @hide - */ - @Override - public native void setNextMediaPlayer(MediaPlayer2 next); - - /** * Resets the MediaPlayer2 to its uninitialized state. After calling * this method, you will have to initialize it again by setting the * data source and calling prepareAsync(). @@ -2078,10 +2056,11 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { * @param key key indicates the parameter to be set. * @param value value of the parameter to be set. * @return true if the parameter is set successfully, false otherwise - * {@hide} */ private native boolean setParameter(int key, Parcel value); + private native Parcel getParameter(int key); + /** * Sets the audio attributes for this MediaPlayer2. * See {@link AudioAttributes} for how to build and configure an instance of this class. @@ -2105,6 +2084,14 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { pattributes.recycle(); } + @Override + public AudioAttributes getAudioAttributes() { + Parcel pattributes = getParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES); + AudioAttributes attributes = AudioAttributes.CREATOR.createFromParcel(pattributes); + pattributes.recycle(); + return attributes; + } + /** * Sets the player to be looping or non-looping. * @@ -3211,11 +3198,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { } // notifying the client outside the lock + // TODO: get srcId if (drmInfo != null) { synchronized (mEventCbLock) { for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) { cb.first.execute(() -> cb.second.onDrmInfo( - mMediaPlayer, drmInfo)); + mMediaPlayer, 0, drmInfo)); } } } @@ -3747,8 +3735,9 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { // call the callback outside the lock + // TODO: get srcId if (mOnDrmConfigHelper != null) { - mOnDrmConfigHelper.onDrmConfig(this); + mOnDrmConfigHelper.onDrmConfig(this, 0); } synchronized (mDrmLock) { @@ -3818,11 +3807,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { // if finished successfully without provisioning, call the callback outside the lock + // TODO: get srcId if (allDoneWithoutProvisioning) { synchronized (mDrmEventCbLock) { for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) { cb.first.execute(() -> cb.second.onDrmPrepared( - this, PREPARE_DRM_STATUS_SUCCESS)); + this, 0, PREPARE_DRM_STATUS_SUCCESS)); } } } @@ -4488,9 +4478,10 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { } // synchronized // calling the callback outside the lock + // TODO: get srcId synchronized (mDrmEventCbLock) { for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) { - cb.first.execute(() -> cb.second.onDrmPrepared(mediaPlayer, status)); + cb.first.execute(() -> cb.second.onDrmPrepared(mediaPlayer, 0, status)); } } } else { // blocking mode already has the lock diff --git a/media/java/android/media/MediaPlayerBase.java b/media/java/android/media/MediaPlayerBase.java new file mode 100644 index 000000000000..318136267cbf --- /dev/null +++ b/media/java/android/media/MediaPlayerBase.java @@ -0,0 +1,247 @@ +/* + * Copyright 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.media; + +import android.annotation.CallbackExecutor; +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.media.MediaSession2.PlaylistParams; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.List; +import java.util.concurrent.Executor; + +/** + * Base class for all media players that want media session. + */ +public abstract class MediaPlayerBase implements AutoCloseable { + /** + * @hide + */ + @IntDef({STATE_IDLE, STATE_PAUSED, STATE_PLAYING, STATE_ERROR}) + @Retention(RetentionPolicy.SOURCE) + public @interface State {} + + /** + * State when the player is idle, and needs configuration to start playback. + */ + public static final int STATE_IDLE = 0; + + /** + * State when the player's playback is paused + */ + public static final int STATE_PAUSED = 0; + + /** + * State when the player's playback is ongoing + */ + public static final int STATE_PLAYING = 0; + + /** + * State when the player is in error state and cannot be recovered self. + */ + public static final int STATE_ERROR = 0; + + /** + * Unspecified media player error. + * @hide + */ + public static final int MEDIA_ERROR_UNKNOWN = MediaPlayer2.MEDIA_ERROR_UNKNOWN; + + /** + * The video is streamed and its container is not valid for progressive + * playback i.e the video's index (e.g moov atom) is not at the start of the + * file. + * @hide + */ + public static final int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = + MediaPlayer2.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK; + + /** + * File or network related operation errors. + * @hide + */ + public static final int MEDIA_ERROR_IO = MediaPlayer2.MEDIA_ERROR_IO; + + /** + * Bitstream is not conforming to the related coding standard or file spec. + * @hide + */ + public static final int MEDIA_ERROR_MALFORMED = MediaPlayer2.MEDIA_ERROR_MALFORMED; + + /** + * Bitstream is conforming to the related coding standard or file spec, but + * the media framework does not support the feature. + * @hide + */ + public static final int MEDIA_ERROR_UNSUPPORTED = MediaPlayer2.MEDIA_ERROR_UNSUPPORTED; + + /** + * Some operation takes too long to complete, usually more than 3-5 seconds. + * @hide + */ + public static final int MEDIA_ERROR_TIMED_OUT = MediaPlayer2.MEDIA_ERROR_TIMED_OUT; + + /** + * Callbacks to listens to the changes in {@link PlaybackState2} and error. + * @hide + */ + public static abstract class EventCallback { + /** + * Called when {@link PlaybackState2} for this player is changed. + */ + public void onPlaybackStateChanged(PlaybackState2 state) { } + + /** + * Called to indicate an error. + * + * @param mediaId optional mediaId to indicate error + * @param what what + * @param extra + */ + public void onError(@Nullable String mediaId, int what, int extra) { } + } + + // Transport controls that session will send command directly to this player. + /** + * Start or resumes playback + */ + public abstract void play(); + + /** + * @hide + */ + public abstract void prepare(); + + /** + * Pause playback + */ + public abstract void pause(); + + /** + * @hide + */ + public abstract void stop(); + + /** + * @hide + */ + public abstract void skipToPrevious(); + + /** + * @hide + */ + public abstract void skipToNext(); + + /** + * @hide + */ + public abstract void seekTo(long pos); + + /** + * @hide + */ + public abstract void fastForward(); + + /** + * @hide + */ + public abstract void rewind(); + + /** + * @hide + */ + public abstract PlaybackState2 getPlaybackState(); + + /** + * Return player state. + * + * @return player state + * @see #STATE_IDLE + * @see #STATE_PLAYING + * @see #STATE_PAUSED + * @see #STATE_ERROR + */ + public abstract @State int getPlayerState(); + + /** + * Sets the {@link AudioAttributes} to be used during the playback of the media. + * + * @param attributes non-null <code>AudioAttributes</code>. + */ + public abstract void setAudioAttributes(@NonNull AudioAttributes attributes); + + /** + * Returns AudioAttributes that media player has. + */ + public abstract @Nullable AudioAttributes getAudioAttributes(); + + /** + * @hide + */ + public abstract void addPlaylistItem(int index, MediaItem2 item); + + /** + * @hide + */ + public abstract void removePlaylistItem(MediaItem2 item); + + /** + * @hide + */ + public abstract void setPlaylist(List<MediaItem2> playlist); + + /** + * @hide + */ + public abstract List<MediaItem2> getPlaylist(); + + /** + * @hide + */ + public abstract void setCurrentPlaylistItem(MediaItem2 item); + + /** + * @hide + */ + public abstract void setPlaylistParams(PlaylistParams params); + + /** + * @hide + */ + public abstract PlaylistParams getPlaylistParams(); + + /** + * Register a {@link EventCallback}. + * + * @param executor a callback executor + * @param callback a EventCallback + * @hide + */ + public abstract void registerEventCallback(@NonNull @CallbackExecutor Executor executor, + @NonNull EventCallback callback); + + /** + * Unregister previously registered {@link EventCallback}. + * + * @param callback a EventCallback + * @hide + */ + public abstract void unregisterEventCallback(@NonNull EventCallback callback); +} diff --git a/media/java/android/media/MediaPlayerInterface.java b/media/java/android/media/MediaPlayerInterface.java deleted file mode 100644 index b81c3d61534c..000000000000 --- a/media/java/android/media/MediaPlayerInterface.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 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.media; - -import android.annotation.CallbackExecutor; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.media.MediaSession2.PlaylistParams; - -import java.util.List; -import java.util.concurrent.Executor; - -/** - * Base interfaces for all media players that want media session. - * @hide - */ -public interface MediaPlayerInterface { - /** - * Unspecified media player error. - */ - int MEDIA_ERROR_UNKNOWN = MediaPlayer2.MEDIA_ERROR_UNKNOWN; - - /** - * The video is streamed and its container is not valid for progressive - * playback i.e the video's index (e.g moov atom) is not at the start of the - * file. - */ - int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK = - MediaPlayer2.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK; - - /** - * File or network related operation errors. - */ - int MEDIA_ERROR_IO = MediaPlayer2.MEDIA_ERROR_IO; - - /** - * Bitstream is not conforming to the related coding standard or file spec. - */ - int MEDIA_ERROR_MALFORMED = MediaPlayer2.MEDIA_ERROR_MALFORMED; - - /** - * Bitstream is conforming to the related coding standard or file spec, but - * the media framework does not support the feature. - */ - int MEDIA_ERROR_UNSUPPORTED = MediaPlayer2.MEDIA_ERROR_UNSUPPORTED; - - /** - * Some operation takes too long to complete, usually more than 3-5 seconds. - */ - int MEDIA_ERROR_TIMED_OUT = MediaPlayer2.MEDIA_ERROR_TIMED_OUT; - - /** - * Callbacks to listens to the changes in {@link PlaybackState2} and error. - */ - interface EventCallback { - /** - * Called when {@link PlaybackState2} for this player is changed. - */ - default void onPlaybackStateChanged(PlaybackState2 state) { } - - /** - * Called to indicate an error. - * - * @param mediaId optional mediaId to indicate error - * @param what what - * @param extra - */ - default void onError(@Nullable String mediaId, int what, int extra) { } - } - - // Transport controls that session will send command directly to this player. - void play(); - void prepare(); - void pause(); - void stop(); - void skipToPrevious(); - void skipToNext(); - void seekTo(long pos); - void fastForward(); - void rewind(); - - PlaybackState2 getPlaybackState(); - - /** - * Sets the {@link AudioAttributes} to be used during the playback of the media. - * - * @param attributes non-null <code>AudioAttributes</code>. - */ - void setAudioAttributes(@NonNull AudioAttributes attributes); - - /** - * Returns AudioAttributes that media player has. - */ - @Nullable - AudioAttributes getAudioAttributes(); - - void addPlaylistItem(int index, MediaItem2 item); - void removePlaylistItem(MediaItem2 item); - - void setPlaylist(List<MediaItem2> playlist); - List<MediaItem2> getPlaylist(); - - void setCurrentPlaylistItem(int index); - void setPlaylistParams(PlaylistParams params); - PlaylistParams getPlaylistParams(); - - /** - * Register a {@link EventCallback}. - * - * @param executor a callback executor - * @param callback a EventCallback - */ - void registerEventCallback(@NonNull @CallbackExecutor Executor executor, - @NonNull EventCallback callback); - - /** - * Unregister previously registered {@link EventCallback}. - * - * @param callback a EventCallback - */ - void unregisterEventCallback(@NonNull EventCallback callback); -} diff --git a/media/java/android/media/MediaPlaylistController.java b/media/java/android/media/MediaPlaylistController.java new file mode 100644 index 000000000000..916c12af7a29 --- /dev/null +++ b/media/java/android/media/MediaPlaylistController.java @@ -0,0 +1,41 @@ +/* + * Copyright 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.media; + +import android.annotation.NonNull; + +import java.util.List; + +/** + * Controller interfaces for playlist management for both {@link MediaSession2} and + * {@link MediaController2} that related with metadata. This ensures that two classes share the same + * interface. + * <p> + * This class only includes methods that involves {@link MediaItem2}. Because other APIs are + * considered as the part of {@link MediaPlayerBase} (e.g. set/getPlaylistParams()}. Note that + * setPlaylist() isn't added on purpose because it's considered as session specific. + * + * @hide + */ +public interface MediaPlaylistController { + // TODO(jaewan): is Index correct here? + void addPlaylistItem(int index, @NonNull MediaItem2 item); + void removePlaylistItem(@NonNull MediaItem2 item); + MediaItem2 getCurrentPlaylistItem(); + void skipToPlaylistItem(@NonNull MediaItem2 item); + List<MediaItem2> getPlaylist(); +} diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 9ad5cd93e1e2..90b6bff63874 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -29,6 +29,7 @@ import android.os.PersistableBundle; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import android.view.Surface; import java.io.File; @@ -105,6 +106,8 @@ public class MediaRecorder implements AudioRouting private OnErrorListener mOnErrorListener; private OnInfoListener mOnInfoListener; + private int mChannelCount; + /** * Default constructor. */ @@ -119,6 +122,7 @@ public class MediaRecorder implements AudioRouting mEventHandler = null; } + mChannelCount = 1; String packageName = ActivityThread.currentPackageName(); /* Native setup requires a weak reference to our object. * It's easier to create it here than in C++. @@ -755,6 +759,7 @@ public class MediaRecorder implements AudioRouting if (numChannels <= 0) { throw new IllegalArgumentException("Number of channels is not positive"); } + mChannelCount = numChannels; setParameter("audio-param-number-of-channels=" + numChannels); } @@ -1432,6 +1437,20 @@ public class MediaRecorder implements AudioRouting return new ArrayList<MicrophoneInfo>(); } AudioManager.setPortIdForMicrophones(activeMicrophones); + + // Use routed device when there is not information returned by hal. + if (activeMicrophones.size() == 0) { + AudioDeviceInfo device = getRoutedDevice(); + if (device != null) { + MicrophoneInfo microphone = AudioManager.microphoneInfoFromAudioDeviceInfo(device); + ArrayList<Pair<Integer, Integer>> channelMapping = new ArrayList<>(); + for (int i = 0; i < mChannelCount; i++) { + channelMapping.add(new Pair(i, MicrophoneInfo.CHANNEL_MAPPING_DIRECT)); + } + microphone.setChannelMapping(channelMapping); + activeMicrophones.add(microphone); + } + } return activeMicrophones; } diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java index 63e4e65372a8..54b1f0eef773 100644 --- a/media/java/android/media/MediaSession2.java +++ b/media/java/android/media/MediaSession2.java @@ -20,11 +20,10 @@ import android.annotation.CallbackExecutor; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; -import android.media.MediaPlayerInterface.EventCallback; +import android.media.MediaPlayerBase.EventCallback; import android.media.session.MediaSession; import android.media.session.MediaSession.Callback; import android.media.session.PlaybackState; @@ -70,7 +69,7 @@ import java.util.concurrent.Executor; * <p> * When a session receive transport control commands, the session sends the commands directly to * the the underlying media player set by {@link Builder} or - * {@link #setPlayer(MediaPlayerInterface)}. + * {@link #setPlayer(MediaPlayerBase)}. * <p> * When an app is finished performing playback it must call {@link #close()} to clean up the session * and notify any controllers. @@ -78,9 +77,8 @@ import java.util.concurrent.Executor; * {@link MediaSession2} objects should be used on the thread on the looper. * * @see MediaSessionService2 - * @hide */ -public class MediaSession2 implements AutoCloseable { +public class MediaSession2 implements AutoCloseable, MediaPlaylistController { private final MediaSession2Provider mProvider; // TODO(jaewan): Should we define IntDef? Currently we don't have to allow subclass to add more. @@ -143,7 +141,7 @@ public class MediaSession2 implements AutoCloseable { public static final int COMMAND_CODE_PLAYBACK_PREPARE = 6; /** - * Command code for {@link MediaController2#fastForward()} ()}. + * Command code for {@link MediaController2#fastForward()}. * <p> * This is transport control command. Command would be sent directly to the player if the * session doesn't reject the request through the @@ -160,14 +158,14 @@ public class MediaSession2 implements AutoCloseable { public static final int COMMAND_CODE_PLAYBACK_REWIND = 8; /** - * Command code for {@link MediaController2#seekTo(long)} ()}. + * Command code for {@link MediaController2#seekTo(long)}. * <p> * Command would be sent directly to the player if the session doesn't reject the request * through the {@link SessionCallback#onCommandRequest(ControllerInfo, Command)}. */ public static final int COMMAND_CODE_PLAYBACK_SEEK_TO = 9; /** - * Command code for {@link MediaController2#setCurrentPlaylistItem(int)} ()}. + * Command code for {@link MediaController2#skipToPlaylistItem(MediaItem2)}. * <p> * Command would be sent directly to the player if the session doesn't reject the request * through the {@link SessionCallback#onCommandRequest(ControllerInfo, Command)}. @@ -222,7 +220,7 @@ public class MediaSession2 implements AutoCloseable { public static final int COMMAND_CODE_PLAY_FROM_MEDIA_ID = 16; /** - * Command code for {@link MediaController2#playFromUri(String, Bundle)}. + * Command code for {@link MediaController2#playFromUri(Uri, Bundle)}. */ public static final int COMMAND_CODE_PLAY_FROM_URI = 17; @@ -256,6 +254,84 @@ public class MediaSession2 implements AutoCloseable { public static final int COMMAND_CODE_BROWSER = 22; /** + * @hide + */ + @IntDef({ERROR_CODE_UNKNOWN_ERROR, ERROR_CODE_APP_ERROR, ERROR_CODE_NOT_SUPPORTED, + ERROR_CODE_AUTHENTICATION_EXPIRED, ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED, + ERROR_CODE_CONCURRENT_STREAM_LIMIT, ERROR_CODE_PARENTAL_CONTROL_RESTRICTED, + ERROR_CODE_NOT_AVAILABLE_IN_REGION, ERROR_CODE_CONTENT_ALREADY_PLAYING, + ERROR_CODE_SKIP_LIMIT_REACHED, ERROR_CODE_ACTION_ABORTED, ERROR_CODE_END_OF_QUEUE, + ERROR_CODE_SETUP_REQUIRED}) + @Retention(RetentionPolicy.SOURCE) + public @interface ErrorCode {} + + /** + * This is the default error code and indicates that none of the other error codes applies. + */ + public static final int ERROR_CODE_UNKNOWN_ERROR = 0; + + /** + * Error code when the application state is invalid to fulfill the request. + */ + public static final int ERROR_CODE_APP_ERROR = 1; + + /** + * Error code when the request is not supported by the application. + */ + public static final int ERROR_CODE_NOT_SUPPORTED = 2; + + /** + * Error code when the request cannot be performed because authentication has expired. + */ + public static final int ERROR_CODE_AUTHENTICATION_EXPIRED = 3; + + /** + * Error code when a premium account is required for the request to succeed. + */ + public static final int ERROR_CODE_PREMIUM_ACCOUNT_REQUIRED = 4; + + /** + * Error code when too many concurrent streams are detected. + */ + public static final int ERROR_CODE_CONCURRENT_STREAM_LIMIT = 5; + + /** + * Error code when the content is blocked due to parental controls. + */ + public static final int ERROR_CODE_PARENTAL_CONTROL_RESTRICTED = 6; + + /** + * Error code when the content is blocked due to being regionally unavailable. + */ + public static final int ERROR_CODE_NOT_AVAILABLE_IN_REGION = 7; + + /** + * Error code when the requested content is already playing. + */ + public static final int ERROR_CODE_CONTENT_ALREADY_PLAYING = 8; + + /** + * Error code when the application cannot skip any more songs because skip limit is reached. + */ + public static final int ERROR_CODE_SKIP_LIMIT_REACHED = 9; + + /** + * Error code when the action is interrupted due to some external event. + */ + public static final int ERROR_CODE_ACTION_ABORTED = 10; + + /** + * Error code when the playback navigation (previous, next) is not possible because the queue + * was exhausted. + */ + public static final int ERROR_CODE_END_OF_QUEUE = 11; + + /** + * Error code when the session needs user's manual intervention. + */ + public static final int ERROR_CODE_SETUP_REQUIRED = 12; + + /** * Define a command that a {@link MediaController2} can send to a {@link MediaSession2}. * <p> * If {@link #getCommandCode()} isn't {@link #COMMAND_CODE_CUSTOM}), it's predefined command. @@ -324,7 +400,7 @@ public class MediaSession2 implements AutoCloseable { /** * Represent set of {@link Command}. */ - public static class CommandGroup { + public static final class CommandGroup { private final CommandGroupProvider mProvider; public CommandGroup(Context context) { @@ -360,7 +436,6 @@ public class MediaSession2 implements AutoCloseable { /** * @hide */ - @SystemApi public CommandGroupProvider getProvider() { return mProvider; } @@ -390,7 +465,7 @@ public class MediaSession2 implements AutoCloseable { * default. */ // TODO(jaewan): Can we move this inside of the updatable for default implementation. - public static class SessionCallback { + public static abstract class SessionCallback { private final Context mContext; public SessionCallback(Context context) { @@ -587,7 +662,7 @@ public class MediaSession2 implements AutoCloseable { /** * Base builder class for MediaSession2 and its subclass. Any change in this class should be * also applied to the subclasses {@link MediaSession2.Builder} and - * {@link MediaLibraryService2.MediaLibrarySessionBuilder}. + * {@link MediaLibraryService2.MediaLibrarySession.Builder}. * <p> * APIs here should be package private, but should have documentations for developers. * Otherwise, javadoc will generate documentation with the generic types such as follows. @@ -684,7 +759,7 @@ public class MediaSession2 implements AutoCloseable { // Override all methods just to show them with the type instead of generics in Javadoc. // This workarounds javadoc issue described in the MediaSession2.BuilderBase. public static final class Builder extends BuilderBase<MediaSession2, Builder, SessionCallback> { - public Builder(Context context, @NonNull MediaPlayerInterface player) { + public Builder(Context context, @NonNull MediaPlayerBase player) { super((instance) -> ApiLoader.getProvider(context).createMediaSession2Builder( context, (Builder) instance, player)); } @@ -725,7 +800,6 @@ public class MediaSession2 implements AutoCloseable { /** * @hide */ - // TODO(jaewan): SystemApi // TODO(jaewan): Also accept componentName to check notificaiton listener. public ControllerInfo(Context context, int uid, int pid, String packageName, IInterface callback) { @@ -762,7 +836,6 @@ public class MediaSession2 implements AutoCloseable { /** * @hide */ - @SystemApi public ControllerInfoProvider getProvider() { return mProvider; } @@ -794,13 +867,12 @@ public class MediaSession2 implements AutoCloseable { * <p> * It's up to the controller's decision to respect or ignore this customization request. */ - public static class CommandButton { + public static final class CommandButton { private final CommandButtonProvider mProvider; /** * @hide */ - @SystemApi public CommandButton(CommandButtonProvider provider) { mProvider = provider; } @@ -856,7 +928,6 @@ public class MediaSession2 implements AutoCloseable { /** * @hide */ - @SystemApi public CommandButtonProvider getProvider() { return mProvider; } @@ -864,7 +935,7 @@ public class MediaSession2 implements AutoCloseable { /** * Builder for {@link CommandButton}. */ - public static class Builder { + public static final class Builder { private final CommandButtonProvider.BuilderProvider mProvider; public Builder(@NonNull Context context) { @@ -1038,7 +1109,6 @@ public class MediaSession2 implements AutoCloseable { * framework had to add heuristics to figure out if an app is * @hide */ - @SystemApi public MediaSession2(MediaSession2Provider provider) { super(); mProvider = provider; @@ -1047,39 +1117,34 @@ public class MediaSession2 implements AutoCloseable { /** * @hide */ - @SystemApi public MediaSession2Provider getProvider() { return mProvider; } /** - * Set the underlying {@link MediaPlayerInterface} for this session to dispatch incoming event + * Set the underlying {@link MediaPlayerBase} for this session to dispatch incoming event * to. Events from the {@link MediaController2} will be sent directly to the underlying * player on the {@link Handler} where the session is created on. * <p> - * If the new player is successfully set, - * {@link EventCallback#onPlaybackStateChanged(PlaybackState2)} will be called to tell the - * current playback state of the new player. - * <p> * For the remote playback case which you want to handle volume by yourself, use - * {@link #setPlayer(MediaPlayerInterface, VolumeProvider2)}. + * {@link #setPlayer(MediaPlayerBase, VolumeProvider2)}. * - * @param player a {@link MediaPlayerInterface} that handles actual media playback in your app. + * @param player a {@link MediaPlayerBase} that handles actual media playback in your app. * @throws IllegalArgumentException if the player is {@code null}. */ - public void setPlayer(@NonNull MediaPlayerInterface player) { + public void setPlayer(@NonNull MediaPlayerBase player) { mProvider.setPlayer_impl(player); } /** - * Set the underlying {@link MediaPlayerInterface} with the volume provider for remote playback. + * Set the underlying {@link MediaPlayerBase} with the volume provider for remote playback. * - * @param player a {@link MediaPlayerInterface} that handles actual media playback in your app. + * @param player a {@link MediaPlayerBase} that handles actual media playback in your app. * @param volumeProvider a volume provider - * @see #setPlayer(MediaPlayerInterface) + * @see #setPlayer(MediaPlayerBase) * @see Builder#setVolumeProvider(VolumeProvider2) */ - public void setPlayer(@NonNull MediaPlayerInterface player, + public void setPlayer(@NonNull MediaPlayerBase player, @NonNull VolumeProvider2 volumeProvider) { mProvider.setPlayer_impl(player, volumeProvider); } @@ -1093,7 +1158,7 @@ public class MediaSession2 implements AutoCloseable { * @return player */ public @Nullable - MediaPlayerInterface getPlayer() { + MediaPlayerBase getPlayer() { return mProvider.getPlayer_impl(); } @@ -1123,7 +1188,9 @@ public class MediaSession2 implements AutoCloseable { * @param focusGain the type of audio focus gain that will be requested, or * {@link AudioManager#AUDIOFOCUS_NONE} to disable the use audio focus during * playback. + * @hide */ + // TODO(jaewan): Revisit public void setAudioFocusRequest(int focusGain) { mProvider.setAudioFocusRequest_impl(focusGain); } @@ -1164,14 +1231,6 @@ public class MediaSession2 implements AutoCloseable { } /** - * Notify changes in metadata of previously set playlist. Controller will get the whole set of - * playlist again. - */ - public void notifyMetadataChanged() { - mProvider.notifyMetadataChanged_impl(); - } - - /** * Send custom command to all connected controllers. * * @param command a command @@ -1264,14 +1323,14 @@ public class MediaSession2 implements AutoCloseable { } /** - * Sets the index of current DataSourceDesc in the play list to be played. + * Skip to the item in the play list. * - * @param index the index of DataSourceDesc in the play list you want to play + * @param item item in the play list you want to play * @throws IllegalArgumentException if the play list is null * @throws NullPointerException if index is outside play list range */ - public void setCurrentPlaylistItem(int index) { - mProvider.setCurrentPlaylistItem_impl(index); + public void skipToPlaylistItem(MediaItem2 item) { + mProvider.skipToPlaylistItem_impl(item); } /** @@ -1289,7 +1348,7 @@ public class MediaSession2 implements AutoCloseable { } /** - * Sets a list of {@link MediaItem2} as the current play list. + * Set a list of {@link MediaItem2} as the current play list. * * @param playlist A list of {@link MediaItem2} objects to set as a play list. * @throws IllegalArgumentException if given {@param playlist} is null. @@ -1299,13 +1358,68 @@ public class MediaSession2 implements AutoCloseable { } /** - * Returns the playlist which is lastly set. + * Remove the media item at index in the play list. + * <p> + * If index is same as the current index of the playlist, current playback + * will be stopped and playback moves to next source in the list. + * + * @throws IllegalArgumentException if the play list is null + */ + // TODO(jaewan): Remove with index was previously rejected by council (b/36524925) + // TODO(jaewan): Should we also add movePlaylistItem from index to index? + public void removePlaylistItem(MediaItem2 item) { + mProvider.removePlaylistItem_impl(item); + } + + /** + * Add the media item to the play list at position index. + * <p> + * This will not change the currently playing media item. + * If index is less than or equal to the current index of the play list, + * the current index of the play list will be incremented correspondingly. + * + * @param index the index you want to add + * @param item the media item you want to add + * @throws IndexOutOfBoundsException if index is outside play list range + */ + @Override + public void addPlaylistItem(int index, @NonNull MediaItem2 item) { + mProvider.addPlaylistItem_impl(index, item); + } + + /** + * Edit the media item to the play list at position index. This is expected to be called when + * the metadata information is updated. + * <p> + * This will not change the currently playing media item. + * + * @param item the media item you want to add to the play list */ + public void editPlaylistItem(@NonNull MediaItem2 item) { + mProvider.editPlaylistItem_impl(item); + } + + /** + * Return the playlist which is lastly set. + * + * @return playlist + */ + @Override public List<MediaItem2> getPlaylist() { return mProvider.getPlaylist_impl(); } /** + * Return currently playing media item. + * + * @return currently playing media item + */ + @Override + public MediaItem2 getCurrentPlaylistItem() { + return mProvider.getCurrentPlaylistItem_impl(); + } + + /** * Sets the {@link PlaylistParams} for the current play list. Repeat/shuffle mode and metadata * for the list can be set by calling this method. * @@ -1324,16 +1438,28 @@ public class MediaSession2 implements AutoCloseable { return mProvider.getPlaylistParams_impl(); } - /* + /** + * Notify errors to the connected controllers + * + * @param errorCode error code + * @param extra extra + */ + public void notifyError(@ErrorCode int errorCode, int extra) { + mProvider.notifyError_impl(errorCode, extra); + } + + /** * Register {@link EventCallback} to listen changes in the underlying - * {@link MediaPlayerInterface}, regardless of the change in the underlying player. + * {@link MediaPlayerBase}, regardless of the change in the underlying player. * <p> * Registered callbacks will be also called when the underlying player is changed. * * @param executor a callback Executor * @param callback a EventCallback * @throws IllegalArgumentException if executor or callback is {@code null}. + * @hide */ + // TODO(jaewan): Unhide or remove public void registerPlayerEventCallback(@NonNull @CallbackExecutor Executor executor, @NonNull EventCallback callback) { mProvider.registerPlayerEventCallback_impl(executor, callback); @@ -1344,7 +1470,9 @@ public class MediaSession2 implements AutoCloseable { * * @param callback the callback to be removed * @throws IllegalArgumentException if the callback is {@code null}. + * @hide */ + // TODO(jaewan): Unhide or remove public void unregisterPlayerEventCallback(@NonNull EventCallback callback) { mProvider.unregisterPlayerEventCallback_impl(callback); } @@ -1353,6 +1481,7 @@ public class MediaSession2 implements AutoCloseable { * Return the {@link PlaybackState2} from the player. * * @return playback state + * @hide */ public PlaybackState2 getPlaybackState() { return mProvider.getPlaybackState_impl(); diff --git a/media/java/android/media/MediaSessionService2.java b/media/java/android/media/MediaSessionService2.java index 0b5dddf92af5..56e8e5d00924 100644 --- a/media/java/android/media/MediaSessionService2.java +++ b/media/java/android/media/MediaSessionService2.java @@ -90,7 +90,7 @@ import android.os.IBinder; * rejected, the controller will unbind. If it's accepted, the controller will be available to use * and keep binding. * <p> - * When playback is started for this session service, {@link #onUpdateNotification(PlaybackState2)} + * When playback is started for this session service, {@link #onUpdateNotification()} * is called and service would become a foreground service. It's needed to keep playback after the * controller is destroyed. The session service becomes background service when the playback is * stopped. @@ -100,7 +100,6 @@ import android.os.IBinder; * Any app can bind to the session service with controller, but the controller can be used only if * the session service accepted the connection request through * {@link MediaSession2.SessionCallback#onConnect(ControllerInfo)}. - * @hide */ public abstract class MediaSessionService2 extends Service { private final MediaSessionService2Provider mProvider; @@ -158,17 +157,16 @@ public abstract class MediaSessionService2 extends Service { public @NonNull abstract MediaSession2 onCreateSession(String sessionId); /** - * Called when the playback state of this session is changed, and notification needs update. - * Override this method to show your own notification UI. + * Called when the playback state of this session is changed so notification needs update. + * Override this method to show or cancel your own notification UI. * <p> * With the notification returned here, the service become foreground service when the playback * is started. It becomes background service after the playback is stopped. * - * @param state playback state * @return a {@link MediaNotification}. If it's {@code null}, notification wouldn't be shown. */ - public MediaNotification onUpdateNotification(PlaybackState2 state) { - return mProvider.onUpdateNotification_impl(state); + public MediaNotification onUpdateNotification() { + return mProvider.onUpdateNotification_impl(); } /** @@ -201,9 +199,9 @@ public abstract class MediaSessionService2 extends Service { } /** - * Returned by {@link #onUpdateNotification(PlaybackState2)} for making session service - * foreground service to keep playback running in the background. It's highly recommended to - * show media style notification here. + * Returned by {@link #onUpdateNotification()} for making session service forground service + * to keep playback running in the background. It's highly recommended to show media style + * notification here. */ public static class MediaNotification { private final MediaNotificationProvider mProvider; diff --git a/media/java/android/media/MicrophoneInfo.java b/media/java/android/media/MicrophoneInfo.java index 131e37bd6646..004efea64d2d 100644 --- a/media/java/android/media/MicrophoneInfo.java +++ b/media/java/android/media/MicrophoneInfo.java @@ -92,6 +92,38 @@ public final class MicrophoneInfo { */ public static final int CHANNEL_MAPPING_PROCESSED = 2; + /** + * Value used for when the group of the microphone is unknown. + */ + public static final int GROUP_UNKNOWN = -1; + + /** + * Value used for when the index in the group of the microphone is unknown. + */ + public static final int INDEX_IN_THE_GROUP_UNKNOWN = -1; + + /** + * Value used for when the position of the microphone is unknown. + */ + public static final Coordinate3F POSITION_UNKNOWN = new Coordinate3F( + -Float.MAX_VALUE, -Float.MAX_VALUE, -Float.MAX_VALUE); + + /** + * Value used for when the orientation of the microphone is unknown. + */ + public static final Coordinate3F ORIENTATION_UNKNOWN = new Coordinate3F(0.0f, 0.0f, 0.0f); + + /** + * Value used for when the sensitivity of the microphone is unknown. + */ + public static final float SENSITIVITY_UNKNOWN = -Float.MAX_VALUE; + + /** + * Value used for when the SPL of the microphone is unknown. This value could be used when + * maximum SPL or minimum SPL is unknown. + */ + public static final float SPL_UNKNOWN = -Float.MAX_VALUE; + /** @hide */ @IntDef(flag = true, prefix = { "LOCATION_" }, value = { LOCATION_UNKNOWN, @@ -216,7 +248,7 @@ public final class MicrophoneInfo { * Returns A device group id that can be used to group together microphones on the same * peripheral, attachments or logical groups. Main body is usually group 0. * - * @return the group of the microphone + * @return the group of the microphone or {@link #GROUP_UNKNOWN} if the group is unknown */ public int getGroup() { return mGroup; @@ -225,7 +257,8 @@ public final class MicrophoneInfo { /** * Returns unique index for device within its group. * - * @return the microphone's index in its group + * @return the microphone's index in its group or {@link #INDEX_IN_THE_GROUP_UNKNOWN} if the + * index in the group is unknown */ public int getIndexInTheGroup() { return mIndexInTheGroup; @@ -233,10 +266,11 @@ public final class MicrophoneInfo { /** * Returns A {@link Coordinate3F} object that represents the geometric location of microphone - * in meters, from botton-left-back corner of appliance. X-axis, Y-axis and Z-axis show + * in meters, from bottom-left-back corner of appliance. X-axis, Y-axis and Z-axis show * as the x, y, z values. * - * @return the geometric location of the microphone + * @return the geometric location of the microphone or {@link #POSITION_UNKNOWN} if the + * geometric location is unknown */ public Coordinate3F getPosition() { return mPosition; @@ -247,7 +281,8 @@ public final class MicrophoneInfo { * X-axis, Y-axis and Z-axis show as the x, y, z value. The orientation will be normalized * such as sqrt(x^2 + y^2 + z^2) equals 1. * - * @return the orientation of the microphone + * @return the orientation of the microphone or {@link #ORIENTATION_UNKNOWN} if orientation + * is unknown */ public Coordinate3F getOrientation() { return mOrientation; @@ -283,7 +318,8 @@ public final class MicrophoneInfo { /** * Returns the level in dBFS produced by a 1000Hz tone at 94 dB SPL. * - * @return the sensitivity of the microphone + * @return the sensitivity of the microphone or {@link #SENSITIVITY_UNKNOWN} if the sensitivity + * is unknown */ public float getSensitivity() { return mSensitivity; @@ -292,7 +328,7 @@ public final class MicrophoneInfo { /** * Returns the level in dB of the maximum SPL supported by the device at 1000Hz. * - * @return the maximum level in dB + * @return the maximum level in dB or {@link #SPL_UNKNOWN} if maximum SPL is unknown */ public float getMaxSpl() { return mMaxSpl; @@ -301,7 +337,7 @@ public final class MicrophoneInfo { /** * Returns the level in dB of the minimum SPL that can be registered by the device at 1000Hz. * - * @return the minimum level in dB + * @return the minimum level in dB or {@link #SPL_UNKNOWN} if minimum SPL is unknown */ public float getMinSpl() { return mMinSpl; @@ -327,8 +363,16 @@ public final class MicrophoneInfo { mPortId = portId; } + /** + * Set the channel mapping for the device. + * @hide + */ + public void setChannelMapping(List<Pair<Integer, Integer>> channelMapping) { + mChannelMapping = channelMapping; + } + /* A class containing three float value to represent a 3D coordinate */ - public class Coordinate3F { + public static final class Coordinate3F { public final float x; public final float y; public final float z; @@ -338,5 +382,17 @@ public final class MicrophoneInfo { this.y = y; this.z = z; } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof Coordinate3F)) { + return false; + } + Coordinate3F other = (Coordinate3F) obj; + return this.x == other.x && this.y == other.y && this.z == other.z; + } } } diff --git a/media/java/android/media/PlaybackState2.java b/media/java/android/media/PlaybackState2.java index a95b8f2650f6..7afb57915139 100644 --- a/media/java/android/media/PlaybackState2.java +++ b/media/java/android/media/PlaybackState2.java @@ -28,11 +28,12 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** - * Playback state for a {@link MediaPlayerInterface}, to be shared between {@link MediaSession2} and + * Playback state for a {@link MediaPlayerBase}, to be shared between {@link MediaSession2} and * {@link MediaController2}. This includes a playback state {@link #STATE_PLAYING}, * the current playback position and extra. * @hide */ +// TODO(jaewan): Remove this. public final class PlaybackState2 { // Similar to the PlaybackState with following changes // - Not implement Parcelable and added from/toBundle() @@ -214,4 +215,4 @@ public final class PlaybackState2 { @Nullable Bundle bundle) { return ApiLoader.getProvider(context).fromBundle_PlaybackState2(context, bundle); } -}
\ No newline at end of file +} diff --git a/media/java/android/media/Rating2.java b/media/java/android/media/Rating2.java index 4f77ecd58149..e5b05fb9c6b0 100644 --- a/media/java/android/media/Rating2.java +++ b/media/java/android/media/Rating2.java @@ -19,7 +19,6 @@ package android.media; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.IntDef; -import android.annotation.SystemApi; import android.content.Context; import android.media.update.ApiLoader; import android.media.update.Rating2Provider; @@ -36,12 +35,10 @@ import java.lang.annotation.RetentionPolicy; * {@link #RATING_5_STARS} or {@link #RATING_PERCENTAGE}) and the actual rating value (which may * be defined as "unrated"), both of which are defined when the rating instance is constructed * through one of the factory methods. - * @hide */ +// New version of Rating with following change +// - Don't implement Parcelable for updatable support. public final class Rating2 { - // Mostly same as the android.media.Rating, but it's no longer implements Parcelable for - // updatable support. - /** * @hide */ @@ -100,7 +97,6 @@ public final class Rating2 { /** * @hide */ - @SystemApi public Rating2(@NonNull Rating2Provider provider) { mProvider = provider; } @@ -113,7 +109,6 @@ public final class Rating2 { /** * @hide */ - @SystemApi public Rating2Provider getProvider() { return mProvider; } diff --git a/media/java/android/media/SessionToken2.java b/media/java/android/media/SessionToken2.java index 2c2090ceb785..fdfa43abd178 100644 --- a/media/java/android/media/SessionToken2.java +++ b/media/java/android/media/SessionToken2.java @@ -18,7 +18,6 @@ package android.media; import android.annotation.IntDef; import android.annotation.NonNull; -import android.annotation.SystemApi; import android.content.Context; import android.media.session.MediaSessionManager; import android.media.update.ApiLoader; @@ -36,8 +35,11 @@ import java.lang.annotation.RetentionPolicy; * {@link MediaController2} to communicate with the session. * <p> * It can be also obtained by {@link MediaSessionManager}. - * @hide */ +// New version of MediaSession.Token for following reasons +// - Stop implementing Parcelable for updatable support +// - Represent session and library service (formerly browser service) in one class. +// Previously MediaSession.Token was for session and ComponentName was for service. public final class SessionToken2 { @Retention(RetentionPolicy.SOURCE) @IntDef(value = {TYPE_SESSION, TYPE_SESSION_SERVICE, TYPE_LIBRARY_SERVICE}) @@ -86,7 +88,6 @@ public final class SessionToken2 { * Constructor for the token. * @hide */ - @SystemApi public SessionToken2(@NonNull SessionToken2Provider provider) { mProvider = provider; } @@ -106,7 +107,9 @@ public final class SessionToken2 { return mProvider.toString_impl(); } - @SystemApi + /** + * @hide + */ public SessionToken2Provider getProvider() { return mProvider; } @@ -147,7 +150,7 @@ public final class SessionToken2 { * @return */ public static SessionToken2 fromBundle(@NonNull Context context, @NonNull Bundle bundle) { - return ApiLoader.getProvider(context).SessionToken2_fromBundle(context, bundle); + return ApiLoader.getProvider(context).fromBundle_SessionToken2(context, bundle); } /** diff --git a/media/java/android/media/VolumeProvider2.java b/media/java/android/media/VolumeProvider2.java index 53ba4663aaf6..8e1cfbf3b5de 100644 --- a/media/java/android/media/VolumeProvider2.java +++ b/media/java/android/media/VolumeProvider2.java @@ -18,7 +18,6 @@ package android.media; import android.annotation.IntDef; import android.annotation.NonNull; -import android.annotation.SystemApi; import android.content.Context; import android.media.update.ApiLoader; import android.media.update.VolumeProvider2Provider; @@ -32,12 +31,11 @@ import java.lang.annotation.RetentionPolicy; * {@link #setCurrentVolume(int)} each time the volume being provided changes. * <p> * You can set a volume provider on a session by calling - * {@link MediaSession2#setPlayer(MediaPlayerInterface, VolumeProvider2)}. - * - * @hide + * {@link MediaSession2#setPlayer(MediaPlayerBase, VolumeProvider2)}. */ +// New version of VolumeProvider with following changes +// - Don't implement Parcelable for updatable support. public abstract class VolumeProvider2 { - /** * @hide */ @@ -85,7 +83,6 @@ public abstract class VolumeProvider2 { /** * @hide */ - @SystemApi public VolumeProvider2Provider getProvider() { return mProvider; } diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl index 2d365d072899..50b4acbfc77e 100644 --- a/media/java/android/media/session/ISessionManager.aidl +++ b/media/java/android/media/session/ISessionManager.aidl @@ -52,8 +52,8 @@ interface ISessionManager { void setOnMediaKeyListener(in IOnMediaKeyListener listener); // MediaSession2 - boolean onSessionCreated(in Bundle sessionToken); - void onSessionDestroyed(in Bundle sessionToken); + boolean createSession2(in Bundle sessionToken); + void destroySession2(in Bundle sessionToken); List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly); void addSessionTokensListener(in ISessionTokensListener listener, int userId, diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java index 454113cb78ac..d079b7a9e612 100644 --- a/media/java/android/media/session/MediaSessionManager.java +++ b/media/java/android/media/session/MediaSessionManager.java @@ -343,29 +343,28 @@ public final class MediaSessionManager { * Called when a {@link MediaSession2} is created. * @hide */ - // TODO(jaewan): System API - public boolean onSessionCreated(@NonNull SessionToken2 token) { + public boolean createSession2(@NonNull SessionToken2 token) { if (token == null) { return false; } try { - return mService.onSessionCreated(token.toBundle()); + return mService.createSession2(token.toBundle()); } catch (RemoteException e) { Log.wtf(TAG, "Cannot communicate with the service.", e); } return false; } - /** Called when a {@link MediaSession2} is destroyed. + /** + * Called when a {@link MediaSession2} is destroyed. * @hide */ - // TODO(jaewan): System API - public void onSessionDestroyed(@NonNull SessionToken2 token) { + public void destroySession2(@NonNull SessionToken2 token) { if (token == null) { return; } try { - mService.onSessionDestroyed(token.toBundle()); + mService.destroySession2(token.toBundle()); } catch (RemoteException e) { Log.wtf(TAG, "Cannot communicate with the service.", e); } @@ -381,9 +380,7 @@ public final class MediaSessionManager { * using the {@link NotificationListenerService} APIs. * * @return list of tokens - * @hide */ - // TODO(jaewan): Unhide public List<SessionToken2> getActiveSessionTokens() { try { List<Bundle> bundles = mService.getSessionTokens( @@ -404,9 +401,7 @@ public final class MediaSessionManager { * using the {@link NotificationListenerService} APIs. * * @return list of tokens - * @hide */ - // TODO(jaewan): Unhide public List<SessionToken2> getSessionServiceTokens() { try { List<Bundle> bundles = mService.getSessionTokens( @@ -429,9 +424,7 @@ public final class MediaSessionManager { * @return list of tokens * @see #getActiveSessionTokens * @see #getSessionServiceTokens - * @hide */ - // TODO(jaewan): Unhide public List<SessionToken2> getAllSessionTokens() { try { List<Bundle> bundles = mService.getSessionTokens( @@ -452,9 +445,7 @@ public final class MediaSessionManager { * * @param executor executor to run this command * @param listener The listener to add. - * @hide */ - // TODO(jaewan): Unhide public void addOnSessionTokensChangedListener(@NonNull @CallbackExecutor Executor executor, @NonNull OnSessionTokensChangedListener listener) { addOnSessionTokensChangedListener(UserHandle.myUserId(), executor, listener); @@ -501,9 +492,7 @@ public final class MediaSessionManager { * Stop receiving session token updates on the specified listener. * * @param listener The listener to remove. - * @hide */ - // TODO(jaewan): Unhide public void removeOnSessionTokensChangedListener( @NonNull OnSessionTokensChangedListener listener) { if (listener == null) { @@ -660,9 +649,7 @@ public final class MediaSessionManager { /** * Listens for changes to the {@link #getAllSessionTokens()}. This can be added * using {@link #addOnActiveSessionsChangedListener}. - * @hide */ - // TODO(jaewan): Unhide public interface OnSessionTokensChangedListener { void onSessionTokensChanged(@NonNull List<SessionToken2> tokens); } diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java index 8d9efd5456c2..ca5c16d14405 100644 --- a/media/java/android/media/update/MediaController2Provider.java +++ b/media/java/android/media/update/MediaController2Provider.java @@ -16,7 +16,6 @@ package android.media.update; -import android.annotation.SystemApi; import android.app.PendingIntent; import android.media.AudioAttributes; import android.media.MediaController2.PlaybackInfo; @@ -65,6 +64,11 @@ public interface MediaController2Provider extends TransportControlProvider { PlaylistParams getPlaylistParams_impl(); void setPlaylistParams_impl(PlaylistParams params); PlaybackState2 getPlaybackState_impl(); + int getPlayerState_impl(); + long getPosition_impl(); + float getPlaybackSpeed_impl(); + long getBufferedPosition_impl(); + MediaItem2 getCurrentPlaylistItem_impl(); interface PlaybackInfoProvider { int getPlaybackType_impl(); diff --git a/media/java/android/media/update/MediaItem2Provider.java b/media/java/android/media/update/MediaItem2Provider.java index 2970f0ec41f8..1d5b4143349a 100644 --- a/media/java/android/media/update/MediaItem2Provider.java +++ b/media/java/android/media/update/MediaItem2Provider.java @@ -23,7 +23,6 @@ import android.os.Bundle; /** * @hide */ -// TODO(jaewan): SystemApi public interface MediaItem2Provider { Bundle toBundle_impl(); String toString_impl(); diff --git a/media/java/android/media/update/MediaLibraryService2Provider.java b/media/java/android/media/update/MediaLibraryService2Provider.java index 5b5d36e78d57..9a0d693aa2e0 100644 --- a/media/java/android/media/update/MediaLibraryService2Provider.java +++ b/media/java/android/media/update/MediaLibraryService2Provider.java @@ -16,23 +16,19 @@ package android.media.update; -import android.annotation.SystemApi; -import android.media.MediaLibraryService2.MediaLibrarySession; -import android.media.MediaLibraryService2.MediaLibrarySessionCallback; import android.media.MediaSession2.ControllerInfo; import android.os.Bundle; /** * @hide */ -// TODO: @SystemApi public interface MediaLibraryService2Provider extends MediaSessionService2Provider { // Nothing new for now interface MediaLibrarySessionProvider extends MediaSession2Provider { void notifyChildrenChanged_impl(ControllerInfo controller, String parentId, - int childCount, Bundle extras); - void notifyChildrenChanged_impl(String parentId, int childCount, Bundle extras); + int itemCount, Bundle extras); + void notifyChildrenChanged_impl(String parentId, int itemCount, Bundle extras); void notifySearchResultChanged_impl(ControllerInfo controller, String query, int itemCount, Bundle extras); } diff --git a/media/java/android/media/update/MediaMetadata2Provider.java b/media/java/android/media/update/MediaMetadata2Provider.java index 55ac43d797d4..22463e924075 100644 --- a/media/java/android/media/update/MediaMetadata2Provider.java +++ b/media/java/android/media/update/MediaMetadata2Provider.java @@ -11,7 +11,6 @@ import java.util.Set; /** * @hide */ -// TODO(jaewan): SystemApi public interface MediaMetadata2Provider { boolean containsKey_impl(String key); CharSequence getText_impl(String key); @@ -23,7 +22,8 @@ public interface MediaMetadata2Provider { Set<String> keySet_impl(); int size_impl(); Bitmap getBitmap_impl(String key); - Bundle getExtra_impl(); + float getFloat_impl(String key); + Bundle getExtras_impl(); interface BuilderProvider { Builder putText_impl(String key, CharSequence value); @@ -31,7 +31,8 @@ public interface MediaMetadata2Provider { Builder putLong_impl(String key, long value); Builder putRating_impl(String key, Rating2 value); Builder putBitmap_impl(String key, Bitmap value); - Builder setExtra_impl(Bundle bundle); + Builder putFloat_impl(String key, float value); + Builder setExtras_impl(Bundle bundle); MediaMetadata2 build_impl(); } } diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java index fc1f671d95c0..dbd4a0ae04cc 100644 --- a/media/java/android/media/update/MediaSession2Provider.java +++ b/media/java/android/media/update/MediaSession2Provider.java @@ -19,8 +19,8 @@ package android.media.update; import android.app.PendingIntent; import android.media.MediaItem2; import android.media.MediaMetadata2; -import android.media.MediaPlayerInterface; -import android.media.MediaPlayerInterface.EventCallback; +import android.media.MediaPlayerBase; +import android.media.MediaPlayerBase.EventCallback; import android.media.MediaSession2; import android.media.MediaSession2.Command; import android.media.MediaSession2.CommandButton; @@ -40,27 +40,28 @@ import java.util.concurrent.Executor; /** * @hide */ -// TODO: @SystemApi public interface MediaSession2Provider extends TransportControlProvider { void close_impl(); - void setPlayer_impl(MediaPlayerInterface player); - void setPlayer_impl(MediaPlayerInterface player, VolumeProvider2 volumeProvider); - MediaPlayerInterface getPlayer_impl(); + void setPlayer_impl(MediaPlayerBase player); + void setPlayer_impl(MediaPlayerBase player, VolumeProvider2 volumeProvider); + MediaPlayerBase getPlayer_impl(); SessionToken2 getToken_impl(); List<ControllerInfo> getConnectedControllers_impl(); void setCustomLayout_impl(ControllerInfo controller, List<CommandButton> layout); void setAudioFocusRequest_impl(int focusGain); - void setAllowedCommands_impl(ControllerInfo controller, CommandGroup commands); - void notifyMetadataChanged_impl(); void sendCustomCommand_impl(ControllerInfo controller, Command command, Bundle args, ResultReceiver receiver); void sendCustomCommand_impl(Command command, Bundle args); void setPlaylist_impl(List<MediaItem2> playlist); + void addPlaylistItem_impl(int index, MediaItem2 item); + void removePlaylistItem_impl(MediaItem2 item); + void editPlaylistItem_impl(MediaItem2 item); List<MediaItem2> getPlaylist_impl(); + MediaItem2 getCurrentPlaylistItem_impl(); void setPlaylistParams_impl(PlaylistParams params); PlaylistParams getPlaylistParams_impl(); - + void notifyError_impl(int errorCode, int extra); void registerPlayerEventCallback_impl(Executor executor, EventCallback callback); void unregisterPlayerEventCallback_impl(EventCallback callback); diff --git a/media/java/android/media/update/MediaSessionService2Provider.java b/media/java/android/media/update/MediaSessionService2Provider.java index 42e75871e12f..8697e70634ca 100644 --- a/media/java/android/media/update/MediaSessionService2Provider.java +++ b/media/java/android/media/update/MediaSessionService2Provider.java @@ -16,7 +16,6 @@ package android.media.update; -import android.annotation.SystemApi; import android.app.Notification; import android.content.Intent; import android.media.MediaSession2; @@ -29,7 +28,7 @@ import android.os.IBinder; */ public interface MediaSessionService2Provider { MediaSession2 getSession_impl(); - MediaNotification onUpdateNotification_impl(PlaybackState2 state); + MediaNotification onUpdateNotification_impl(); // Service void onCreate_impl(); diff --git a/media/java/android/media/update/PlaybackState2Provider.java b/media/java/android/media/update/PlaybackState2Provider.java index 93f769cc52d1..66b8fa53974b 100644 --- a/media/java/android/media/update/PlaybackState2Provider.java +++ b/media/java/android/media/update/PlaybackState2Provider.java @@ -21,7 +21,6 @@ import android.os.Bundle; /** * @hide */ -// TODO(jaewan): @SystemApi public interface PlaybackState2Provider { String toString_impl(); diff --git a/media/java/android/media/update/Rating2Provider.java b/media/java/android/media/update/Rating2Provider.java index 8966196890c7..28ad2735d63c 100644 --- a/media/java/android/media/update/Rating2Provider.java +++ b/media/java/android/media/update/Rating2Provider.java @@ -22,7 +22,6 @@ import android.os.Bundle; /** * @hide */ -// TODO(jaewan): @SystemApi public interface Rating2Provider { String toString_impl(); boolean equals_impl(Object obj); @@ -34,4 +33,4 @@ public interface Rating2Provider { boolean isThumbUp_impl(); float getStarRating_impl(); float getPercentRating_impl(); -}
\ No newline at end of file +} diff --git a/media/java/android/media/update/StaticProvider.java b/media/java/android/media/update/StaticProvider.java index 29a30343244e..62759eb15a2b 100644 --- a/media/java/android/media/update/StaticProvider.java +++ b/media/java/android/media/update/StaticProvider.java @@ -28,10 +28,9 @@ import android.media.MediaItem2; import android.media.MediaLibraryService2; import android.media.MediaLibraryService2.LibraryRoot; import android.media.MediaLibraryService2.MediaLibrarySession; -import android.media.MediaLibraryService2.MediaLibrarySessionBuilder; -import android.media.MediaLibraryService2.MediaLibrarySessionCallback; +import android.media.MediaLibraryService2.MediaLibrarySession.MediaLibrarySessionCallback; import android.media.MediaMetadata2; -import android.media.MediaPlayerInterface; +import android.media.MediaPlayerBase; import android.media.MediaSession2; import android.media.MediaSession2.CommandButton.Builder; import android.media.MediaSession2.PlaylistParams; @@ -44,7 +43,7 @@ import android.media.SessionToken2; import android.media.VolumeProvider2; import android.media.update.MediaLibraryService2Provider.LibraryRootProvider; import android.media.update.MediaSession2Provider.BuilderBaseProvider; -import android.media.update.MediaSession2Provider.CommandButtonProvider.BuilderProvider; +import android.media.update.MediaSession2Provider.CommandButtonProvider; import android.media.update.MediaSession2Provider.CommandGroupProvider; import android.media.update.MediaSession2Provider.CommandProvider; import android.media.update.MediaSession2Provider.ControllerInfoProvider; @@ -86,9 +85,10 @@ public interface StaticProvider { PlaylistParams playlistParams, int repeatMode, int shuffleMode, MediaMetadata2 playlistMetadata); PlaylistParams fromBundle_PlaylistParams(Context context, Bundle bundle); - BuilderProvider createMediaSession2CommandButtonBuilder(Context context, Builder builder); + CommandButtonProvider.BuilderProvider createMediaSession2CommandButtonBuilder(Context context, + MediaSession2.CommandButton.Builder builder); BuilderBaseProvider<MediaSession2, SessionCallback> createMediaSession2Builder( - Context context, MediaSession2.Builder instance, MediaPlayerInterface player); + Context context, MediaSession2.Builder instance, MediaPlayerBase player); MediaController2Provider createMediaController2(Context context, MediaController2 instance, SessionToken2 token, Executor executor, ControllerCallback callback); @@ -103,14 +103,15 @@ public interface StaticProvider { MediaSessionService2Provider createMediaLibraryService2(MediaLibraryService2 instance); BuilderBaseProvider<MediaLibrarySession, MediaLibrarySessionCallback> createMediaLibraryService2Builder( - Context context, MediaLibrarySessionBuilder instance, MediaPlayerInterface player, - Executor callbackExecutor, MediaLibrarySessionCallback callback); + MediaLibraryService2 service, MediaLibrarySession.Builder instance, + MediaPlayerBase player, Executor callbackExecutor, + MediaLibrarySessionCallback callback); LibraryRootProvider createMediaLibraryService2LibraryRoot(Context context, LibraryRoot instance, String rootId, Bundle extras); SessionToken2Provider createSessionToken2(Context context, SessionToken2 instance, String packageName, String serviceName, int uid); - SessionToken2 SessionToken2_fromBundle(Context context, Bundle bundle); + SessionToken2 fromBundle_SessionToken2(Context context, Bundle bundle); MediaItem2Provider createMediaItem2(Context context, MediaItem2 mediaItem2, String mediaId, DataSourceDesc dsd, MediaMetadata2 metadata, int flags); diff --git a/media/java/android/media/update/TransportControlProvider.java b/media/java/android/media/update/TransportControlProvider.java index 44f82b295629..9af8ada1dc18 100644 --- a/media/java/android/media/update/TransportControlProvider.java +++ b/media/java/android/media/update/TransportControlProvider.java @@ -16,6 +16,7 @@ package android.media.update; +import android.media.MediaItem2; import android.media.PlaybackState2; /** @@ -32,7 +33,7 @@ public interface TransportControlProvider { void fastForward_impl(); void rewind_impl(); void seekTo_impl(long pos); - void setCurrentPlaylistItem_impl(int index); + void skipToPlaylistItem_impl(MediaItem2 item); PlaybackState2 getPlaybackState_impl(); } diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java index 21cc61ff2455..152ace924380 100644 --- a/media/java/android/media/update/VideoView2Provider.java +++ b/media/java/android/media/update/VideoView2Provider.java @@ -18,7 +18,8 @@ package android.media.update; import android.annotation.SystemApi; import android.media.AudioAttributes; -import android.media.MediaPlayerInterface; +import android.media.MediaMetadata2; +import android.media.MediaPlayerBase; import android.media.session.MediaController; import android.media.session.PlaybackState; import android.media.session.MediaSession; @@ -51,8 +52,10 @@ public interface VideoView2Provider extends ViewGroupProvider { void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes); void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs); + void setMediaMetadata_impl(MediaMetadata2 metadata); MediaController getMediaController_impl(); MediaControlView2 getMediaControlView2_impl(); + MediaMetadata2 getMediaMetadata_impl(); void setSubtitleEnabled_impl(boolean enable); boolean isSubtitleEnabled_impl(); // TODO: remove setSpeed_impl once MediaController2 is ready. @@ -62,7 +65,7 @@ public interface VideoView2Provider extends ViewGroupProvider { /** * @hide */ - void setRouteAttributes_impl(List<String> routeCategories, MediaPlayerInterface player); + void setRouteAttributes_impl(List<String> routeCategories, MediaPlayerBase player); // TODO: remove setRouteAttributes_impl with MediaSession.Callback once MediaSession2 is ready. void setRouteAttributes_impl(List<String> routeCategories, MediaSession.Callback sessionPlayer); void setVideoPath_impl(String path); diff --git a/media/java/android/media/update/VolumeProvider2Provider.java b/media/java/android/media/update/VolumeProvider2Provider.java index 5657af60eb6b..5b5cfd32b58d 100644 --- a/media/java/android/media/update/VolumeProvider2Provider.java +++ b/media/java/android/media/update/VolumeProvider2Provider.java @@ -18,7 +18,6 @@ package android.media.update; /** * @hide */ -// TODO(jaewan): @SystemApi public interface VolumeProvider2Provider { int getControlType_impl(); int getMaxVolume_impl(); diff --git a/media/jni/Android.bp b/media/jni/Android.bp index fe2f64fa2d96..3c8af8a2299a 100644 --- a/media/jni/Android.bp +++ b/media/jni/Android.bp @@ -51,6 +51,7 @@ cc_library_shared { "libexif", "libpiex", "libandroidfw", + "libhidlallocatorutils", "libhidlbase", "libhidltransport", "android.hardware.cas@1.0", @@ -106,6 +107,7 @@ cc_library_shared { "liblog", // NDK "libdrmframework", // for FileSource, MediaHTTP "libgui", // for VideoFrameScheduler + "libhidlallocatorutils", "libhidlbase", // VNDK??? "libmediandk", // NDK "libpowermanager", // for JWakeLock. to be removed diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp index e77e855ce53a..add4746322b8 100644 --- a/media/jni/android_media_MediaDescrambler.cpp +++ b/media/jni/android_media_MediaDescrambler.cpp @@ -27,12 +27,13 @@ #include <android/hardware/cas/native/1.0/BnHwDescrambler.h> #include <binder/MemoryDealer.h> #include <hidl/HidlSupport.h> +#include <hidlmemory/FrameworkUtils.h> #include <media/stagefright/foundation/ADebug.h> #include <nativehelper/ScopedLocalRef.h> namespace android { -using hardware::hidl_handle; +using hardware::fromHeap; struct fields_t { jfieldID context; @@ -146,14 +147,8 @@ bool JDescrambler::ensureBufferCapacity(size_t neededSize) { return false; } - native_handle_t* nativeHandle = native_handle_create(1, 0); - if (!nativeHandle) { - ALOGE("ensureBufferCapacity: failed to create native handle"); - return false; - } - nativeHandle->data[0] = heap->getHeapID(); - mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem", - hidl_handle(nativeHandle), heap->getSize()); + mHidlMemory = fromHeap(heap); + mDescramblerSrcBuffer.heapBase = *mHidlMemory; mDescramblerSrcBuffer.offset = (uint64_t) offset; mDescramblerSrcBuffer.size = (uint64_t) size; return true; diff --git a/media/jni/android_media_MediaDescrambler.h b/media/jni/android_media_MediaDescrambler.h index 015fad22e13b..2354dc2d24fd 100644 --- a/media/jni/android_media_MediaDescrambler.h +++ b/media/jni/android_media_MediaDescrambler.h @@ -28,7 +28,10 @@ namespace android { class IMemory; class MemoryDealer; -using hardware::hidl_memory; +namespace hardware { +class HidlMemory; +}; +using hardware::HidlMemory; using hardware::hidl_string; using hardware::hidl_vec; using namespace hardware::cas::V1_0; @@ -58,6 +61,7 @@ private: sp<IDescrambler> mDescrambler; sp<IMemory> mMem; sp<MemoryDealer> mDealer; + sp<HidlMemory> mHidlMemory; SharedBuffer mDescramblerSrcBuffer; Mutex mSharedMemLock; diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index cf115a4f8d43..2258c78f18a0 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -760,7 +760,8 @@ android_media_MediaPlayer2_seekTo(JNIEnv *env, jobject thiz, jlong msec, jint mo return; } ALOGV("seekTo: %lld(msec), mode=%d", (long long)msec, mode); - process_media_player_call( env, thiz, mp->seekTo((int)msec, (MediaPlayer2SeekMode)mode), NULL, NULL ); + process_media_player_call(env, thiz, mp->seekTo((int64_t)msec, (MediaPlayer2SeekMode)mode), + NULL, NULL); } static void @@ -838,7 +839,7 @@ android_media_MediaPlayer2_native_getMetrics(JNIEnv *env, jobject thiz) return mybundle; } -static jint +static jlong android_media_MediaPlayer2_getCurrentPosition(JNIEnv *env, jobject thiz) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); @@ -846,13 +847,13 @@ android_media_MediaPlayer2_getCurrentPosition(JNIEnv *env, jobject thiz) jniThrowException(env, "java/lang/IllegalStateException", NULL); return 0; } - int msec; + int64_t msec; process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL ); - ALOGV("getCurrentPosition: %d (msec)", msec); - return (jint) msec; + ALOGV("getCurrentPosition: %lld (msec)", (long long)msec); + return (jlong) msec; } -static jint +static jlong android_media_MediaPlayer2_getDuration(JNIEnv *env, jobject thiz) { sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); @@ -860,10 +861,10 @@ android_media_MediaPlayer2_getDuration(JNIEnv *env, jobject thiz) jniThrowException(env, "java/lang/IllegalStateException", NULL); return 0; } - int msec; + int64_t msec; process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL ); - ALOGV("getDuration: %d (msec)", msec); - return (jint) msec; + ALOGV("getDuration: %lld (msec)", (long long)msec); + return (jlong) msec; } static void @@ -911,6 +912,28 @@ android_media_MediaPlayer2_setParameter(JNIEnv *env, jobject thiz, jint key, job } } +static jobject +android_media_MediaPlayer2_getParameter(JNIEnv *env, jobject thiz, jint key) +{ + ALOGV("getParameter: key %d", key); + sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); + if (mp == NULL) { + jniThrowException(env, "java/lang/IllegalStateException", NULL); + return NULL; + } + + jobject jParcel = createJavaParcelObject(env); + if (jParcel != NULL) { + Parcel* nativeParcel = parcelForJavaObject(env, jParcel); + status_t err = mp->getParameter(key, nativeParcel); + if (err != OK) { + env->DeleteLocalRef(jParcel); + return NULL; + } + } + return jParcel; +} + static void android_media_MediaPlayer2_setLooping(JNIEnv *env, jobject thiz, jboolean looping) { @@ -1171,33 +1194,6 @@ static void android_media_MediaPlayer2_attachAuxEffect(JNIEnv *env, jobject thi process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL ); } -static void -android_media_MediaPlayer2_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player) -{ - ALOGV("setNextMediaPlayer"); - sp<MediaPlayer2> thisplayer = getMediaPlayer(env, thiz); - if (thisplayer == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized"); - return; - } - sp<MediaPlayer2> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player); - if (nextplayer == NULL && java_player != NULL) { - jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized"); - return; - } - - if (nextplayer == thisplayer) { - jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self"); - return; - } - // tie the two players together - process_media_player_call( - env, thiz, thisplayer->setNextMediaPlayer(nextplayer), - "java/lang/IllegalArgumentException", - "setNextMediaPlayer failed." ); - ; -} - ///////////////////////////////////////////////////////////////////////////////////// // Modular DRM begin @@ -1498,12 +1494,13 @@ static const JNINativeMethod gMethods[] = { {"_notifyAt", "(J)V", (void *)android_media_MediaPlayer2_notifyAt}, {"_pause", "()V", (void *)android_media_MediaPlayer2_pause}, {"isPlaying", "()Z", (void *)android_media_MediaPlayer2_isPlaying}, - {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer2_getCurrentPosition}, - {"getDuration", "()I", (void *)android_media_MediaPlayer2_getDuration}, + {"getCurrentPosition", "()J", (void *)android_media_MediaPlayer2_getCurrentPosition}, + {"getDuration", "()J", (void *)android_media_MediaPlayer2_getDuration}, {"_release", "()V", (void *)android_media_MediaPlayer2_release}, {"_reset", "()V", (void *)android_media_MediaPlayer2_reset}, {"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer2_getAudioStreamType}, {"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer2_setParameter}, + {"getParameter", "(I)Landroid/os/Parcel;", (void *)android_media_MediaPlayer2_getParameter}, {"setLooping", "(Z)V", (void *)android_media_MediaPlayer2_setLooping}, {"isLooping", "()Z", (void *)android_media_MediaPlayer2_isLooping}, {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer2_setVolume}, @@ -1517,7 +1514,6 @@ static const JNINativeMethod gMethods[] = { {"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer2_set_audio_session_id}, {"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer2_setAuxEffectSendLevel}, {"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer2_attachAuxEffect}, - {"setNextMediaPlayer", "(Landroid/media/MediaPlayer2;)V", (void *)android_media_MediaPlayer2_setNextMediaPlayer}, // Modular DRM { "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer2_prepareDrm }, { "_releaseDrm", "()V", (void *)android_media_MediaPlayer2_releaseDrm }, diff --git a/packages/BackupRestoreConfirmation/res/values-as/strings.xml b/packages/BackupRestoreConfirmation/res/values-as/strings.xml new file mode 100644 index 000000000000..4a86d6477f51 --- /dev/null +++ b/packages/BackupRestoreConfirmation/res/values-as/strings.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="backup_confirm_title" msgid="827563724209303345">"সম্পূৰ্ণ বেকআপ"</string> + <string name="restore_confirm_title" msgid="5469365809567486602">"সম্পূৰ্ণ পুনঃস্থাপন"</string> + <string name="backup_confirm_text" msgid="1878021282758896593">"এটা সংযোগ হৈ থকা ডেস্কট\'প কম্পিউটাৰলৈ সকলো ডেটাক সম্পূৰ্ণৰূপে পুনঃস্থাপনৰ বাবে অনুৰোধ কৰা হৈছে। আপুনি এই কাৰ্যক অনুমতি দিব বিচাৰেনে?\n\nযদিহে আপুনি নিজৰ ফালৰ পৰা এই অনুৰোধটো কৰা নাই, তেন্তে এই কাৰ্যক অনুমতি নিদিব।"</string> + <string name="allow_backup_button_label" msgid="4217228747769644068">"মোৰ ডেটাৰ বেকআপ লওক"</string> + <string name="deny_backup_button_label" msgid="6009119115581097708">"বেকআপ নল\'ব"</string> + <string name="restore_confirm_text" msgid="7499866728030461776">"সংযোগ হৈ থকা এটা ডেস্কটপ কম্পিউটাৰৰ পৰা সকলো ডেটাৰ সম্পূৰ্ণ পুনঃস্থাপনৰ বাবে অনুৰোধ কৰা হৈছে। আপুনি এই কাৰ্য সম্পন্ন হ\'বলৈ দিব বিচাৰেনে?\n\nযদিহে আপুনে নিজৰ ফালৰ পৰা এই অনুৰোধটো কৰা নাই, তেন্তে এই কাৰ্য আৰম্ভ হ\'বলৈ নিদিব। এই কাৰ্যই ডিভাইচত থকা সকলো ডেটা সলনি কৰিব!"</string> + <string name="allow_restore_button_label" msgid="3081286752277127827">"মোৰ ডেটা পুনঃস্থাপন কৰক"</string> + <string name="deny_restore_button_label" msgid="1724367334453104378">"পুনঃস্থাপন নকৰিব"</string> + <string name="current_password_text" msgid="8268189555578298067">"অনুগ্ৰহ কৰি আপোনাৰ বৰ্তমানৰ বেকআপ পাছৱৰ্ডটো তলত দিয়ক:"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"অনুগ্ৰহ কৰি তলত আপোনাৰ ডিভাইচৰ এনক্ৰিপশ্বন পাছৱৰ্ডটো দিয়ক৷"</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"অনুগ্ৰহ কৰি তলত আপোনাৰ ডিভাইচৰ এনক্ৰিপশ্বন পাছৱৰ্ডটো দিয়ক৷ এই পাছৱৰ্ডটো বেকআপ কাৰ্যৰ আৰ্কাইভ কৰিবলৈও ব্যৱহাৰ কৰা হ\'ব৷"</string> + <string name="backup_enc_password_text" msgid="4981585714795233099">"সম্পূৰ্ণৰূপে বেকআপ লোৱা ডেটা এনক্ৰিপ্ট কৰিবলৈ অনুগ্ৰহ কৰি এটা পাছৱৰ্ড দিয়ক। এই ঠাইটো খালী ৰাখিলে আপোনাৰ বৰ্তমানৰ বেকআপ পাছৱৰ্ডটো ব্যৱহাৰ কৰা হ\'ব:"</string> + <string name="backup_enc_password_optional" msgid="1350137345907579306">"যদি আপুনি সম্পূৰ্ণ বেকআপ ডেটা এনক্ৰিপ্ট কৰিব বিচাৰিছে, তেতিয়াহ\'লে তলত পাছৱৰ্ড এটা দিয়ক:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"যিহেতু আপোনাৰ ডিভাইচটো এনক্ৰিপ্ট কৰা হৈছে, আপুনি আপোনাৰ বেকআপ এনক্ৰিপ্ট কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি তলত এটা পাছৱৰ্ড দিয়ক:"</string> + <string name="restore_enc_password_text" msgid="6140898525580710823">"যদি পুনঃস্থাপন কৰিবলগীয়া ডেটা এনক্ৰিপ্ট কৰা আছে, তেন্তে তলত পাছৱৰ্ড দিয়ক:"</string> + <string name="toast_backup_started" msgid="550354281452756121">"বেকআপ লোৱা কাৰ্য আৰম্ভ কৰি আছে..."</string> + <string name="toast_backup_ended" msgid="3818080769548726424">"বেকআপ লোৱা সম্পূৰ্ণ হ\'ল"</string> + <string name="toast_restore_started" msgid="7881679218971277385">"পুনঃস্থাপন কাৰ্য আৰম্ভ কৰি আছে..."</string> + <string name="toast_restore_ended" msgid="1764041639199696132">"পুনঃস্থাপন কাৰ্য সমাপ্ত হ\'ল"</string> + <string name="toast_timeout" msgid="5276598587087626877">"কাৰ্যটোৰ সময়সীমা উকলি গ\'ল"</string> +</resources> diff --git a/packages/BackupRestoreConfirmation/res/values-bs/strings.xml b/packages/BackupRestoreConfirmation/res/values-bs/strings.xml index e4852ed16ddb..bc52b06e3eb8 100644 --- a/packages/BackupRestoreConfirmation/res/values-bs/strings.xml +++ b/packages/BackupRestoreConfirmation/res/values-bs/strings.xml @@ -21,7 +21,7 @@ <string name="backup_confirm_text" msgid="1878021282758896593">"Zatraženo je pravljenje potpune rezervne kopije svih podataka na povezani računar. Da li želite da dozvolite to?\n\nPrekinite radnju ukoliko to niste sami zatražili."</string> <string name="allow_backup_button_label" msgid="4217228747769644068">"Napravi sigurnosnu kopiju mojih podataka"</string> <string name="deny_backup_button_label" msgid="6009119115581097708">"Nemoj napraviti rezervnu kopiju"</string> - <string name="restore_confirm_text" msgid="7499866728030461776">"Sa povezanog računara je upućen zahtjev za potpuno obnavljanje svih podataka. Želite li to dozvoliti?\n\nUkoliko niste uputili zahtjev za obnavljanje, prekinite radnju. Ovim će zamijeniti svi podaci koji su trenutno na uređaju!"</string> + <string name="restore_confirm_text" msgid="7499866728030461776">"Sa povezanog računara je upućen zahtjev za potpuno vraćanje svih podataka. Želite li to dozvoliti?\n\nUkoliko niste uputili zahtjev za vraćanje, prekinite radnju. Ovim će zamijeniti svi podaci koji su trenutno na uređaju!"</string> <string name="allow_restore_button_label" msgid="3081286752277127827">"Vrati moje podatke"</string> <string name="deny_restore_button_label" msgid="1724367334453104378">"Ne vraćaj"</string> <string name="current_password_text" msgid="8268189555578298067">"Ispod unesite svoju trenutnu lozinku za sigurnosnu kopiju:"</string> diff --git a/packages/BackupRestoreConfirmation/res/values-or/strings.xml b/packages/BackupRestoreConfirmation/res/values-or/strings.xml new file mode 100644 index 000000000000..77f3efb62bd8 --- /dev/null +++ b/packages/BackupRestoreConfirmation/res/values-or/strings.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="backup_confirm_title" msgid="827563724209303345">"ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍"</string> + <string name="restore_confirm_title" msgid="5469365809567486602">"ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍"</string> + <string name="backup_confirm_text" msgid="1878021282758896593">"ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍ କମ୍ପ୍ୟୁଟର୍କୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହିପରି କରିବାକୁ ଚାହିଁବେ?\n\nଯଦି ଆପଣ ନିଜେ ବ୍ୟାକଅପ୍ର ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହି କାମକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ।"</string> + <string name="allow_backup_button_label" msgid="4217228747769644068">"ମୋ ଡାଟାର ବ୍ୟାକଅପ୍ ନିଆଯାଉ"</string> + <string name="deny_backup_button_label" msgid="6009119115581097708">"ବ୍ୟାକଅପ୍ ନିଆନଯାଉ"</string> + <string name="restore_confirm_text" msgid="7499866728030461776">"ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍ କମ୍ପ୍ୟୁଟର୍ରୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହାକୁ ଅନୁମତି ଦେବାକୁ ଚାହିଁବେ କି?\n\nଯଦି ଆପଣ ନିଜେ ରିଷ୍ଟୋର୍ ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହା କାର୍ଯ୍ୟକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ। ଏହା ବର୍ତ୍ତମାନ ଡିଭାଇସ୍ରେ ଥିବା ଯେକୌଣସି ଡାଟାକୁ ବଦଳାଇଦେବ!"</string> + <string name="allow_restore_button_label" msgid="3081286752277127827">"ମୋ ଡାଟାକୁ ରିଷ୍ଟୋର୍ କରାଯାଉ"</string> + <string name="deny_restore_button_label" msgid="1724367334453104378">"ରିଷ୍ଟୋର୍ କରନ୍ତୁ ନାହିଁ।"</string> + <string name="current_password_text" msgid="8268189555578298067">"ଦୟାକରି ନିମ୍ନରେ ବର୍ତ୍ତମାନର ବ୍ୟାକଅପ୍ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string> + <string name="device_encryption_restore_text" msgid="1570864916855208992">"ଦୟାକରି, ତଳେ ନିଜର ଏନକ୍ରିପ୍ସନ୍ ପାସ୍ୱର୍ଡକୁ ଦିଅନ୍ତୁ।"</string> + <string name="device_encryption_backup_text" msgid="5866590762672844664">"ଦୟାକରି, ତଳେ ନିଜର ଡିଭାଇସ୍ ଏନକ୍ରିପ୍ସନ୍ ପାସ୍ୱର୍ଡ ଦିଅନ୍ତୁ। ବ୍ୟାକଅପ୍ ଆର୍କାଇଭ୍ ଏନ୍କ୍ରିପ୍ଟ କରିବା ପାଇଁ ମଧ୍ୟ ଏହା ବ୍ୟବହୃତ ହେବ।"</string> + <string name="backup_enc_password_text" msgid="4981585714795233099">"ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍ ଡାଟାକୁ ଏନକ୍ରୀପ୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ପାସୱର୍ଡ ଦିଅନ୍ତୁ। ଯଦି ଏହାକୁ ଖାଲି ଛାଡ଼ି ଦିଆଯାଏ, ତେବେ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ପାସୱର୍ଡ ବ୍ୟବହାର କରାଯିବ।"</string> + <string name="backup_enc_password_optional" msgid="1350137345907579306">"ଯଦି ଆପଣ ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍କୁ ଏନ୍କ୍ରିପ୍ଟ କରିବାକୁ ଚାହାନ୍ତି, ତେବେ ତଳେ ଗୋଟିଏ ପାସ୍ୱର୍ଡ ଦିଅନ୍ତୁ:"</string> + <string name="backup_enc_password_required" msgid="7889652203371654149">"ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବାରୁ ଆପଣଙ୍କୁ ନିଜ ବ୍ୟାକଅପକୁ ଏନକ୍ରିପ୍ଟ କରିବାକୁ ଦରକାର ପଡ଼ିବ। ଦୟାକରି ତଳେ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string> + <string name="restore_enc_password_text" msgid="6140898525580710823">"ଯଦି ରିଷ୍ଟୋର୍ ଡାଟା ଏନକ୍ରିପ୍ଟ ହୋଇଯାଇଥାଏ, ତେବେ ତଳେ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string> + <string name="toast_backup_started" msgid="550354281452756121">"ବ୍ୟାକଅପ୍ ଆରମ୍ଭ କରୁଛି..."</string> + <string name="toast_backup_ended" msgid="3818080769548726424">"ବ୍ୟାକଅପ୍ ସମାପ୍ତ ହେଲା"</string> + <string name="toast_restore_started" msgid="7881679218971277385">"ରିଷ୍ଟୋର୍ ଆରମ୍ଭ ହେଉଛି..."</string> + <string name="toast_restore_ended" msgid="1764041639199696132">"ରିଷ୍ଟୋର୍ ସମାପ୍ତ ହେଲା"</string> + <string name="toast_timeout" msgid="5276598587087626877">"କାର୍ଯ୍ୟର ସମୟ ସରିଯାଇଛି"</string> +</resources> diff --git a/packages/CaptivePortalLogin/res/values-as/strings.xml b/packages/CaptivePortalLogin/res/values-as/strings.xml new file mode 100644 index 000000000000..2281ce7270ab --- /dev/null +++ b/packages/CaptivePortalLogin/res/values-as/strings.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string> + <string name="action_use_network" msgid="6076184727448466030">"এই নেটৱৰ্কটো এইদৰে ব্যৱহাৰ কৰক"</string> + <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটৱৰ্কটো ব্যৱহাৰ নকৰিব"</string> + <!-- no translation found for action_bar_label (917235635415966620) --> + <skip /> + <!-- no translation found for action_bar_title (5645564790486983117) --> + <skip /> + <!-- no translation found for ssl_error_warning (6653188881418638872) --> + <skip /> + <!-- no translation found for ssl_error_example (647898534624078900) --> + <skip /> + <!-- no translation found for ssl_error_continue (6492718244923937110) --> + <skip /> +</resources> diff --git a/packages/CaptivePortalLogin/res/values-or/strings.xml b/packages/CaptivePortalLogin/res/values-or/strings.xml new file mode 100644 index 000000000000..b7c832107193 --- /dev/null +++ b/packages/CaptivePortalLogin/res/values-or/strings.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string> + <string name="action_use_network" msgid="6076184727448466030">"ଏହି ନେଟ୍ୱର୍କ ଯେପରି ଅଛି, ସେହିପରି ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="action_do_not_use_network" msgid="4577366536956516683">"ଏହି ନେଟ୍ୱର୍କକୁ ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ"</string> + <string name="action_bar_label" msgid="917235635415966620">"ନେଟ୍ୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string> + <!-- no translation found for action_bar_title (5645564790486983117) --> + <skip /> + <string name="ssl_error_warning" msgid="6653188881418638872">"ଆପଣ ଯୋଗ ଦେବାକୁ ଚେଷ୍ଟା କରୁଥିବା ନେଟ୍ୱର୍କର ସୁରକ୍ଷା ସମସ୍ୟା ଅଛି।"</string> + <string name="ssl_error_example" msgid="647898534624078900">"ଉଦାହରଣସ୍ୱରୂପ, ଲଗଇନ୍ ପୃଷ୍ଠା ଦେଖାଯାଇଥିବା ସଂସ୍ଥାର ନହୋଇଥାଇପାରେ।"</string> + <string name="ssl_error_continue" msgid="6492718244923937110">"ବ୍ରାଉଜର୍ ଜରିଆରେ ଯେମିତିବି ହେଉ ଜାରି ରଖନ୍ତୁ"</string> +</resources> diff --git a/packages/CarrierDefaultApp/res/values-as/strings.xml b/packages/CarrierDefaultApp/res/values-as/strings.xml new file mode 100644 index 000000000000..61171bc04aee --- /dev/null +++ b/packages/CarrierDefaultApp/res/values-as/strings.xml @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string> + <string name="android_system_label" msgid="2797790869522345065">"ম\'বাইল সেৱা প্ৰদান কৰা কোম্পানী"</string> + <string name="portal_notification_id" msgid="5155057562457079297">"ম\'বাইল ডেটা শেষ হৈছে"</string> + <string name="no_data_notification_id" msgid="668400731803969521">"আপোনাৰ ম\'বাইল ডেটা সেৱা নিষ্ক্ৰিয় কৰা হৈছে"</string> + <string name="portal_notification_detail" msgid="2295729385924660881">"%s ৱেবছাইটটোলৈ যাবলৈ টিপক"</string> + <string name="no_data_notification_detail" msgid="3112125343857014825">"অনুগ্ৰহ কৰি আপোনাৰ সেৱা প্ৰদানকাৰী %sৰ সৈতে যোগাযোগ কৰক"</string> + <!-- no translation found for no_mobile_data_connection_title (7449525772416200578) --> + <skip /> + <!-- no translation found for no_mobile_data_connection (544980465184147010) --> + <skip /> + <!-- no translation found for mobile_data_status_notification_channel_name (833999690121305708) --> + <skip /> + <string name="action_bar_label" msgid="4290345990334377177">"ম\'বাইল নেটৱৰ্কত ছাইন ইন কৰক"</string> + <string name="ssl_error_warning" msgid="3127935140338254180">"আপুনি সংযোগ কৰিবলৈ বিচৰা নেটৱৰ্কটোত সুৰক্ষাজনিত সমস্যা আছে।"</string> + <string name="ssl_error_example" msgid="6188711843183058764">"উদাহৰণ স্বৰূপে, আপোনাক দেখুওৱা লগ ইনৰ পৃষ্ঠাটো প্ৰতিষ্ঠানটোৰ নিজা নহ\'বও পাৰে।"</string> + <string name="ssl_error_continue" msgid="1138548463994095584">"তথাপিও ব্ৰাউজাৰৰ জৰিয়তে অব্যাহত ৰাখক"</string> +</resources> diff --git a/packages/DefaultContainerService/res/values-as/strings.xml b/packages/DefaultContainerService/res/values-as/strings.xml new file mode 100644 index 000000000000..1b6391c8b967 --- /dev/null +++ b/packages/DefaultContainerService/res/values-as/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="service_name" msgid="4841491635055379553">"পেকেজ চোৱা সহায়ক"</string> +</resources> diff --git a/packages/DefaultContainerService/res/values-or/strings.xml b/packages/DefaultContainerService/res/values-or/strings.xml new file mode 100644 index 000000000000..394c2782921a --- /dev/null +++ b/packages/DefaultContainerService/res/values-or/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2008, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="service_name" msgid="4841491635055379553">"ପ୍ୟାକେଜ୍ ଆକ୍ସେସ୍ ସହାୟକ"</string> +</resources> diff --git a/packages/ExternalStorageProvider/res/values-as/strings.xml b/packages/ExternalStorageProvider/res/values-as/strings.xml new file mode 100644 index 000000000000..278b84e15a30 --- /dev/null +++ b/packages/ExternalStorageProvider/res/values-as/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7123375275748530234">"বাহ্যিক সঞ্চয়াগাৰ"</string> + <string name="storage_description" msgid="8541974407321172792">"স্থানীয় সঞ্চয়াগাৰ"</string> + <string name="root_internal_storage" msgid="827844243068584127">"আভ্যন্তৰীণ সঞ্চয়াগাৰ"</string> + <string name="root_documents" msgid="4051252304075469250">"নথিপত্রসমূহ"</string> +</resources> diff --git a/packages/ExternalStorageProvider/res/values-or/strings.xml b/packages/ExternalStorageProvider/res/values-or/strings.xml new file mode 100644 index 000000000000..034d8a4ae5f7 --- /dev/null +++ b/packages/ExternalStorageProvider/res/values-or/strings.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7123375275748530234">"ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string> + <!-- no translation found for storage_description (8541974407321172792) --> + <skip /> + <string name="root_internal_storage" msgid="827844243068584127">"ଇଣ୍ଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string> + <string name="root_documents" msgid="4051252304075469250">"ଡକ୍ୟୁମେଣ୍ଟ"</string> +</resources> diff --git a/packages/FusedLocation/res/values-as/strings.xml b/packages/FusedLocation/res/values-as/strings.xml new file mode 100644 index 000000000000..0d2cccc66dc0 --- /dev/null +++ b/packages/FusedLocation/res/values-as/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="5379477904423203699">"Fused Location"</string> +</resources> diff --git a/packages/FusedLocation/res/values-or/strings.xml b/packages/FusedLocation/res/values-or/strings.xml new file mode 100644 index 000000000000..b95bc37a1667 --- /dev/null +++ b/packages/FusedLocation/res/values-or/strings.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="5379477904423203699">"ଫ୍ୟୁଜ୍ଡ୍ ଲୋକେଶନ୍"</string> +</resources> diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml new file mode 100644 index 000000000000..26da1b15460f --- /dev/null +++ b/packages/InputDevices/res/values-as/strings.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="8016145283189546017">"ইনপুট ডিভাইচসমূহ"</string> + <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android কীব\'ৰ্ড"</string> + <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ইংৰাজী (ইউ. কে.)"</string> + <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ইংৰাজী ( ইউ. এছ.)"</string> + <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ইংৰাজী (ইউ. কে.), আন্তঃৰাষ্ট্ৰীয় ষ্টাইল"</string> + <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ইংৰাজী (ইউ. কে.), ক\'লমেক ষ্টাইল"</string> + <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ইংৰাজী (ইউ. কে.), ডভ\'ৰাক ষ্টাইল"</string> + <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) --> + <skip /> + <string name="keyboard_layout_german_label" msgid="8451565865467909999">"জাৰ্মান"</string> + <string name="keyboard_layout_french_label" msgid="813450119589383723">"ফৰাচী"</string> + <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ফৰাচী (কানাডা)"</string> + <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ৰাছিয়ান"</string> + <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ৰাছিয়ান, মেক ষ্টাইল"</string> + <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"স্পেনিশ্ব"</string> + <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ছুইছ ফৰাচী"</string> + <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ছুইছ জাৰ্মান"</string> + <string name="keyboard_layout_belgian" msgid="2011984572838651558">"বেলজিয়ান"</string> + <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"বুলগেৰিয়ান"</string> + <string name="keyboard_layout_italian" msgid="6497079660449781213">"ইটালিয়ান"</string> + <string name="keyboard_layout_danish" msgid="8036432066627127851">"ডেনিশ্ব"</string> + <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ন\'ৰৱেয়ান"</string> + <string name="keyboard_layout_swedish" msgid="732959109088479351">"ছুইডিশ্ব"</string> + <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ফিনিশ্ব"</string> + <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ক্ৰ\'ৱেশ্বিয়ান"</string> + <string name="keyboard_layout_czech" msgid="1349256901452975343">"চ্চেক"</string> + <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ইষ্ট\'নিয়া"</string> + <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"হাংগেৰিয়ান"</string> + <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"আইচলেণ্ডিক"</string> + <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ব্ৰাজিলিয়ান"</string> + <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"পৰ্টুগীজ"</string> + <string name="keyboard_layout_slovak" msgid="2469379934672837296">"শ্ল\'ভাক"</string> + <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"শ্ল\'ভেনিয়া"</string> + <string name="keyboard_layout_turkish" msgid="7736163250907964898">"তুৰ্কী"</string> + <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ইউক্ৰেনিয়ান"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"আৰবী"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"গ্ৰীক"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"হিব্ৰু"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"লিথুৱানিয়ান"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"স্পেনিশ্ব (লেটিন)"</string> + <string name="keyboard_layout_latvian" msgid="4405417142306250595">"লাটভিয়ান"</string> + <!-- no translation found for keyboard_layout_persian (3920643161015888527) --> + <skip /> + <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) --> + <skip /> +</resources> diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml new file mode 100644 index 000000000000..2b982da5cf0a --- /dev/null +++ b/packages/InputDevices/res/values-or/strings.xml @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="8016145283189546017">"ଇନପୁଟ୍ ଡିଭାଇସ୍"</string> + <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android କୀ’ବୋର୍ଡ"</string> + <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ଇଂରାଜୀ (ୟୁକେ)"</string> + <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ଇଂରାଜୀ (ୟୁଏସ୍)"</string> + <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ଇଂରାଜୀ (ୟୁଏସ୍), ଇଣ୍ଟରନେସନାଲ୍ ଷ୍ଟାଇଲ୍"</string> + <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ଇଂରାଜୀ (ୟୁଏସ୍), କୋଲେମକ୍ ଷ୍ଟାଇଲ୍"</string> + <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ଇଂରାଜୀ (ୟୁଏସ୍), ଡଭୋରାକ୍ ଷ୍ଟାଇଲ୍"</string> + <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) --> + <skip /> + <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ଜର୍ମାନ୍"</string> + <string name="keyboard_layout_french_label" msgid="813450119589383723">"ଫ୍ରେଞ୍ଚ"</string> + <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ଫ୍ରେଞ୍ଚ (କାନାଡ଼ା)"</string> + <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ଋଷିଆନ୍"</string> + <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ଋଷିଆନ୍, ମ୍ୟାକ୍ ଷ୍ଟାଇଲ୍"</string> + <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ସ୍ପାନିଶ୍"</string> + <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ସୁଇସ୍ ଫ୍ରେଞ୍ଚ"</string> + <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ସୁଇସ୍ ଜର୍ମାନ୍"</string> + <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ବେଲ୍ଜିଆନ୍"</string> + <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ବୁଲଗାରିଆନ୍"</string> + <string name="keyboard_layout_italian" msgid="6497079660449781213">"ଇଟାଲିୟାନ୍"</string> + <string name="keyboard_layout_danish" msgid="8036432066627127851">"ଡାନିଶ୍"</string> + <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ନରୱେଜିଆନ୍"</string> + <string name="keyboard_layout_swedish" msgid="732959109088479351">"ସ୍ଵେଡିଶ୍"</string> + <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ଫିନ୍ନିଶ୍"</string> + <string name="keyboard_layout_croatian" msgid="4172229471079281138">"କ୍ରୋଆଶିଆନ୍"</string> + <string name="keyboard_layout_czech" msgid="1349256901452975343">"ଚେକ୍"</string> + <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ଇଷ୍ଟୋନିଆନ୍"</string> + <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ହଙ୍ଗେରିଆନ୍"</string> + <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ଆଇସଲାଣ୍ଡିକ୍"</string> + <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ବ୍ରାଜିଲିୟାନ୍"</string> + <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ପର୍ତ୍ତୁଗୀଜ୍"</string> + <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ସ୍ଲୋଭାକ୍"</string> + <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ସ୍ଲୋଭେନିଆନ୍"</string> + <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ତୁର୍କିସ୍"</string> + <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ୟୁକ୍ରାନିଆନ୍"</string> + <string name="keyboard_layout_arabic" msgid="5671970465174968712">"ଆରବିକ୍"</string> + <string name="keyboard_layout_greek" msgid="7289253560162386040">"ଗ୍ରୀକ୍"</string> + <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ହିବ୍ର୍ୟୁ"</string> + <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ଲିଥୁଆନିଆନ୍"</string> + <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ସ୍ପାନିଶ୍ (ଲାଟିନ୍)"</string> + <string name="keyboard_layout_latvian" msgid="4405417142306250595">"ଲାଟିଭିଆନ୍"</string> + <!-- no translation found for keyboard_layout_persian (3920643161015888527) --> + <skip /> + <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) --> + <skip /> +</resources> diff --git a/packages/MtpDocumentsProvider/res/values-bs/strings.xml b/packages/MtpDocumentsProvider/res/values-bs/strings.xml index 33323f81f81a..18c2363356fc 100644 --- a/packages/MtpDocumentsProvider/res/values-bs/strings.xml +++ b/packages/MtpDocumentsProvider/res/values-bs/strings.xml @@ -19,7 +19,7 @@ <string name="app_label" msgid="6271216747302322594">"MTP Host"</string> <string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string> <string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string> - <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje datotekama iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> + <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje fajlovima iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string> <string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Nećete moći prenositi fajlove dok ne bude dostupan."</string> <string name="error_locked_device" msgid="7557872102188356147">"Fajlovi nisu pronađeni. Moguće je da je drugi uređaj zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string> </resources> diff --git a/packages/PrintSpooler/res/values-as/strings.xml b/packages/PrintSpooler/res/values-as/strings.xml new file mode 100644 index 000000000000..2beaac8c2f51 --- /dev/null +++ b/packages/PrintSpooler/res/values-as/strings.xml @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4469836075319831821">"স্পুলাৰ প্ৰিণ্ট কৰক"</string> + <string name="more_options_button" msgid="2243228396432556771">"অধিক বিকল্প"</string> + <string name="label_destination" msgid="9132510997381599275">"লক্ষ্যস্থান"</string> + <string name="label_copies" msgid="3634531042822968308">"প্ৰতিলিপিসমূহ"</string> + <string name="label_copies_summary" msgid="3861966063536529540">"প্ৰতিলিপসমূহ:"</string> + <string name="label_paper_size" msgid="908654383827777759">"কাগজৰ আকাৰ"</string> + <string name="label_paper_size_summary" msgid="5668204981332138168">"কাগজৰ আকাৰ:"</string> + <string name="label_color" msgid="1108690305218188969">"ৰং"</string> + <!-- no translation found for label_duplex (5370037254347072243) --> + <skip /> + <string name="label_orientation" msgid="2853142581990496477">"দিশ"</string> + <string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাসমূহ"</string> + <!-- no translation found for destination_default_text (5422708056807065710) --> + <skip /> + <string name="template_all_pages" msgid="3322235982020148762">"সকলো <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> + <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ৰ পৰিসৰ"</string> + <string name="pages_range_example" msgid="8558694453556945172">"যেনে: ১—৫, ৮, ১১—১৩"</string> + <string name="print_preview" msgid="8010217796057763343">"প্ৰিণ্টৰ পূৰ্বদৰ্শন"</string> + <string name="install_for_print_preview" msgid="6366303997385509332">"পূৰ্বদৰ্শনৰ বাবে PDF ভিউৱাৰ ইনষ্টল কৰক"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"প্ৰিণ্টিং এপ্ ক্ৰেশ্ব হৈছে"</string> + <string name="generating_print_job" msgid="3119608742651698916">"প্ৰিণ্টিং প্ৰস্তুত কৰি আছে"</string> + <string name="save_as_pdf" msgid="5718454119847596853">"PDF ৰূপে ছেভ কৰক"</string> + <string name="all_printers" msgid="5018829726861876202">"সকলো প্ৰিণ্টাৰ…"</string> + <string name="print_dialog" msgid="32628687461331979">"প্ৰিণ্ট সংবাদ"</string> + <!-- no translation found for current_page_template (5145005201131935302) --> + <skip /> + <string name="page_description_template" msgid="6831239682256197161">"পৃষ্ঠা <xliff:g id="PAGE_COUNT">%2$d</xliff:g>ৰ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g>"</string> + <string name="summary_template" msgid="8899734908625669193">"সাৰাংশ, প্ৰতিলিপিসমূহ <xliff:g id="COPIES">%1$s</xliff:g>, কাগজৰ আকাৰ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> + <string name="expand_handle" msgid="7282974448109280522">"হেণ্ডেল বিস্তাৰ কৰক"</string> + <string name="collapse_handle" msgid="6886637989442507451">"হেণ্ডেল সংকুচিত কৰক"</string> + <string name="print_button" msgid="645164566271246268">"প্ৰিণ্ট কৰক"</string> + <string name="savetopdf_button" msgid="2976186791686924743">"PDFৰ জৰিয়তে ছেভ কৰক"</string> + <string name="print_options_expanded" msgid="6944679157471691859">"প্ৰিণ্ট বিকল্পসমূহ বিস্তাৰ কৰা হ\'ল"</string> + <string name="print_options_collapsed" msgid="7455930445670414332">"প্ৰিণ্ট বিকল্পসমূহ সংকুচিত কৰা হ\'ল"</string> + <string name="search" msgid="5421724265322228497">"সন্ধান কৰক"</string> + <string name="all_printers_label" msgid="3178848870161526399">"সকলো প্ৰিণ্টাৰ"</string> + <string name="add_print_service_label" msgid="5356702546188981940">"সেৱা যোগ কৰক"</string> + <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"সন্ধান বাকচটো দেখুওৱা হ\'ল"</string> + <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"সন্ধান বাকচটো ঢাক খাই আছে"</string> + <string name="print_add_printer" msgid="1088656468360653455">"প্ৰিণ্টাৰ যোগ কৰক"</string> + <string name="print_select_printer" msgid="7388760939873368698">"প্ৰিণ্টাৰ বাছনি কৰক"</string> + <string name="print_forget_printer" msgid="5035287497291910766">"প্ৰিণ্টাৰ পাহৰি যাওক"</string> + <!-- no translation found for print_search_result_count_utterance (6997663738361080868) --> + <!-- no translation found for printer_extended_description_template (1366699227703381874) --> + <skip /> + <!-- no translation found for printer_info_desc (7181988788991581654) --> + <skip /> + <!-- no translation found for notification_channel_progress (872788690775721436) --> + <skip /> + <!-- no translation found for notification_channel_failure (9042250774797916414) --> + <skip /> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> + <!-- no translation found for print_services_disabled_toast (9089060734685174685) --> + <skip /> + <string name="print_searching_for_printers" msgid="6550424555079932867">"প্ৰিণ্টাৰৰ সন্ধান কৰি আছে"</string> + <!-- no translation found for print_no_print_services (8561247706423327966) --> + <skip /> + <string name="print_no_printers" msgid="4869403323900054866">"প্ৰিণ্টাৰ পোৱা নগ\'ল"</string> + <!-- no translation found for cannot_add_printer (7840348733668023106) --> + <skip /> + <!-- no translation found for select_to_add_printers (3800709038689830974) --> + <skip /> + <!-- no translation found for enable_print_service (3482815747043533842) --> + <skip /> + <!-- no translation found for enabled_services_title (7036986099096582296) --> + <skip /> + <!-- no translation found for recommended_services_title (3799434882937956924) --> + <skip /> + <!-- no translation found for disabled_services_title (7313253167968363211) --> + <skip /> + <!-- no translation found for all_services_title (5578662754874906455) --> + <skip /> + <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) --> + <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্ট কৰি থকা হৈছে"</string> + <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> বাতিল কৰি থকা হৈছে"</string> + <string name="failed_notification_title_template" msgid="2256217208186530973">"প্ৰিণ্টাৰৰ আসোঁৱাহ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="blocked_notification_title_template" msgid="1175435827331588646">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্টাৰে অৱৰোধ কৰিছে"</string> + <string name="cancel" msgid="4373674107267141885">"বাতিল কৰক"</string> + <string name="restart" msgid="2472034227037808749">"ৰিষ্টাৰ্ট কৰক"</string> + <string name="no_connection_to_printer" msgid="2159246915977282728">"প্ৰিণ্টাৰ সংযোগ হৈ থকা নাই"</string> + <string name="reason_unknown" msgid="5507940196503246139">"অজ্ঞাত"</string> + <!-- no translation found for print_service_security_warning_title (2160752291246775320) --> + <skip /> + <!-- no translation found for print_service_security_warning_summary (1427434625361692006) --> + <skip /> + <string-array name="color_mode_labels"> + <item msgid="7602948745415174937">"ক\'লা আৰু বগা"</item> + <item msgid="2762241247228983754">"ৰং"</item> + </string-array> + <string-array name="duplex_mode_labels"> + <item msgid="3882302912790928315">"একো নাই"</item> + <item msgid="7296563835355641719">"দীঘল প্ৰান্ত"</item> + <item msgid="79513688117503758">"চুটি প্ৰান্ত"</item> + </string-array> + <string-array name="orientation_labels"> + <item msgid="4061931020926489228">"প\'ৰ্ট্ৰেইট"</item> + <item msgid="3199660090246166812">"লেণ্ডস্কেইপ"</item> + </string-array> + <string name="print_write_error_message" msgid="5787642615179572543">"ফাইলত লিখিব পৰা নহ\'ল"</string> + <string name="print_error_default_message" msgid="8602678405502922346">"দুঃখিত, প্ৰিণ্টিঙৰ কাম নহ\'ল। পুনৰ চেষ্টা কৰক।"</string> + <string name="print_error_retry" msgid="1426421728784259538">"পুনৰ চেষ্টা কৰক"</string> + <string name="print_error_printer_unavailable" msgid="8985614415253203381">"এই প্ৰিণ্টাৰটো বৰ্তমান উপলব্ধ নহয়।"</string> + <!-- no translation found for print_cannot_load_page (6179560924492912009) --> + <skip /> + <string name="print_preparing_preview" msgid="3939930735671364712">"পূৰ্বদৰ্শন প্ৰস্তুত কৰি আছে…"</string> +</resources> diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml new file mode 100644 index 000000000000..bfe4bfe727d6 --- /dev/null +++ b/packages/PrintSpooler/res/values-or/strings.xml @@ -0,0 +1,127 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="4469836075319831821">"ପ୍ରିଣ୍ଟ ସ୍ପୁଲର୍"</string> + <string name="more_options_button" msgid="2243228396432556771">"ଅଧିକ ବିକଳ୍ପ"</string> + <string name="label_destination" msgid="9132510997381599275">"ଲକ୍ଷ୍ୟସ୍ଥଳ"</string> + <string name="label_copies" msgid="3634531042822968308">"କପୀଗୁଡ଼ିକ"</string> + <string name="label_copies_summary" msgid="3861966063536529540">"କପୀଗୁଡ଼ିକ:"</string> + <string name="label_paper_size" msgid="908654383827777759">"କାଗଜର ଆକାର"</string> + <string name="label_paper_size_summary" msgid="5668204981332138168">"କାଗଜର ଆକାର:"</string> + <string name="label_color" msgid="1108690305218188969">"ରଙ୍ଗ"</string> + <string name="label_duplex" msgid="5370037254347072243">"ଦୁଇ-ତରଫା"</string> + <string name="label_orientation" msgid="2853142581990496477">"ଓରିଏଣ୍ଟେଶନ୍"</string> + <string name="label_pages" msgid="7768589729282182230">"ପୃଷ୍ଠା"</string> + <!-- no translation found for destination_default_text (5422708056807065710) --> + <skip /> + <string name="template_all_pages" msgid="3322235982020148762">"ସମସ୍ତ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string> + <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ର ରେଞ୍ଜ"</string> + <string name="pages_range_example" msgid="8558694453556945172">"ଯେପରିକି 1—5,8,11—13"</string> + <string name="print_preview" msgid="8010217796057763343">"ପ୍ରିଣ୍ଟ ଝଲକ"</string> + <string name="install_for_print_preview" msgid="6366303997385509332">"ଝଲକ ଦେଖିବା ପାଇଁ PDF ଭ୍ୟୁଅର୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="printing_app_crashed" msgid="854477616686566398">"ପ୍ରିଣ୍ଟିଙ୍ଗ ଆପ୍ କ୍ରାଶ୍ ହୋଇଗଲା"</string> + <string name="generating_print_job" msgid="3119608742651698916">"ପ୍ରିଣ୍ଟ ଜବ୍ ତିଆରି କରାଯାଉଛି"</string> + <string name="save_as_pdf" msgid="5718454119847596853">"PDF ଭାବରେ ସେଭ୍ କରନ୍ତୁ"</string> + <string name="all_printers" msgid="5018829726861876202">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍…"</string> + <string name="print_dialog" msgid="32628687461331979">"ପ୍ରିଣ୍ଟ ଡାୟଲଗ୍"</string> + <!-- no translation found for current_page_template (5145005201131935302) --> + <skip /> + <string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="PAGE_COUNT">%2$d</xliff:g>ରୁ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ପୃଷ୍ଠା"</string> + <string name="summary_template" msgid="8899734908625669193">"ସାରାଂଶ, କପୀ <xliff:g id="COPIES">%1$s</xliff:g>, କାଗଜ ଆକାର <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string> + <string name="expand_handle" msgid="7282974448109280522">"ହ୍ୟାଣ୍ଡେଲ୍ ବଡ଼ କରନ୍ତୁ"</string> + <string name="collapse_handle" msgid="6886637989442507451">"ହ୍ୟାଣ୍ଡେଲ୍ ଛୋଟ କରନ୍ତୁ"</string> + <string name="print_button" msgid="645164566271246268">"ପ୍ରିଣ୍ଟ କରନ୍ତୁ"</string> + <string name="savetopdf_button" msgid="2976186791686924743">"PDFରେ ସେଭ୍ କରନ୍ତୁ"</string> + <string name="print_options_expanded" msgid="6944679157471691859">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ବଡ଼ କରାଯାଇଛି"</string> + <string name="print_options_collapsed" msgid="7455930445670414332">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ଛୋଟ କରାଯାଇଛି"</string> + <string name="search" msgid="5421724265322228497">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> + <string name="all_printers_label" msgid="3178848870161526399">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍"</string> + <string name="add_print_service_label" msgid="5356702546188981940">"ସେବା ଯୋଡ଼ନ୍ତୁ"</string> + <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ସର୍ଚ୍ଚ ବକ୍ସ ଦେଖାଯାଇଛି"</string> + <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ସର୍ଚ୍ଚ ବକ୍ସ ଲୁଚି ରହିଛି"</string> + <string name="print_add_printer" msgid="1088656468360653455">"ପ୍ରିଣ୍ଟର୍ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="print_select_printer" msgid="7388760939873368698">"ପ୍ରିଣ୍ଟର୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="print_forget_printer" msgid="5035287497291910766">"ପ୍ରିଣ୍ଟର୍ ଭୁଲିଯାଆନ୍ତୁ"</string> + <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868"> + <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item> + <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item> + </plurals> + <!-- no translation found for printer_extended_description_template (1366699227703381874) --> + <skip /> + <!-- no translation found for printer_info_desc (7181988788991581654) --> + <skip /> + <!-- no translation found for notification_channel_progress (872788690775721436) --> + <skip /> + <!-- no translation found for notification_channel_failure (9042250774797916414) --> + <skip /> + <!-- no translation found for could_not_create_file (3425025039427448443) --> + <skip /> + <!-- no translation found for print_services_disabled_toast (9089060734685174685) --> + <skip /> + <string name="print_searching_for_printers" msgid="6550424555079932867">"ପ୍ରିଣ୍ଟର୍ ଖୋଜାଯାଉଛି"</string> + <!-- no translation found for print_no_print_services (8561247706423327966) --> + <skip /> + <string name="print_no_printers" msgid="4869403323900054866">"କୌଣସି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା ନାହିଁ"</string> + <!-- no translation found for cannot_add_printer (7840348733668023106) --> + <skip /> + <!-- no translation found for select_to_add_printers (3800709038689830974) --> + <skip /> + <!-- no translation found for enable_print_service (3482815747043533842) --> + <skip /> + <!-- no translation found for enabled_services_title (7036986099096582296) --> + <skip /> + <!-- no translation found for recommended_services_title (3799434882937956924) --> + <skip /> + <!-- no translation found for disabled_services_title (7313253167968363211) --> + <skip /> + <!-- no translation found for all_services_title (5578662754874906455) --> + <skip /> + <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) --> + <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟ କରାଯାଉଛି"</string> + <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> କ୍ୟାନ୍ସଲ୍ କରାଯାଉଛି"</string> + <string name="failed_notification_title_template" msgid="2256217208186530973">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟର୍ ତ୍ରୁଟି"</string> + <string name="blocked_notification_title_template" msgid="1175435827331588646">"ପ୍ରିଣ୍ଟର୍ ଦ୍ୱାରା ରୋକାଯାଇଥିବା <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string> + <string name="cancel" msgid="4373674107267141885">"କ୍ୟାନ୍ସଲ୍"</string> + <string name="restart" msgid="2472034227037808749">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string> + <string name="no_connection_to_printer" msgid="2159246915977282728">"ପ୍ରିଣ୍ଟର୍କୁ କୌଣସି ସଂଯୋଗ ନାହିଁ"</string> + <string name="reason_unknown" msgid="5507940196503246139">"ଅଜଣା"</string> + <!-- no translation found for print_service_security_warning_title (2160752291246775320) --> + <skip /> + <!-- no translation found for print_service_security_warning_summary (1427434625361692006) --> + <skip /> + <string-array name="color_mode_labels"> + <item msgid="7602948745415174937">"କଳା ଓ ଧଳା"</item> + <item msgid="2762241247228983754">"ରଙ୍ଗ"</item> + </string-array> + <string-array name="duplex_mode_labels"> + <item msgid="3882302912790928315">"କିଛିନୁହେଁ"</item> + <item msgid="7296563835355641719">"ଲମ୍ବା ପ୍ରାନ୍ତ"</item> + <item msgid="79513688117503758">"ଛୋଟ ପ୍ରାନ୍ତ"</item> + </string-array> + <string-array name="orientation_labels"> + <item msgid="4061931020926489228">"ପୋର୍ଟ୍ରେଟ୍"</item> + <item msgid="3199660090246166812">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍"</item> + </string-array> + <string name="print_write_error_message" msgid="5787642615179572543">"ଫାଇଲରେ ଲେଖିପାରିଲା ନାହିଁ"</string> + <string name="print_error_default_message" msgid="8602678405502922346">"କାମ କଲାନାହିଁ, ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ"</string> + <string name="print_error_retry" msgid="1426421728784259538">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string> + <string name="print_error_printer_unavailable" msgid="8985614415253203381">"ପ୍ରିଣ୍ଟର୍ ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ନାହିଁ।"</string> + <!-- no translation found for print_cannot_load_page (6179560924492912009) --> + <skip /> + <string name="print_preparing_preview" msgid="3939930735671364712">"ଝଲକ ତିଆରି କରାଯାଉଛି…"</string> +</resources> diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java index 06723c33814d..24449fd393a0 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java @@ -16,6 +16,8 @@ package com.android.printspooler.model; +import static android.content.Context.BIND_AUTO_CREATE; + import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -32,7 +34,7 @@ public class PrintSpoolerProvider implements ServiceConnection { mContext = context; mCallback = callback; Intent intent = new Intent(mContext, PrintSpoolerService.class); - mContext.bindService(intent, this, 0); + mContext.bindService(intent, this, BIND_AUTO_CREATE); } public PrintSpoolerService getSpooler() { diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java index 53e8813c7363..eba5edbf6d68 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java @@ -31,6 +31,7 @@ import android.graphics.drawable.Icon; import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; +import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.ParcelFileDescriptor; @@ -58,11 +59,11 @@ import android.util.Xml; import android.util.proto.ProtoOutputStream; import com.android.internal.logging.MetricsLogger; -import com.android.internal.os.HandlerCaller; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.internal.util.dump.DualDumpOutputStream; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.printspooler.R; import com.android.printspooler.util.ApprovedPrintServices; @@ -116,8 +117,6 @@ public final class PrintSpoolerService extends Service { private IPrintSpoolerClient mClient; - private HandlerCaller mHandlerCaller; - private PersistenceManager mPersistanceManager; private NotificationController mNotificationController; @@ -134,8 +133,6 @@ public final class PrintSpoolerService extends Service { @Override public void onCreate() { super.onCreate(); - mHandlerCaller = new HandlerCaller(this, getMainLooper(), - new HandlerCallerCallback(), false); mPersistanceManager = new PersistenceManager(); mNotificationController = new NotificationController(PrintSpoolerService.this); @@ -230,93 +227,73 @@ public final class PrintSpoolerService extends Service { } private void sendOnPrintJobQueued(PrintJobInfo printJob) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_QUEUED, printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobQueued, this, printJob); + Handler.getMain().executeOrSendMessage(message); } private void sendOnAllPrintJobsForServiceHandled(ComponentName service) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED, service); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onAllPrintJobsForServiceHandled, this, service); + Handler.getMain().executeOrSendMessage(message); } private void sendOnAllPrintJobsHandled() { - Message message = mHandlerCaller.obtainMessage( - HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_HANDLED); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onAllPrintJobsHandled, this); + Handler.getMain().executeOrSendMessage(message); } - private final class HandlerCallerCallback implements HandlerCaller.Callback { - public static final int MSG_SET_CLIENT = 1; - public static final int MSG_ON_PRINT_JOB_QUEUED = 2; - public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 3; - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 4; - public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 5; - public static final int MSG_ON_PRINT_JOB_STATE_CHANGED = 6; - - @Override - public void executeMessage(Message message) { - switch (message.what) { - case MSG_SET_CLIENT: { - synchronized (mLock) { - mClient = (IPrintSpoolerClient) message.obj; - if (mClient != null) { - Message msg = mHandlerCaller.obtainMessage( - HandlerCallerCallback.MSG_CHECK_ALL_PRINTJOBS_HANDLED); - mHandlerCaller.sendMessageDelayed(msg, - CHECK_ALL_PRINTJOBS_HANDLED_DELAY); - } - } - } break; - case MSG_ON_PRINT_JOB_QUEUED: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - if (mClient != null) { - try { - mClient.onPrintJobQueued(printJob); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for a queued print job.", re); - } - } - } break; + private void onPrintJobStateChanged(PrintJobInfo printJob) { + if (mClient != null) { + try { + mClient.onPrintJobStateChanged(printJob); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for print job state change.", re); + } + } + } - case MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED: { - ComponentName service = (ComponentName) message.obj; - if (mClient != null) { - try { - mClient.onAllPrintJobsForServiceHandled(service); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for all print jobs per service" - + " handled.", re); - } - } - } break; + private void onAllPrintJobsHandled() { + if (mClient != null) { + try { + mClient.onAllPrintJobsHandled(); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for all print job handled.", re); + } + } + } - case MSG_ON_ALL_PRINT_JOBS_HANDLED: { - if (mClient != null) { - try { - mClient.onAllPrintJobsHandled(); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for all print job handled.", re); - } - } - } break; + private void onAllPrintJobsForServiceHandled(ComponentName service) { + if (mClient != null) { + try { + mClient.onAllPrintJobsForServiceHandled(service); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for all print jobs per service" + + " handled.", re); + } + } + } - case MSG_CHECK_ALL_PRINTJOBS_HANDLED: { - checkAllPrintJobsHandled(); - } break; + private void onPrintJobQueued(PrintJobInfo printJob) { + if (mClient != null) { + try { + mClient.onPrintJobQueued(printJob); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error notify for a queued print job.", re); + } + } + } - case MSG_ON_PRINT_JOB_STATE_CHANGED: { - if (mClient != null) { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - try { - mClient.onPrintJobStateChanged(printJob); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error notify for print job state change.", re); - } - } - } break; + private void setClient(IPrintSpoolerClient client) { + synchronized (mLock) { + mClient = client; + if (mClient != null) { + Message msg = PooledLambda.obtainMessage( + PrintSpoolerService::checkAllPrintJobsHandled, this); + Handler.getMain().sendMessageDelayed(msg, + CHECK_ALL_PRINTJOBS_HANDLED_DELAY); } } } @@ -379,10 +356,9 @@ public final class PrintSpoolerService extends Service { addPrintJobLocked(printJob); setPrintJobState(printJob.getId(), PrintJobInfo.STATE_CREATED, null); - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); } } @@ -546,10 +522,9 @@ public final class PrintSpoolerService extends Service { * @param printJob The updated print job. */ private void notifyPrintJobUpdated(PrintJobInfo printJob) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); mNotificationController.onUpdateNotifications(mPrintJobs); } @@ -742,10 +717,9 @@ public final class PrintSpoolerService extends Service { } mNotificationController.onUpdateNotifications(mPrintJobs); - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED, - printJob); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::onPrintJobStateChanged, this, printJob); + Handler.getMain().executeOrSendMessage(message); } } } @@ -1472,9 +1446,9 @@ public final class PrintSpoolerService extends Service { @Override public void setClient(IPrintSpoolerClient client) { - Message message = mHandlerCaller.obtainMessageO( - HandlerCallerCallback.MSG_SET_CLIENT, client); - mHandlerCaller.executeOrSendMessage(message); + Message message = PooledLambda.obtainMessage( + PrintSpoolerService::setClient, PrintSpoolerService.this, client); + Handler.getMain().executeOrSendMessage(message); } @Override diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java index b6a003de0eb9..164454690d46 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java @@ -16,7 +16,6 @@ package com.android.printspooler.model; -import android.annotation.NonNull; import android.content.ContentResolver; import android.content.Context; import android.net.Uri; @@ -39,6 +38,7 @@ import android.print.PrintDocumentAdapter; import android.print.PrintDocumentInfo; import android.util.Log; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.printspooler.R; import com.android.printspooler.util.PageRangeUtils; @@ -549,6 +549,9 @@ public final class RemotePrintDocument { } private static abstract class AsyncCommand implements Runnable { + /** Message indicated the desire to {@link #forceCancel} a command */ + static final int MSG_FORCE_CANCEL = 0; + private static final int STATE_PENDING = 0; private static final int STATE_RUNNING = 1; private static final int STATE_COMPLETED = 2; @@ -574,7 +577,7 @@ public final class RemotePrintDocument { public AsyncCommand(Looper looper, IPrintDocumentAdapter adapter, RemotePrintDocumentInfo document, CommandDoneCallback doneCallback) { - mHandler = new AsyncCommandHandler(looper); + mHandler = new Handler(looper); mAdapter = adapter; mDocument = document; mDoneCallback = doneCallback; @@ -594,12 +597,12 @@ public final class RemotePrintDocument { */ protected void removeForceCancel() { if (DEBUG) { - if (mHandler.hasMessages(AsyncCommandHandler.MSG_FORCE_CANCEL)) { + if (mHandler.hasMessages(MSG_FORCE_CANCEL)) { Log.i(LOG_TAG, "[FORCE CANCEL] Removed"); } } - mHandler.removeMessages(AsyncCommandHandler.MSG_FORCE_CANCEL); + mHandler.removeMessages(MSG_FORCE_CANCEL); } /** @@ -628,7 +631,8 @@ public final class RemotePrintDocument { Log.i(LOG_TAG, "[FORCE CANCEL] queued"); } mHandler.sendMessageDelayed( - mHandler.obtainMessage(AsyncCommandHandler.MSG_FORCE_CANCEL), + PooledLambda.obtainMessage(AsyncCommand::forceCancel, this) + .setWhat(MSG_FORCE_CANCEL), FORCE_CANCEL_TIMEOUT); } @@ -698,34 +702,15 @@ public final class RemotePrintDocument { return mError; } - /** - * Handler for the async command. - */ - private class AsyncCommandHandler extends Handler { - /** Message indicated the desire for to force cancel a command */ - final static int MSG_FORCE_CANCEL = 0; - - AsyncCommandHandler(@NonNull Looper looper) { - super(looper); - } - - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_FORCE_CANCEL: - if (isCanceling()) { - if (DEBUG) { - Log.i(LOG_TAG, "[FORCE CANCEL] executed"); - } - failed("Command did not respond to cancellation in " - + FORCE_CANCEL_TIMEOUT + " ms"); - - mDoneCallback.onDone(); - } - break; - default: - // not reached; + private void forceCancel() { + if (isCanceling()) { + if (DEBUG) { + Log.i(LOG_TAG, "[FORCE CANCEL] executed"); } + failed("Command did not respond to cancellation in " + + FORCE_CANCEL_TIMEOUT + " ms"); + + mDoneCallback.onDone(); } } } diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index d73a5d73e5bf..83d7e1666809 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -306,19 +306,22 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat // This will take just a few milliseconds, so just wait to // bind to the local service before showing the UI. mSpoolerProvider = new PrintSpoolerProvider(this, - new Runnable() { - @Override - public void run() { - if (isFinishing() || isDestroyed()) { - // onPause might have not been able to cancel the job, see PrintActivity#onPause - // To be sure, cancel the job again. Double canceling does no harm. - mSpoolerProvider.getSpooler().setPrintJobState(mPrintJob.getId(), - PrintJobInfo.STATE_CANCELED, null); - } else { - onConnectedToPrintSpooler(adapter); - } - } - }); + () -> { + if (isFinishing() || isDestroyed()) { + if (savedInstanceState != null) { + // onPause might have not been able to cancel the job, see + // PrintActivity#onPause + // To be sure, cancel the job again. Double canceling does no harm. + mSpoolerProvider.getSpooler().setPrintJobState(mPrintJob.getId(), + PrintJobInfo.STATE_CANCELED, null); + } + } else { + if (savedInstanceState == null) { + mSpoolerProvider.getSpooler().createPrintJob(mPrintJob); + } + onConnectedToPrintSpooler(adapter); + } + }); getLoaderManager().initLoader(LOADER_ID_ENABLED_PRINT_SERVICES, null, this); } diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index f2c05bfd32a4..6c8c69a30f47 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"የሲም መዳረሻ"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"ኤችዲ ኦዲዮ፦ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"ኤችዲ ኦዲዮ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"መስሚያ አጋዥ መሣሪያ"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ከመስሚያ አጋዥ መሣሪያ ጋር ተገናኝቷል"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ወደ ማህደረ መረጃ አውዲዮ ተያይዟል"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ወደ ስልክ አውዲዮ ተያይዟል"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ወደ ፋይል ዝውውር አገልጋይ ተያይዟል"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ለስልክ ድምፅ ተጠቀም"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ለፋይል ዝውውር ተጠቀም"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ለውፅአት ተጠቀም"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ለመስሚያ አጋዥ መሣሪያ ተጠቀም"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"አጣምር"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"አጣምር"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ይቅር"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 6acc8e983d1d..40c16b9f8aa4 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"الوصول إلى شريحة SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"صوت عالي الدقة: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"صوت عالي الدقة"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"سماعة الأذن الطبية"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"تم توصيل سماعة الأذن الطبية"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"متصل بالإعدادات الصوتية للوسائط"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"متصل بالإعدادات الصوتية للهاتف"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"متصل بخادم نقل الملف"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"الاستخدام لإعدادات الهاتف الصوتية"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"استخدامه لنقل الملفات"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"استخدام للإدخال"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"استخدام سماعة الأذن الطبية"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"اقتران"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"إقران"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"إلغاء"</string> diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml new file mode 100644 index 000000000000..0eff708a252e --- /dev/null +++ b/packages/SettingsLib/res/values-as/arrays.xml @@ -0,0 +1,253 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wifi_status"> + <item msgid="1922181315419294640"></item> + <item msgid="8934131797783724664">"স্কেন কৰি থকা হৈছে…"</item> + <item msgid="8513729475867537913">"সংযোগ কৰি থকা হৈছে…"</item> + <item msgid="515055375277271756">"বিস্বাশযোগ্যতা প্ৰমাণ কৰি থকা হৈছে …"</item> + <item msgid="1943354004029184381">"আইপি ঠিকনা সংগ্ৰহ কৰি থকা হৈছে…"</item> + <item msgid="4221763391123233270">"সংযোগ কৰা হ’ল"</item> + <item msgid="624838831631122137">"স্থগিত"</item> + <item msgid="7979680559596111948">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে"</item> + <item msgid="1634960474403853625">"সংযোগ বিচ্ছিন্ন"</item> + <item msgid="746097431216080650">"অসফল"</item> + <item msgid="6367044185730295334">"অৱৰোধিত"</item> + <item msgid="503942654197908005">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item> + </string-array> + <string-array name="wifi_status_with_ssid"> + <item msgid="7714855332363650812"></item> + <item msgid="8878186979715711006">"স্কেন কৰি থকা হৈছে…"</item> + <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰি থকা হৈছে…"</item> + <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ জৰিয়তে সত্যাপন কৰি থকা হৈছে…"</item> + <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ আইপি ঠিকনা পৰা সংগ্ৰহ কৰি থকা হৈছে…"</item> + <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰা হ\'ল"</item> + <item msgid="1330262655415760617">"স্থগিত"</item> + <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ পৰা সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</item> + <item msgid="197508606402264311">"সংযোগ বিচ্ছিন্ন"</item> + <item msgid="8578370891960825148">"বিফল হৈছে"</item> + <item msgid="5660739516542454527">"অৱৰোধিত"</item> + <item msgid="1805837518286731242">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item> + </string-array> + <string-array name="hdcp_checking_titles"> + <item msgid="441827799230089869">"কেতিয়াও পৰীক্ষা নকৰিব"</item> + <item msgid="6042769699089883931">"কেৱল DRM সমলৰ বাবে পৰীক্ষা কৰক"</item> + <item msgid="9174900380056846820">"সদায় পৰীক্ষা কৰক"</item> + </string-array> + <string-array name="hdcp_checking_summaries"> + <item msgid="505558545611516707">"কেতিয়াও HDCP পৰীক্ষণ ব্যৱহাৰ নকৰিব"</item> + <item msgid="3878793616631049349">"কেৱল DRM সমলৰ বাবে HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item> + <item msgid="45075631231212732">"সদায় HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item> + </string-array> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP ১.৪ (ডিফ’ল্ট)"</item> + <item msgid="2809759619990248160">"AVRCP ১.৩"</item> + <item msgid="6199178154704729352">"AVRCP ১.৫"</item> + <item msgid="5172170854953034852">"AVRCP ১.৬"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="3011533352527449572">"avrcp১৩"</item> + <item msgid="8837606198371920819">"avrcp১৫"</item> + <item msgid="3422726142222090896">"avrcp১৬"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_titles"> + <item msgid="7065842274271279580">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item> + <item msgid="7539690996561263909">"এছবিচি"</item> + <item msgid="686685526567131661">"এএচি"</item> + <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিঅ\'"</item> + <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিঅ’"</item> + <item msgid="6751080638867012696">"LDAC"</item> + <item msgid="723675059572222462">"বিকল্প ক\'ডেকসমূহ সক্ষম কৰক"</item> + <item msgid="3304843301758635896">"বিকল্প ক\'ডেকসমূহ অসক্ষম কৰক"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_summaries"> + <item msgid="5062108632402595000">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফল্ট)"</item> + <item msgid="6898329690939802290">"এছবিচি"</item> + <item msgid="6839647709301342559">"এএচি"</item> + <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিঅ’"</item> + <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিঅ’"</item> + <item msgid="7950781694447359344">"LDAC"</item> + <item msgid="2209680154067241740">"বিকল্প ক\'ডেকসমূহ সক্ষম কৰক"</item> + <item msgid="741805482892725657">"ঐচ্ছিক ক’ডেকসমূহ অক্ষম কৰক"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> + <item msgid="3093023430402746802">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item> + <item msgid="8895532488906185219">"৪৪.১ কিল\'হাৰ্টজ"</item> + <item msgid="2909915718994807056">"৪৮.০ কিল’হাৰ্টজ"</item> + <item msgid="3347287377354164611">"৮৮.২ কিল\'হাৰ্টজ"</item> + <item msgid="1234212100239985373">"৯৬.০ কিল’হাৰ্টজ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_sample_rate_summaries"> + <item msgid="3214516120190965356">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ’ল্ট)"</item> + <item msgid="4482862757811638365">"৪৪.১ কিল’হাৰ্টজ"</item> + <item msgid="354495328188724404">"৪৮.০ কিল’হাৰ্টজ"</item> + <item msgid="7329816882213695083">"৮৮.২ কিল\'হাৰ্টজ"</item> + <item msgid="6967397666254430476">"৯৬.০ কিল’হাৰ্টজ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> + <item msgid="2684127272582591429">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item> + <item msgid="5618929009984956469">"১৬ বিট/নমুনা"</item> + <item msgid="3412640499234627248">"২৪ বিট/নমুনা"</item> + <item msgid="121583001492929387">"৩২ বিট/নমুনা"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> + <item msgid="1081159789834584363">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ’ল্ট)"</item> + <item msgid="4726688794884191540">"১৬ বিট/নমুনা"</item> + <item msgid="305344756485516870">"২৪ বিট/নমুনা"</item> + <item msgid="244568657919675099">"৩২ বিট/নমুনা"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> + <item msgid="5226878858503393706">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item> + <item msgid="4106832974775067314">"ম\'ন\'"</item> + <item msgid="5571632958424639155">"ষ্টেৰিঅ\'"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> + <item msgid="4118561796005528173">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item> + <item msgid="8900559293912978337">"ম\'ন\'"</item> + <item msgid="8883739882299884241">"ষ্টেৰিঅ\'"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles"> + <item msgid="7158319962230727476">"ধ্বনিৰ মানৰ বাবে অপ্টিমাইজ কৰা হৈছে (৯৯০কি.বা.প্ৰ.ছে./৯০৯কি.বা.প্ৰ.ছে.)"</item> + <item msgid="2921767058740704969">"ধ্বনি আৰু সংযোগৰ সন্তুলিত গুণগত মান (৬৬০কে.বি.প্ৰ.ছে./৬০৬কে.বি.প্ৰ.ছে."</item> + <item msgid="8860982705384396512">"সংযোগৰ ক্ষমতা অনুযায়ী সৰ্বোত্তম (৩৩০কে.বি.প্ৰ.ছে/৩০৩কে.বি.প্ৰ.ছে)"</item> + <item msgid="4414060457677684127">"সৰ্বশ্ৰেষ্ঠ প্ৰচেষ্টা (খাপ খাব পৰা ৰেইট)"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> + <item msgid="6398189564246596868">"অডিঅ\' গুণমানৰ বাবে অপ্টিমাইজ কৰা হৈছে"</item> + <item msgid="4327143584633311908">"ধ্বনি আৰু সংযোগৰ সন্তুলিত গুণগত মান"</item> + <item msgid="4681409244565426925">"সংযোগৰ ক্ষমতা অনুযায়ী সৰ্বোত্তম"</item> + <item msgid="364670732877872677">"উত্তম প্ৰচেষ্টা (খাপ খাব পৰা বিট ৰেইট)"</item> + </string-array> + <string-array name="select_logd_size_titles"> + <item msgid="8665206199209698501">"অফ কৰক"</item> + <item msgid="1593289376502312923">"৬৪কে."</item> + <item msgid="487545340236145324">"২৫৬কে."</item> + <item msgid="2423528675294333831">"১মি."</item> + <item msgid="180883774509476541">"4M"</item> + <item msgid="2803199102589126938">"১৬মি."</item> + </string-array> + <string-array name="select_logd_size_lowram_titles"> + <item msgid="6089470720451068364">"অফ কৰক"</item> + <item msgid="4622460333038586791">"৬৪কে."</item> + <item msgid="2212125625169582330">"২৫৬কে."</item> + <item msgid="1704946766699242653">"১মি."</item> + </string-array> + <string-array name="select_logd_size_summaries"> + <item msgid="6921048829791179331">"অফ কৰক"</item> + <item msgid="2969458029344750262">"প্ৰতিটো লগ বাফাৰত ৬৪কে."</item> + <item msgid="1342285115665698168">"প্ৰতি লগ বাফাৰত 256K"</item> + <item msgid="1314234299552254621">"প্ৰতিটো লগ বাফাৰত ১মি."</item> + <item msgid="3606047780792894151">"প্ৰতিটো লগ বাফাৰত ৪মি."</item> + <item msgid="5431354956856655120">"প্ৰতিটো লগ বাফাৰত ১৬মি."</item> + </string-array> + <string-array name="select_logpersist_titles"> + <item msgid="1744840221860799971">"অফ অৱস্থাত আছে"</item> + <item msgid="3054662377365844197">"সকলো"</item> + <item msgid="688870735111627832">"ৰেডিঅ\'ৰ বাহিৰে সকলো"</item> + <item msgid="2850427388488887328">"কেৱল কাৰ্ণেল"</item> + </string-array> + <string-array name="select_logpersist_summaries"> + <item msgid="2216470072500521830">"অফ কৰক"</item> + <item msgid="172978079776521897">"সকলো লগ বাফাৰ"</item> + <item msgid="3873873912383879240">"ৰেডিঅ\' লগ বাফাৰৰ বাহিৰে সকলো"</item> + <item msgid="8489661142527693381">"কেৱল কাৰ্ণেল লগ বাফাৰ"</item> + </string-array> + <string-array name="window_animation_scale_entries"> + <item msgid="8134156599370824081">"এনিমেশ্বন অফ"</item> + <item msgid="6624864048416710414">"এনিমেশ্বন স্কেল .৫গুণ"</item> + <item msgid="2219332261255416635">"এনিমেশ্বন স্কেল ১গুণ"</item> + <item msgid="3544428804137048509">"এনিমেশ্বন স্কেল ১.৫গুণ"</item> + <item msgid="3110710404225974514">"এনিমেশ্বন স্কেল ২গুণ"</item> + <item msgid="4402738611528318731">"এনিমেশ্বন স্কেল ৫গুণ"</item> + <item msgid="6189539267968330656">"এনিমেশ্বন স্কেল ১০গু"</item> + </string-array> + <string-array name="transition_animation_scale_entries"> + <item msgid="8464255836173039442">"এনিমেশ্বন অফ"</item> + <item msgid="3375781541913316411">"এনিমেশ্বন স্কেল .৫গুণ"</item> + <item msgid="1991041427801869945">"এনিমেশ্বন স্কেল 1গু"</item> + <item msgid="4012689927622382874">"এনিমেশ্বন স্কেল .৫গুণ"</item> + <item msgid="3289156759925947169">"এনিমেশ্বন স্কেল ২গুণ"</item> + <item msgid="7705857441213621835">"এনিমেশ্বন স্কেল ৫গুণ"</item> + <item msgid="6660750935954853365">"এনিমেশ্বন স্কেল ১০গুণ"</item> + </string-array> + <string-array name="animator_duration_scale_entries"> + <item msgid="6039901060648228241">"এনিমেশ্বন অফ অৱস্থাত আছে"</item> + <item msgid="1138649021950863198">"এনিমেশ্বন স্কেল .৫গুণ"</item> + <item msgid="4394388961370833040">"এনিমেশ্বন স্কেল ১গুণ"</item> + <item msgid="8125427921655194973">"এনিমেশ্বন স্কেল ১.৫গুণ"</item> + <item msgid="3334024790739189573">"এনিমেশ্বন স্কেল ২গুণ"</item> + <item msgid="3170120558236848008">"এনিমেশ্বন স্কেল ৫গুণ"</item> + <item msgid="1069584980746680398">"এনিমেশ্বন স্কেল ১০গুণ"</item> + </string-array> + <string-array name="overlay_display_devices_entries"> + <item msgid="1606809880904982133">"নাই"</item> + <item msgid="9033194758688161545">"৪৮০পি."</item> + <item msgid="1025306206556583600">"৪৮০পি. (সুৰক্ষিত)"</item> + <item msgid="1853913333042744661">"৭২০পি."</item> + <item msgid="3414540279805870511">"৭২০পি. (সুৰক্ষিত)"</item> + <item msgid="9039818062847141551">"১০৮০পি."</item> + <item msgid="4939496949750174834">"১০৮০পি. (সুৰক্ষিত)"</item> + <item msgid="1833612718524903568">"4K"</item> + <item msgid="238303513127879234">"৪কে. (সুৰক্ষিত)"</item> + <item msgid="3547211260846843098">"৪কে. (বৰ্ধিত)"</item> + <item msgid="5411365648951414254">"৪কে. (বৰ্ধিত, সুৰক্ষিত)"</item> + <item msgid="1311305077526792901">"৭২০পি., ১০৮০পি. (দ্বৈত স্ক্ৰীণ)"</item> + </string-array> + <string-array name="enable_opengl_traces_entries"> + <item msgid="3191973083884253830">"নাই"</item> + <item msgid="9089630089455370183">"লগকেট"</item> + <item msgid="5397807424362304288">"ছিছট্ৰেইচ (গ্ৰাফিক্স)"</item> + <item msgid="1340692776955662664">"glGetErrorত কলৰ খাপ"</item> + </string-array> + <string-array name="show_non_rect_clip_entries"> + <item msgid="993742912147090253">"অফ কৰক"</item> + <item msgid="675719912558941285">"আয়তাকাৰ নোহোৱা ক্লিপ অঞ্চল নীলাৰে আঁকক"</item> + <item msgid="1064373276095698656">"পৰীক্ষণ কৰা চিত্ৰাংকণ কমাণ্ডবোৰ সেউজীয়া ৰঙত হাইলাইট কৰক"</item> + </string-array> + <string-array name="track_frame_time_entries"> + <item msgid="2193584639058893150">"অফ"</item> + <item msgid="2751513398307949636">"স্ক্ৰীণত দণ্ড হিচাপে"</item> + <item msgid="2355151170975410323">"<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>ত"</item> + </string-array> + <string-array name="debug_hw_overdraw_entries"> + <item msgid="8190572633763871652">"বন্ধ কৰক"</item> + <item msgid="7688197031296835369">"পিক্সেল একাধিকবাৰ ব্যৱহৃত অংশসমূহ দেখুৱাওক"</item> + <item msgid="2290859360633824369">"ডিউটাৰএন\'মেলীৰ অংশসমূহ দেখুৱাওক"</item> + </string-array> + <string-array name="app_process_limit_entries"> + <item msgid="3401625457385943795">"মান্য সীমা"</item> + <item msgid="4071574792028999443">"নেপথ্যত কোনো প্ৰক্ৰিয়া চলি থকা নাই"</item> + <item msgid="4810006996171705398">"সৰ্বাধিক ১টা প্ৰক্ৰিয়া"</item> + <item msgid="8586370216857360863">"সৰ্বাধিক ২টা প্ৰক্ৰিয়া"</item> + <item msgid="836593137872605381">"সৰ্বাধিক ৩টা প্ৰক্ৰিয়া"</item> + <item msgid="7899496259191969307">"সৰ্বাধিক ৪টা প্ৰক্ৰিয়া"</item> + </string-array> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"চ্চাৰ্জ কৰি থকা হৈছে"</item> + <item msgid="5220695614993094977">"এমটিপি (মিডিয়া ট্ৰান্সফাৰ প্ৰ’ট’কল)"</item> + <item msgid="2086000968159047375">"পিটিপি (পিকচাৰ ট্ৰান্সফাৰ প্ৰ’ট’কল)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ইথাৰনেট)"</item> + <item msgid="1718924214939774352">"ধ্বনিৰ উৎস"</item> + <item msgid="8126315616613006284">"এমআইডিআই"</item> + </string-array> +</resources> diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml new file mode 100644 index 000000000000..b4d1af887447 --- /dev/null +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -0,0 +1,466 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="wifi_fail_to_scan" msgid="1265540342578081461">"নেটৱৰ্ক বিচাৰি স্কেন কৰিব পৰা নাই"</string> + <string name="wifi_security_none" msgid="7985461072596594400">"নাই"</string> + <string name="wifi_remembered" msgid="4955746899347821096">"ছেভ কৰি থোৱা নেটৱৰ্কসমূহ"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"নিষ্ক্ৰিয় হৈ আছে"</string> + <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP কনফিগাৰেশ্বন বিফল হৈছে"</string> + <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"নিম্নমানৰ নেটৱৰ্কৰ বাবে সংযোগ কৰা হোৱা নাই"</string> + <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ৱাই-ফাই সংযোগ বিফল হৈছে"</string> + <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"সত্য়াপন কৰাত সমস্যা হৈছে"</string> + <string name="wifi_cant_connect" msgid="5410016875644565884">"সংযোগ কৰিব নোৱাৰে"</string> + <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\'ৰ সৈতে সংযোগ কৰিব পৰা নাই"</string> + <string name="wifi_check_password_try_again" msgid="516958988102584767">"পাছৱৰ্ড পৰীক্ষা কৰি আকৌ চেষ্টা কৰক"</string> + <string name="wifi_not_in_range" msgid="1136191511238508967">"পৰিসৰৰ ভিতৰত নাই"</string> + <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্ৰিয়ভাৱে সংযোগ নহ\'ব"</string> + <string name="wifi_no_internet" msgid="4663834955626848401">"ইণ্টাৰনেট সংযোগ নাই"</string> + <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g>এ ছেভ কৰিছে"</string> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s মাধ্যমেদি স্বয়ংক্ৰিয়ভাৱে সংযোগ কৰা হৈছে"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ\'ল"</string> + <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ মাধ্যমেদি সংযোগ কৰা হৈছে"</string> + <string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string> + <string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে"</string> + <string name="connected_via_carrier" msgid="7583780074526041912">"%1$sৰ যোগেৰে সংযোজিত"</string> + <string name="available_via_carrier" msgid="1469036129740799053">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string> + <string name="speed_label_very_slow" msgid="1867055264243608530">"অতি লেহেম"</string> + <string name="speed_label_slow" msgid="813109590815810235">"লেহেমীয়া"</string> + <string name="speed_label_okay" msgid="2331665440671174858">"ঠিক"</string> + <string name="speed_label_medium" msgid="3175763313268941953">"মধ্যমীয়া"</string> + <string name="speed_label_fast" msgid="7715732164050975057">"দ্ৰুত"</string> + <string name="speed_label_very_fast" msgid="2265363430784523409">"অতি দ্ৰুত"</string> + <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> + <string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন কৰা হ’ল"</string> + <string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</string> + <string name="bluetooth_connecting" msgid="8555009514614320497">"সংযোগ কৰি থকা হৈছে…"</string> + <!-- no translation found for bluetooth_connected (5427152882755735944) --> + <skip /> + <string name="bluetooth_pairing" msgid="1426882272690346242">"যোৰা লগোৱা হৈছে…"</string> + <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) --> + <skip /> + <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) --> + <skip /> + <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"মিডিয়াৰ অডিঅ’"</string> + <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ফ\'ন কলসমূহ"</string> + <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ফাইল স্থানান্তৰণ"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ইনপুট ডিভাইচ"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ইণ্টাৰনেট সংযোগ"</string> + <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"শ্বেয়াৰিঙৰ সৈতে যোগাযোগ কৰক"</string> + <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"সম্পৰ্ক শ্বেয়াৰ কৰিবলৈ ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ইণ্টাৰনেট সংযোগ শ্বেয়াৰ"</string> + <string name="bluetooth_profile_map" msgid="1019763341565580450">"পাঠ বাৰ্তা"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ছিম প্ৰৱেশ"</string> + <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"এইচ্ছডি অডি\'অ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> + <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"এইচ্ছডি অডিঅ’"</string> + <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> + <skip /> + <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> + <skip /> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিঅ’লৈ সংযোগ হৈছে"</string> + <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিঅ\'ৰ লগত সংযোগ কৰা হ\'ল"</string> + <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল ট্ৰান্সফাৰ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ আছে"</string> + <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"মেপৰ সৈতে সংযোগ কৰক"</string> + <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAPৰ সৈতে সংযোজিত হৈ আছে"</string> + <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ফাইল স্থানান্তৰণ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ থকা নাই"</string> + <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ইনপুট ডিভাইচৰ সৈতে সংযোজিত হৈ আছে"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"ইণ্টাৰনেটৰ বাবে ডিভাইচৰ সৈতে সংযোজিত"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"ডিভাইচৰ সৈতে স্থানীয় ইণ্টাৰনেট সংযোগ শ্বেয়াৰ কৰা হৈছে"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"ইণ্টাৰনেট চলাবলৈ ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"মেপৰ বাবে ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"ছিমত প্ৰৱেশৰ বাবে ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"মিডিয়া অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ফ\'ন অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ফাইল স্থানান্তৰ কৰিবলৈ ব্যৱহাৰ কৰক"</string> + <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ইনপুটৰ বাবে ব্যৱহাৰ কৰক"</string> + <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> + <skip /> + <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যোৰা লগাওক"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যোৰা লগাওক"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল কৰক"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"যোৰা লগালে ইয়ে সংযোজিত কৰাৰ সময়ত আপোনাৰ সম্পৰ্কসমূহ আৰু কলৰ ইতিহাস চাবলৈ অনুমতি দিব।"</string> + <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নগ\'ল৷"</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"এটা ভুল পিন বা পাছকীৰ কাৰণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নাই৷"</string> + <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোগাযোগ কৰিব পৰা নগ\'ল"</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>এ যোৰা লগাব বিচৰা নাই"</string> + <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"কম্পিউটাৰ"</string> + <string name="bluetooth_talkback_headset" msgid="5140152177885220949">"হেডছেট"</string> + <string name="bluetooth_talkback_phone" msgid="4260255181240622896">"ফ\'ন"</string> + <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"ইমেজিং"</string> + <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"হেডফ\'ন"</string> + <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ইনপুট সম্পৰ্কীয় বাহ্য় ডিভাইচ"</string> + <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ব্লুটুথ"</string> + <string name="accessibility_wifi_off" msgid="1166761729660614716">"ৱাই-ফাই অফহৈ আছে।"</string> + <string name="accessibility_no_wifi" msgid="8834610636137374508">"ৱাইফাই সংযোগ বিচ্ছিন্ন হৈ আছে।"</string> + <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ৱাই-ফাই এদাল দণ্ড।"</string> + <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ৱাই-ফাইৰ দুডাল দণ্ড।"</string> + <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ৱাই-ফাইৰ তিনিডাল দণ্ড।"</string> + <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ৱাই-ফাই সংকেত সৰ্বোচ্চ।"</string> + <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"মুক্ত নেটৱৰ্ক"</string> + <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"সুৰক্ষিত নেটৱৰ্ক"</string> + <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> + <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"আঁতৰোৱা এপ্সমূহ"</string> + <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"আঁতৰোৱা এপ্ আৰু ব্যৱহাৰকাৰীসমূহ"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB টেডাৰিং"</string> + <string name="tether_settings_title_wifi" msgid="3277144155960302049">"প\'ৰ্টেবল হটস্পট"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ব্লুটুথ টেডাৰিং"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"টেডাৰ কৰি থকা হৈছে"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"টেদৰিং আৰু প\'ৰ্টেবল হ\'টস্পট"</string> + <string name="managed_user_title" msgid="8109605045406748842">"কৰ্মস্থানৰ সকলো এপ"</string> + <string name="user_guest" msgid="8475274842845401871">"অতিথি"</string> + <string name="unknown" msgid="1592123443519355854">"অজ্ঞাত"</string> + <string name="running_process_item_user_label" msgid="3129887865552025943">"ব্যৱহাৰকাৰী: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> + <string name="launch_defaults_some" msgid="313159469856372621">"কিছুমান ডিফ\'ল্ট ছেট কৰা হৈছে"</string> + <string name="launch_defaults_none" msgid="4241129108140034876">"কোনো ডিফ\'ল্ট ছেট কৰা হোৱা নাই"</string> + <string name="tts_settings" msgid="8186971894801348327">"পাঠৰ পৰা কথনৰ ছেটিংসমূহ"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"পাঠৰ পৰা কথনৰ আউটপুট"</string> + <string name="tts_default_rate_title" msgid="6030550998379310088">"কথা কোৱাৰ হাৰ"</string> + <string name="tts_default_rate_summary" msgid="4061815292287182801">"পাঠ কথনৰ বেগ"</string> + <string name="tts_default_pitch_title" msgid="6135942113172488671">"পিচ্চ"</string> + <string name="tts_default_pitch_summary" msgid="1944885882882650009">"সংশ্লেষিত কথনৰ সুৰক প্ৰভাৱিত কৰে"</string> + <string name="tts_default_lang_title" msgid="8018087612299820556">"ভাষা"</string> + <string name="tts_lang_use_system" msgid="2679252467416513208">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string> + <string name="tts_lang_not_selected" msgid="7395787019276734765">"ভাষা বাছনি কৰা হোৱা নাই"</string> + <string name="tts_default_lang_summary" msgid="5219362163902707785">"কথিত পাঠৰ বাবে ভাষা-নিৰ্দিষ্ট কণ্ঠস্বৰ ছেট কৰে"</string> + <string name="tts_play_example_title" msgid="7094780383253097230">"এটা উদাহৰণ মাতি শুনোৱা শুনক"</string> + <string name="tts_play_example_summary" msgid="8029071615047894486">"কণ্ঠস্বৰ সংশ্লেষণৰ এটা চুটি উদাহৰণ দেখুৱাওক"</string> + <string name="tts_install_data_title" msgid="4264378440508149986">"ভইচ ডেটা ইনষ্টল কৰক"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"কণ্ঠস্বৰ সংশ্লেষণৰ বাবে দৰকাৰী ভইচ ডেটা ইনষ্টল কৰক"</string> + <string name="tts_engine_security_warning" msgid="8786238102020223650">"এই কণ্ঠধ্বনি সংশ্লেষক ইঞ্জিনটোৱে কথিত ব্যক্তিগত ডেটা যেনে পাছৱৰ্ড আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰ আদিকে ধৰি সকলো পাঠ সংগ্ৰহ কৰবলৈ সক্ষম হ\'ব পাৰে। ই <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ইঞ্জিনটোৰ লগত আহিছে। এই কণ্ঠধ্বনি সংশ্লেষক ইঞ্জিনটো সক্ষম কৰিবনে?"</string> + <string name="tts_engine_network_required" msgid="1190837151485314743">"পাঠৰ পৰা কথন আউটপুটৰ বাবে এই ভাষাটোক এক কৰ্মক্ষম নেটৱৰ্ক সংযোগৰ দৰকাৰ।"</string> + <string name="tts_default_sample_string" msgid="4040835213373086322">"কথনভংগী সংশ্লেষণৰ ই এটা উদাহৰণ"</string> + <string name="tts_status_title" msgid="7268566550242584413">"ভাষাৰ ডিফ\'ল্ট স্থিতি"</string> + <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> সম্পূৰ্ণৰূপে সমৰ্থিত"</string> + <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g>ক নেটৱৰ্ক সংযোগৰ দৰকাৰ"</string> + <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> সমৰ্থিত নহয়"</string> + <string name="tts_status_checking" msgid="5339150797940483592">"পৰীক্ষা কৰি থকা হৈছে…"</string> + <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>ৰ বাবে ছেটিংসমূহ"</string> + <string name="tts_engine_settings_button" msgid="1030512042040722285">"ইঞ্জিনৰ ছেটিংসমূহ লঞ্চ কৰক"</string> + <string name="tts_engine_preference_section_title" msgid="448294500990971413">"অগ্ৰাধিকাৰপ্ৰাপ্ত ইঞ্জিন"</string> + <string name="tts_general_section_title" msgid="4402572014604490502">"সাধাৰণ"</string> + <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"কথনভংগী তীব্ৰতা ৰিছেট কৰক"</string> + <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"পাঠ উচ্চাৰণৰ স্বৰ-তীব্ৰতা ৰিছেট কৰক যিটো ডিফল্ট হিচাপে ব্যৱহাৰ কৰা হ\'ব।"</string> + <string-array name="tts_rate_entries"> + <item msgid="6695494874362656215">"অতি লেহেম"</item> + <item msgid="4795095314303559268">"লেহেমীয়া"</item> + <item msgid="8903157781070679765">"সাধাৰণ"</item> + <item msgid="164347302621392996">"দ্ৰুত"</item> + <item msgid="5794028588101562009">"দ্ৰুত"</item> + <item msgid="7163942783888652942">"অতি দ্ৰুত"</item> + <item msgid="7831712693748700507">"দ্ৰুত"</item> + <item msgid="5194774745031751806">"অতি দ্ৰুত"</item> + <item msgid="9085102246155045744">"দ্ৰুততম"</item> + </string-array> + <string name="choose_profile" msgid="6921016979430278661">"প্ৰ’ফাইল বাছনি কৰক"</string> + <string name="category_personal" msgid="1299663247844969448">"ব্যক্তিগত"</string> + <string name="category_work" msgid="8699184680584175622">"কৰ্মস্থান-সম্পৰ্কীয়"</string> + <string name="development_settings_title" msgid="215179176067683667">"বিকাশকৰ্তাৰ বিকল্পসমূহ"</string> + <string name="development_settings_enable" msgid="542530994778109538">"বিকাশকৰ্তা বিষয়ক বিকল্পসমূহ সক্ষম কৰক"</string> + <string name="development_settings_summary" msgid="1815795401632854041">"এপৰ বিকাশৰ বাবে বিকল্পসমূহ ছেট কৰক"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"এইজন ব্যৱহাৰকাৰীৰ বাবে বিকাশকৰ্তাৰ বিকল্পসমূহ উপলব্ধ নহয়"</string> + <string name="vpn_settings_not_available" msgid="956841430176985598">"ভিপিএন ছেটিংসমূহ এই ব্যৱহাৰকাৰীজনৰ বাবে উপলব্ধ নহয়"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"এই ব্যৱহাৰকাৰীৰ বাবে টেডাৰিং ছেটিংসমূহ উপলব্ধ নহয়"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"এই ব্যৱহাৰকাৰীৰ বাবে একচেছ পইণ্টৰ নাম ছেটিংসমূহ উপলব্ধ নহয়"</string> + <string name="enable_adb" msgid="7982306934419797485">"ইউএছবি ডিবাগিং"</string> + <string name="enable_adb_summary" msgid="4881186971746056635">"USB সংযোগ হৈ থকাৰ অৱস্থাত ডিবাগ ম\'ড"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"ইউএছবি ডিবাগিং অনুমতিসমূহ প্ৰত্যাহাৰ কৰক"</string> + <string name="bugreport_in_power" msgid="7923901846375587241">"বাগ ৰিপৰ্টৰ শ্ৱৰ্টকাট"</string> + <string name="bugreport_in_power_summary" msgid="1778455732762984579">"পাৱাৰ মেনুত বাগ প্ৰতিবেদন গ্ৰহণ কৰিবলৈ এটা বুটাম দেখুৱাওক"</string> + <string name="keep_screen_on" msgid="1146389631208760344">"জাগ্ৰত কৰি ৰাখক"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীণ কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক"</string> + <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ব্লুটুথ HCI পেকেটসমূহ এটা ফাইলত ৰাখক"</string> + <string name="oem_unlock_enable" msgid="6040763321967327691">"ঔইএম আনলক"</string> + <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুটল\'ডাৰটো আনলক কৰিবলৈ অনুমতি দিয়ক"</string> + <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ঔইএম আনলক কৰাৰ অনুমতি দিবনে?"</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"সাৱধান: এই ছেটিংটো সক্ষম কৰি থাকোতে ডিভাইচৰ সুৰক্ষা সুবিধাসমূহে কাম নকৰিব।"</string> + <string name="mock_location_app" msgid="7966220972812881854">"নকল অৱস্থানৰ এপ্ বাছনি কৰক"</string> + <string name="mock_location_app_not_set" msgid="809543285495344223">"কোনো নকল অৱস্থান এপ্ নিৰ্ধাৰণ কৰা হোৱা নাই"</string> + <string name="mock_location_app_set" msgid="8966420655295102685">"নকল অৱস্থানৰ এপ্: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="debug_networking_category" msgid="7044075693643009662">"নেটৱৰ্কিং"</string> + <string name="wifi_display_certification" msgid="8611569543791307533">"বেতাঁৰ ডিছপ্লে প্ৰমাণীকৰণ"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক"</string> + <!-- no translation found for wifi_connected_mac_randomization (3168165236877957767) --> + <skip /> + <string name="mobile_data_always_on" msgid="8774857027458200434">"ম\'বাইল ডেটা সদা-সক্ৰিয়"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ"</string> + <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"পূৰ্ণ মাত্ৰাৰ ভলিউম অক্ষম কৰক"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP সংস্কৰণ"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP সংস্কৰণ বাছনি কৰক"</string> + <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ব্লুটুথ অডিঅ’ ক’ডেক"</string> + <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ব্লুটুথ অডিঅ’ ক’ডেক বাছনি কৰক"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ব্লুটুথ অডিঅ\' ছেম্পল ৰেইট"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nনমুনাৰ হাৰ"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"প্ৰতি ছেম্পলত ব্লুটুথ অডিঅ\' বিটসমূহ"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nবিট প্ৰতি নমুনা"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ব্লুটুথ অডিঅ\' চেনেল ম\'ড"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nচ্চেনেল ম\'ড"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ব্লুটুথ অডিঅ’ LDAC ক’ডেক: পৰিৱেশনৰ মান"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ব্লুটুথ LDAC ক\'ডেক বাছনি কৰক:\nপৰিৱেশনৰ মান"</string> + <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ষ্ট্ৰীম কৰি থকা হৈছে: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> + <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ব্যক্তিগত DNS"</string> + <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ব্যক্তিগত DNS ম\'ড বাছনি কৰক"</string> + <string name="private_dns_mode_off" msgid="8236575187318721684">"অফ"</string> + <string name="private_dns_mode_opportunistic" msgid="7608409735589131766">"সুবিধাবাদী"</string> + <string name="private_dns_mode_provider" msgid="8354935160639360804">"ব্যক্তিগত ডিএনএছ প্ৰদানকাৰীৰ হোষ্টনাম"</string> + <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ডিএনএছ সেৱা যোগানকাৰীৰ হ\'ষ্টনাম দিয়ক"</string> + <string name="wifi_display_certification_summary" msgid="1155182309166746973">"বেতাঁৰ ডিছপ্লে প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string> + <!-- no translation found for wifi_connected_mac_randomization_summary (1743059848752201485) --> + <skip /> + <string name="select_logd_size_title" msgid="7433137108348553508">"লগাৰৰ বাফাৰৰ আকাৰ"</string> + <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"প্ৰতিটো লগ বাফাৰত ল\'গাৰৰ আকাৰ বাছনি কৰক"</string> + <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"লগাৰৰ স্থায়ী সঞ্চয়াগাৰৰ বস্তুবোৰ মচিবনে?"</string> + <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"পাৰ্ছিছটেণ্ট লগাৰ ব্যৱহাৰ কৰ নিৰীক্ষণ নকৰাৰ সময়ত, আমি আপোনাৰ ডিভাইচত থকা লগাৰ ডেটা নিৱাসীক মচা দৰকাৰ।"</string> + <string name="select_logpersist_title" msgid="7530031344550073166">"ডিভাইচটোত লগাৰৰ ডেটা নিৰবচ্ছিন্নভাৱে সঞ্চয় কৰক"</string> + <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ডিভাইচত স্থায়ীভাৱে সঞ্চয় কৰিবলৈ লগ বাফাৰবোৰ বাছনি কৰক"</string> + <string name="select_usb_configuration_title" msgid="2649938511506971843">"ইউএছবি কনফিগাৰেশ্বন বাছনি কৰক"</string> + <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"ইউএছবি কনফিগাৰেশ্বন বাছনি কৰক"</string> + <string name="allow_mock_location" msgid="2787962564578664888">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string> + <string name="allow_mock_location_summary" msgid="317615105156345626">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string> + <string name="debug_view_attributes" msgid="6485448367803310384">"দৃশ্যৰ গুণাগুণ নিৰীক্ষণ সক্ষম কৰক"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ৱাই-ফাই থকা সময়তো সদায় ম\'বাইল ডেটা সক্ৰিয় ৰাখক (খৰতকীয়াকৈ নেটৱৰ্ক সলনি কৰিবৰ বাবে)।"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"যদিহে উপলব্ধ হয় তেন্তে টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ ব্যৱহাৰ কৰক"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"ইউএছবি ডিবাগিঙৰ অনুমতি দিয়েনে?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"ইউএছবি ডিবাগ কৰা কাৰ্য কেৱল বিকাশৰ উদ্দেশ্যৰেহে কৰা হৈছে৷ আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ এইটো ব্যৱহাৰ কৰক, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্সমূহ ইনষ্টল কৰক আৰু লগ ডেটা পঢ়ক৷"</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"আপুনি আগতে ইউএছবি ডিবাগিঙৰ বাবে প্ৰৱেশৰ অনুমতি দিয়া সকলো কম্পিউটাৰৰ পৰা সেই অনুমতি প্ৰত্যাহাৰ কৰেনে?"</string> + <string name="dev_settings_warning_title" msgid="7244607768088540165">"বিকাশৰ কামৰ বাবে থকা ছেটিংবিলাকক অনুমতি দিবনে?"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"এই ছেটিংসমূহ বিকাশৰ কামত ব্যৱহাৰ কৰিবলৈ তৈয়াৰ কৰা হৈছে। সেইবিলাকে আপোনাৰ ডিভাইচ আৰু তাত থকা এপ্লিকেশ্বনসমূহক অকামিলা কৰি পেলাব পাৰে আৰু সেইবিলাকৰ কাৰণে এপ্লিকেশ্বনসমূহে অদ্ভুত আচৰণ কৰিব পাৰে।"</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"ইউএছবিৰ যোগেৰে এপৰ সত্যাপন কৰক"</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADTৰ যোগেৰে ইনষ্টল কৰা এপসমূহে কিবা ক্ষতিকাৰক আচৰণ কৰিছে নেকি পৰীক্ষা কৰক।"</string> + <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"নামহীন ব্লুটুথ ডিভাইচসমূহ (মাত্ৰ MAC ঠিকনাযুক্ত) দেখুওৱা হ\'ব"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ৰিম\'ট ডিভাইচবিলাকৰ সৈতে ভলিউম সম্পৰ্কীয় সমস্যা, যেনেকৈ অতি উচ্চ ভলিউম বা নিয়ন্ত্ৰণ কৰিবই নোৱাৰা অৱস্থাত ব্লুটুথৰ পূৰ্ণ ভলিউম সুবিধা অক্ষম কৰে।"</string> + <string name="enable_terminal_title" msgid="95572094356054120">"স্থানীয় টাৰ্মিনেল"</string> + <string name="enable_terminal_summary" msgid="67667852659359206">"স্থানীয় শ্বেল প্ৰৱেশাধিকাৰ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক"</string> + <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP পৰীক্ষণ"</string> + <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP পৰীক্ষণ আচৰণ ছেট কৰক"</string> + <string name="debug_debugging_category" msgid="6781250159513471316">"ডিবাগিং"</string> + <string name="debug_app" msgid="8349591734751384446">"ডিবাগ এপ্ বাছনি কৰক"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"কোনো ডিবাগ এপ্লিকেশ্বন ছেট কৰা হোৱা নাই"</string> + <string name="debug_app_set" msgid="2063077997870280017">"ডিবাগিং এপ্লিকেশ্বন: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="select_application" msgid="5156029161289091703">"এপ্লিকেশ্বন বাছনি কৰক"</string> + <string name="no_application" msgid="2813387563129153880">"একোৱেই নাই"</string> + <string name="wait_for_debugger" msgid="1202370874528893091">"ডিবাগাৰৰ বাবে অপেক্ষা কৰক"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ডিবাগ কৰা এপ্লিকেশ্বনবোৰে কাৰ্য ৰূপায়ণ কৰাৰ আগতে ডিবাগাৰ সংলগ্ন হোৱা কাৰ্যলৈ অপেক্ষা কৰে"</string> + <string name="debug_input_category" msgid="1811069939601180246">"ইনপুট"</string> + <string name="debug_drawing_category" msgid="6755716469267367852">"অংকন"</string> + <string name="debug_hw_drawing_category" msgid="6220174216912308658">"হাৰ্ডৱেৰৰদ্বাৰা ত্বৰিত ৰেণ্ডাৰিং"</string> + <string name="media_category" msgid="4388305075496848353">"মিডিয়া"</string> + <string name="debug_monitoring_category" msgid="7640508148375798343">"নিৰীক্ষণ কৰি থকা হৈছে"</string> + <string name="strict_mode" msgid="1938795874357830695">"কঠোৰ ম’ড সক্ষম কৰা হৈছে"</string> + <string name="strict_mode_summary" msgid="142834318897332338">"যেতিয়া এপসমূহে মুখ্য থ্ৰেডত দীঘলীয়া কাৰ্যকলাপ চলাই, তেতিয়া স্ক্ৰীণ ফ্লাশ্ব কৰক"</string> + <string name="pointer_location" msgid="6084434787496938001">"পইণ্টাৰৰ অৱস্থান"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"চলিত স্পৰ্শ-বিষয়ক তথ্যসহ স্ক্ৰীণ অভাৰলে\'"</string> + <string name="show_touches" msgid="2642976305235070316">"টেপসমূহ দেখুৱাওক"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"টিপিলে দৃশ্যায়িত ফীডবেক দিয়ক"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"পৃষ্ঠভাগৰ আপডেইট দেখুৱাওক"</string> + <string name="show_screen_updates_summary" msgid="2569622766672785529">"আপডেইট হওতে গোটেই ৱিণ্ড পৃষ্ঠসমূহ ফ্লাশ্ব কৰক"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"জিপিইউৰ দৰ্শন আপডেইটসমূহ দেখুৱাওক"</string> + <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"জিপিইউৰ জৰিয়তে অঁকাৰ সময়ত ৱিণ্ড’ৰ ভিতৰত ফ্লাশ্ব দৰ্শন"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"হাৰ্ডৱেৰৰ তৰপৰ আপডেইট দেখুৱাওক"</string> + <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"হাৰ্ডৱেৰ লেয়াৰ আপডেইট হওতে সিঁহতক সেউজীয়া ৰঙেৰে ফ্লাশ্ব কৰক"</string> + <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU অভাৰড্ৰ ডিবাগ কৰক"</string> + <string name="disable_overlays" msgid="2074488440505934665">"HW অ’ভাৰলে অক্ষম কৰক"</string> + <string name="disable_overlays_summary" msgid="3578941133710758592">"স্ক্ৰীণ কম্প’জিট কৰাৰ বাবে সদায় জিপিইউ ব্যৱহাৰ কৰক"</string> + <string name="simulate_color_space" msgid="6745847141353345872">"ৰঙৰ ঠাই ছিমিউলেইট কৰক"</string> + <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ট্ৰেছ সক্ষম কৰক"</string> + <string name="usb_audio_disable_routing" msgid="8114498436003102671">"ইউএছবি অডিঅ\' ৰাউটিং অক্ষম কৰক"</string> + <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"স্বয়ংক্ৰিয়ভাৱে ইউএছবি ধ্বনিৰ আনুষংগিক আহিলাবিলাকলৈ ৰাউটিং কৰাটো অক্ষম কৰক"</string> + <string name="debug_layout" msgid="5981361776594526155">"লেআউটৰ সময় দেখুৱাওক"</string> + <string name="debug_layout_summary" msgid="2001775315258637682">"ক্লিপ বাউণ্ড, মাৰ্জিন আদিসমূহ দেখুৱাওক"</string> + <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"আৰটিএল চানেকিৰ দিশ বলেৰে সলনি কৰক"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"সকলো ভাষাৰ বাবে স্ক্ৰীণৰ চানেকিৰ দিশ RTLলৈ বলেৰে সলনি কৰক"</string> + <string name="force_hw_ui" msgid="6426383462520888732">"জিপিইউ ৰেণ্ডাৰিং বলেৰে ব্যৱহাৰ কৰক"</string> + <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d চিত্ৰাংকনৰ বাবে GPUক বলেৰে ব্যৱহাৰ কৰক"</string> + <string name="force_msaa" msgid="7920323238677284387">"বল ৪গুণ MSAA"</string> + <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 এপত ৪গুণ MSAA সক্ষম কৰক"</string> + <string name="show_non_rect_clip" msgid="505954950474595172">"আয়তাকৃতিৰ নোহোৱা ক্লিপ প্ৰক্ৰিয়াসমূহ ডিবাগ কৰক"</string> + <string name="track_frame_time" msgid="6146354853663863443">"প্ৰ\'ফাইল জিপিইউ ৰেণ্ডাৰিং"</string> + <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"জিপিইউ ডিবাগ স্তৰবোৰ সক্ষম কৰক"</string> + <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ডিবাগ এপসমূহৰ বাবে জিপিইউ ডিবাগ তৰপ ল\'ড কৰিবলৈ অনুমতি দিয়ক"</string> + <string name="window_animation_scale_title" msgid="6162587588166114700">"ৱিণ্ড\' এনিমেশ্বন স্কেল"</string> + <string name="transition_animation_scale_title" msgid="387527540523595875">"ট্ৰাঞ্জিশ্বন এনিমেশ্বন স্কেল"</string> + <string name="animator_duration_scale_title" msgid="3406722410819934083">"এনিমেটৰ কালদৈৰ্ঘ্য স্কেল"</string> + <string name="overlay_display_devices_title" msgid="5364176287998398539">"গৌণ প্ৰদৰ্শনৰ নকল বনাওক"</string> + <string name="debug_applications_category" msgid="4206913653849771549">"এপসমূহ"</string> + <string name="immediately_destroy_activities" msgid="1579659389568133959">"কাৰ্যকলাপসমূহ নাৰাখিব"</string> + <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ব্যৱহাৰকাৰী ওলোৱাৰ লগে লগে সকলো কাৰ্যকলাপ মচক"</string> + <string name="app_process_limit_title" msgid="4280600650253107163">"নেপথ্যত চলা প্ৰক্ৰিয়াৰ সীমা"</string> + <string name="show_all_anrs" msgid="28462979638729082">"সকলো এএনআৰ দেখুৱাওক"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই মন্তব্য দেখুৱাওক"</string> + <string name="show_notification_channel_warnings" msgid="1399948193466922683">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string> + <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string> + <string name="force_allow_on_external" msgid="3215759785081916381">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক সঞ্চয়াগাৰত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string> + <string name="force_resizable_activities" msgid="8615764378147824985">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"মেনিফেষ্টৰ মান যিয়েই নহওক, মাল্টি-ৱিণ্ডৰ বাবে সকলো কাৰ্যকলাপৰ আকাৰ সলনি কৰিব পৰা কৰক।"</string> + <string name="enable_freeform_support" msgid="1461893351278940416">"ফ্ৰিফৰ্ম ৱিণ্ড\'জ সক্ষম কৰক"</string> + <string name="enable_freeform_support_summary" msgid="8247310463288834487">"পৰীক্ষামূলক ফ্ৰী-ফৰ্ম ৱিণ্ড’বোৰৰ বাবে সহায়তা সক্ষম কৰক৷"</string> + <string name="local_backup_password_title" msgid="3860471654439418822">"ডেস্কটপ বেকআপ পাছৱৰ্ড"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ডেস্কটপৰ পূৰ্ণ বেকআপ এতিয়ালৈকে সংৰক্ষিত অৱস্থাত নাই"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ডেস্কটপ সম্পূৰ্ণ বেকআপৰ বাবে পাছৱৰ্ডটো সলনি কৰিবলৈ বা আঁতৰাবলৈ টিপক"</string> + <string name="local_backup_password_toast_success" msgid="582016086228434290">"নতুন বেকআপ পাছৱৰ্ড ছেট কৰা হ\'ল"</string> + <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"নতুন পাছৱৰ্ডটোৰ লগত নিশ্চিত কৰা পাছৱৰ্ডটো মিলা নাই"</string> + <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"বেকআপ পাছৱৰ্ড নিৰ্ধাৰণ কৰিব পৰা নহ\'ল"</string> + <string-array name="color_mode_names"> + <item msgid="2425514299220523812">"জীৱন্ত (ডিফল্ট)"</item> + <item msgid="8446070607501413455">"প্ৰাকৃতিক"</item> + <item msgid="6553408765810699025">"মানক"</item> + </string-array> + <string-array name="color_mode_descriptions"> + <item msgid="4979629397075120893">"বৰ্ধিত ৰং"</item> + <item msgid="8280754435979370728">"চকুৱে দেখা পোৱা ধৰণৰ প্ৰাকৃতিক ৰং"</item> + <item msgid="5363960654009010371">"ডিজিটেল সমলৰ বাবে ৰং অপ্টিমাইজ কৰা হৈছে"</item> + </string-array> + <!-- no translation found for inactive_apps_title (9042996804461901648) --> + <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"নিষ্ক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string> + <!-- no translation found for standby_bucket_summary (6567835350910684727) --> + <skip /> + <string name="runningservices_settings_title" msgid="8097287939865165213">"চলিত সেৱা"</string> + <string name="runningservices_settings_summary" msgid="854608995821032748">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"ৱেবভিউ প্ৰয়োগ"</string> + <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"ৱেবভিউ প্ৰয়োগ ছেট কৰক"</string> + <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"বাছনিটো এতিয়া আৰু মান্য় নহয়। আকৌ চেষ্টা কৰক।"</string> + <string name="convert_to_file_encryption" msgid="3060156730651061223">"ফাইল এনক্ৰিপশ্বন কৰিবলৈ ৰূপান্তৰ কৰক"</string> + <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ৰূপান্তৰ কৰক…"</string> + <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ফাইল ইতিমধ্যে এনক্ৰিপ্ট কৰা হৈছে"</string> + <string name="title_convert_fbe" msgid="1263622876196444453">"ফাইল-ভিত্তিক এনক্ৰিপশ্বনলৈ ৰূপান্তৰ কৰা হৈছে"</string> + <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ডেটা বিভাজনক ফাইল ভিত্তিক এনক্ৰিপশ্বনলৈ সলনি কৰক।\n !!সাৱধান!! ই আপোনাৰ সকলো ডেটা মচিব।\n এই সুবিধাটো আলফা পৰীক্ষণ অৱস্থাত আছে গতিকে ই সঠিকভাৱে কাম নকৰিব পাৰে।\n অব্যাহত ৰাখিবলৈ \'মচক আৰু ৰূপান্তৰ কৰক…\' দবাওক।"</string> + <string name="button_convert_fbe" msgid="5152671181309826405">"মচক আৰু ৰূপান্তৰ কৰক…"</string> + <string name="picture_color_mode" msgid="4560755008730283695">"চিত্ৰৰ ৰং ম’ড"</string> + <string name="picture_color_mode_desc" msgid="1141891467675548590">"এছআৰজিবি ব্যৱহাৰ কৰক"</string> + <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"নিষ্ক্ৰিয় হৈ আছে"</string> + <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"ম\'ন\'ক্ৰ\'মেচী"</string> + <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"ডিউটাৰএন\'মেলী (ৰঙা-সেউজীয়া)"</string> + <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"প্ৰ’টানোমালি (ৰঙা-সেউজীয়া)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ট্ৰাইটান\'মেলী (নীলা-হালধীয়া)"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ৰং শুধৰণী"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই সুবিধাটো পৰীক্ষামূলক, সেয়ে ই কাৰ্যক্ষমতাৰ ওপৰত প্ৰভাৱ পেলাব পাৰে।"</string> + <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string> + <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"সম্পূৰ্ণকৈ চ্চাৰ্জ হ\'বলৈ <xliff:g id="TIME">%1$s</xliff:g> বাকী"</string> + <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> বাকী"</string> + <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) --> + <skip /> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string> + <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - আপোনাৰ ব্যৱহাৰক ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string> + <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) --> + <skip /> + <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) --> + <skip /> + <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) --> + <skip /> + <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> সম্পূৰ্ণৰূপে চ্চাৰ্জ হোৱা পৰ্যন্ত"</string> + <string name="battery_info_status_unknown" msgid="196130600938058547">"অজ্ঞাত"</string> + <string name="battery_info_status_charging" msgid="1705179948350365604">"চাৰ্জ কৰি থকা হৈছে"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"চ্চাৰ্জ হৈ আছে"</string> + <string name="battery_info_status_discharging" msgid="310932812698268588">"চ্চাৰ্জ কৰা নাই"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"প্লাগ কৰি থোৱা হৈছে, এই মুহূৰ্তত চ্চাৰ্জ কৰিব নোৱাৰি"</string> + <string name="battery_info_status_full" msgid="2824614753861462808">"পূৰ্ণ"</string> + <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"প্ৰশাসকে সক্ষম কৰিছে"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"এডমিনে অক্ষম কৰিছে ৰাখিছে"</string> + <string name="disabled" msgid="9206776641295849915">"নিষ্ক্ৰিয়"</string> + <string name="external_source_trusted" msgid="2707996266575928037">"অনুমতি দিয়া হৈছে"</string> + <string name="external_source_untrusted" msgid="2677442511837596726">"অনুমতি দিয়া হোৱা নাই"</string> + <string name="install_other_apps" msgid="6986686991775883017">"অজ্ঞাত এপ্ ইনষ্টল কৰক"</string> + <string name="home" msgid="3256884684164448244">"ছেটিংসমূহৰ গৃহপৃষ্ঠা"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"০%"</item> + <item msgid="8934126114226089439">"৫০%"</item> + <item msgid="1286113608943010849">"১০০%"</item> + </string-array> + <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> আগত"</string> + <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> বাকী আছে"</string> + <string name="screen_zoom_summary_small" msgid="5867245310241621570">"সৰু"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"ডিফ’ল্ট"</string> + <string name="screen_zoom_summary_large" msgid="4835294730065424084">"ডাঙৰ"</string> + <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"বৃহত্তৰ"</string> + <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"সকলোতকৈ ডাঙৰ"</string> + <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"নিজৰ উপযোগিতা অনুযায়ী (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"সহায় আৰু ফীডবেক"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"মেনু"</string> + <string name="retail_demo_reset_message" msgid="118771671364131297">"ডেম’ ম\'ডত ফেক্টৰী ৰিছেট কৰিবলৈ পাছৱৰ্ড দিয়ক"</string> + <string name="retail_demo_reset_next" msgid="8356731459226304963">"পৰৱৰ্তী"</string> + <string name="retail_demo_reset_title" msgid="696589204029930100">"পাছৱৰ্ড দৰকাৰী"</string> + <string name="active_input_method_subtypes" msgid="3596398805424733238">"সক্ৰিয়হৈ থকা ইনপুট পদ্ধতিসমূহ"</string> + <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>ৰ ছেটিংবিলাক খুলিব পৰা নগ\'ল"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি সকলো পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> এপটোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ\'ব"</string> + <string name="ims_reg_title" msgid="7609782759207241443">"আইএমএছ পঞ্জীয়ন স্থিতি"</string> + <string name="ims_reg_status_registered" msgid="933003316932739188">"পঞ্জীকৃত"</string> + <string name="ims_reg_status_not_registered" msgid="6529783773485229486">"পঞ্জীকৃত নহয়"</string> + <string name="status_unavailable" msgid="7862009036663793314">"উপলব্ধ নহয়"</string> + <!-- no translation found for wifi_tether_connected_summary (3871603864314407780) --> + <!-- no translation found for accessibility_manual_zen_more_time (1636187409258564291) --> + <skip /> + <!-- no translation found for accessibility_manual_zen_less_time (6590887204171164991) --> + <skip /> + <!-- no translation found for zen_mode_enable_dialog_turn_on (8287824809739581837) --> + <skip /> + <string name="cancel" msgid="6859253417269739139">"বাতিল কৰক"</string> + <!-- no translation found for zen_mode_settings_turn_on_dialog_title (2297134204747331078) --> + <skip /> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"কেতিয়াও নহয়"</string> + <!-- no translation found for zen_interruption_level_priority (2078370238113347720) --> + <skip /> + <!-- no translation found for zen_mode_and_condition (4927230238450354412) --> + <skip /> + <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) --> + <skip /> + <!-- no translation found for zen_alarm_warning (6236690803924413088) --> + <skip /> + <!-- no translation found for alarm_template (4996153414057676512) --> + <skip /> + <!-- no translation found for alarm_template_far (3779172822607461675) --> + <skip /> +</resources> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index 97ccf912a3f8..1a0a251c9a3a 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ да SIM-карты"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Аўдыя ў HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Аўдыя ў HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слыхавы апарат"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Падключана да слыхавога апарата"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Падключана да аўдыё медыа"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Падключана да аўдыё тэлефона"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Падключаны да серверу перадачы файлаў"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Выкарыстоўваць для аўдыё тэлефона"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Выкарыстоўваць для перадачы файлаў"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Выкарыстоўваць для ўводу"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Выкарыстоўваць для слыхавога апарата"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Падлучыць"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СПАЛУЧЫЦЬ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Скасаваць"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 9bde546db4db..d071c64eea10 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Достъп до SIM картата"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Висококачествено аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Висококачествено аудио"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слухов апарат"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Има връзка със слуховия апарат"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Установена е връзка с медийно аудио"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Връзка със звука на телефона"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Установена е връзка със сървър за трансфер на файлове"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Използване на телефон за аудио"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Използване на за пренос на файлове"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Да се използва за въвеждане"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Използване за слухов апарат"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Сдвояване"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СДВОЯВАНЕ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Отказ"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 28b879bd8aa2..baa31e62bb32 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"সিম -এর অ্যাক্সেস"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD অডিও: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD অডিও"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"হিয়ারিং এড"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"শ্রবণ যন্ত্রের সাথে কানেক্ট রয়েছে"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিওতে সংযুক্ত রয়েছে"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিওতে সংযুক্ত"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল স্থানান্তর সার্ভারের সঙ্গে সংযুক্ত"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ফোন অডিওয়ের জন্য ব্যবহার করুন"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ফাইল স্থানান্তরের জন্য ব্যবহার করুন"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ইনপুটের জন্য ব্যবহার করুন"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"শ্রবণ যন্ত্রের জন্য ব্যবহার করুন"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যুক্ত করুন"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যুক্ত করুন"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল করুন"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 998ef58d8555..fe1c6bc9361e 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Πρόσβαση SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Ήχος HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Ήχος HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Βοήθημα ακοής"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Συνδέθηκε σε βοήθημα ακοής"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Συνδέθηκε σε ήχο πολυμέσων"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Συνδεδεμένο στον ήχο τηλεφώνου"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Συνδεδεμένο σε διακομιστή μεταφοράς αρχείων"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Χρήση για ήχο τηλεφώνου"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Χρήση για τη μεταφορά αρχείων"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Χρήση για είσοδο"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Χρήση για βοήθημα ακοής"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Σύζευξη"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ΣΥΖΕΥΞΗ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Ακύρωση"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index f38643ffe24b..bf62e598721b 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio en HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio en HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audífonos"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectado a un audífono"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado al audio multimedia"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado al audio del dispositivo"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado al servidor de transferencia de archivo"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilizar para el audio del dispositivo"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilizar para la transferencia de archivos"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilizar para entrada"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar con audífonos"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Vincular"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SINCRONIZAR"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 382a5147d473..77d55ffc5b05 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kaardi juurdepääs"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-heli: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-heli"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Kuuldeaparaat"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Kuuldeaparaadiga ühendatud"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ühendatud meediumiheliga"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ühendatud telefoniheliga"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ühendatud failiedastuse serveriga"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Kasuta telefoniheli jaoks"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Kasutage failide edastamiseks"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Kasutage sisendi jaoks"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Kuuldeaparaadiga kasutamiseks"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Seo"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SEO"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Tühista"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 15fe55bff287..effcd47f8279 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso á SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio en HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio en HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audiófonos"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectouse aos audiófonos"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao audio multimedia"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao audio do teléfono"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferencia de ficheiros"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilízase para o audio do teléfono"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilízase para a transferencia de ficheiros"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilízase para a entrada"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar para o audiófono"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sincronizar"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SINCRONIZAR"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index 617230e4c8c3..c517b8b741b9 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"સિમ ઍક્સેસ"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ઑડિઓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ઑડિઓ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"સાંભળવામાં સહાય આપતું યંત્ર"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"સાંભળવામાં સહાય આપતા યંત્ર સાથે કનેક્ટ કરેલ"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"મીડિયા ઑડિઓ સાથે કનેક્ટ કર્યુ"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ફોન ઑડિઓ સાથે કનેક્ટ થયાં"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ફાઇલ સ્થાનાંતરણ સેવાથી કનેક્ટ થયાં"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ફોન ઑડિઓ માટે ઉપયોગ કરો"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ફાઇલ સ્થાનાંતર માટે ઉપયોગ કરો"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ઇનપુટ માટે ઉપયોગ કરો"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"સાંભળવામાં સહાય આપતા યંત્ર માટે ઉપયોગ કરો"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"જોડી"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"જોડાણ બનાવો"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"રદ કરો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 4a12196646a0..2726c4677a3a 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम ऐक्सेस"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडियो"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"सुनने में मददगार डिवाइस"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"सुनने में मददगार डिवाइस से जाेड़ा गया"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडियो से कनेक्ट किया गया"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फ़ोन ऑडियो से कनेक्ट किया गया"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फ़ाइल स्थानांतरण सर्वर से कनेक्ट किया गया"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फ़ोन ऑडियो के लिए उपयोग करें"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फ़ाइल स्थानांतरण के लिए उपयोग करें"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट के लिए उपयोग करें"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"सुनने में मददगार डिवाइस के लिए इस्तेमाल करें"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"युग्म बनाएं"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"दूसरे डिवाइस से जोड़ें"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करें"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 8e5cf7ddcdaa..35a556098f01 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-elérés"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hallókészülék"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Csatlakoztatva a hallókészülékhez"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Csatlakoztatva az eszköz hangjához"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Csatlakoztatva a telefon hangjához"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Csatlakozva a fájlküldő szerverhez"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Felhasználás a telefon hangjához"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Felhasználás fájlátvitelre"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Használat beviteli eszközként"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Használat hallókészülékhez"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Párosítás"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PÁROSÍTÁS"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Mégse"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index e5e5bebcd7b3..44a17149d289 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM քարտի հասանելիություն"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD աուդիո՝ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD աուդիո"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Լսողական ապարատ"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Միացված է լսողական ապարատին"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Միացված է մեդիա աուդիոյին"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Միացված է հեռախոսի ձայնային տվյալներին"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Միացված է ֆայլերի փոխանցման սերվերին"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Օգտագործել հեռախոսի աուդիոյի համար"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Օգտագործել ֆայլի փոխանցման համար"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Օգտագործել ներմուծման համար"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Օգտագործել լսողական ապարատի համար"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Զուգավորել"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"Զուգավորել"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Չեղարկել"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index b957898f4b8c..81307f729289 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"גישה ל-SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"אודיו באיכות HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"אודיו באיכות HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"מכשיר שמיעה"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"מחובר למכשיר שמיעה"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"מחובר לאודיו של מדיה"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"מחובר לאודיו של הטלפון"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"מחובר לשרת העברת קבצים"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"השתמש עבור האודיו של הטלפון"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"השתמש להעברת קבצים"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"השתמש לקלט"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"יש להשתמש עבור מכשיר שמיעה"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"התאם"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"התאם"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ביטול"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 953b2e3f5fdd..346a96d35bc0 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIMアクセス"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD オーディオ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD オーディオ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"補聴器"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"補聴器に接続済み"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"メディアの音声に接続"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"携帯電話の音声に接続"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ファイル転送サーバーに接続"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"携帯電話の音声に使用"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ファイル転送に使用"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"入力に使用"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"補聴器に使用"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ペア設定する"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ペア設定する"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"キャンセル"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index a5fd2136e49b..db03069070ae 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM წვდომა"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD აუდიო: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD აუდიო"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"სმენის აპარატი"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"დაკავშირებულია სმენის აპარატთან"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"დაკავშირებულია აუდიო მულტიმედიურ სისტემასთან"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"დაკავშირებულია ტელეფონის აუდიო მოწყობილობასთან"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"დაკავშირებულია ფაილების გადაცემის სერვერთან"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"გამოიყენეთ ტელეფონის აუდიომოწყობილობაში"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ფაილების ტრანსფერისათვის გამოყენება"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"შეტანისთვის გამოყენება"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"სმენის აპარატის გამოყენება"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"დაწყვილება"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"დაწყვილება"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"გაუქმება"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index 4e2dacbe248d..acd7d875c7ba 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картасына кіру"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD форматты аудиомазмұн: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD форматты аудиомазмұн"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Есту аппараты"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Есту аппаратына жалғанған"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиосына жалғанған"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосына қосылған"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл жіберу серверіне жалғанған"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Телефон аудиосы үшін қолдану"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Файлды жіберу үшін қолдану"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Кіріс үшін қолдану"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Есту аппаратына пайдалану"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Жұптау"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ЖҰПТАУ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Бас тарту"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 400be09c88fa..9f55983693b7 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ಸಿಮ್ ಪ್ರವೇಶ"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ಆಡಿಯೋ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ಆಡಿಯೋ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ಶ್ರವಣ ಸಾಧನ"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ಶ್ರವಣ ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ಮಾಧ್ಯಮ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ಫೋನ್ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ಫೈಲ್ ವರ್ಗಾವಣೆ ಸರ್ವರ್ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ಫೋನ್ ಆಡಿಯೋಗಾಗಿ ಬಳಕೆ"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ಫೈಲ್ ವರ್ಗಾವಣೆಗಾಗಿ ಬಳಸು"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ಇನ್ಪುಟ್ಗಾಗಿ ಬಳಸು"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ಶ್ರವಣ ಸಾಧನಕ್ಕಾಗಿ ಬಳಸಿ"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ಜೋಡಿ"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ಜೋಡಿ ಮಾಡು"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ರದ್ದುಮಾಡಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index ab0202926124..35a2867fc7d5 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 액세스"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 오디오: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 오디오"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"보청기"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"보청기에 연결됨"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"미디어 오디오에 연결됨"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"휴대전화 오디오에 연결됨"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"파일 전송 서버에 연결됨"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"휴대전화 오디오에 사용"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"파일 전송에 사용"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"입력에 사용"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"보청기에 사용"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"페어링"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"페어링"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"취소"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 993fc3381643..c1f73cc897d4 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картаны пайдалануу мүмкүнчүлүгү"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD форматындагы аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD форматындагы аудио"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Угуу аппараты"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Угуу аппаратына туташты"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиого туташты"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосуна туташты"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл өткөрүү серверине туташты"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Телефон аудиосу үчүн колдонулсун"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Файл өткөрүү үчүн колдонулсун"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Киргизүү үчүн колдонулсун"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Угуу аппараты үчүн колдонуу"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Жупташтыруу"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ЖУПТАШТЫРУУ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Жок"</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index dc771f8ed818..24cc69eef366 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Piekļuve SIM kartei"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Dzirdes aparāts"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Izveidots savienojums ar dzirdes aparātu"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Savienots ar multivides audio"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Savienots ar tālruņa audio"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Savienots ar failu pārsūtīšanas serveri"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Izmantot tālruņa skaņai"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Izmantot faila pārsūtīšanai"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Izmantot ievadei"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Izmantot dzirdes aparātam"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Izveidot pāri"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SAVIENOT PĀRĪ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Atcelt"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 4ef3e86b3104..4798a6fc5151 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Пристап до SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD аудио"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слушно помагало"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Поврзано со слушно помагало"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Поврзан со аудио на медиуми"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Поврзан со аудио на телефон"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Поврзан со сервер за пренос на датотеки"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Користи за аудио на телефон"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Користи за пренос на датотеки"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Користи за внес"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Користете како слушно помагало"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Спари"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СПАРИ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Откажи"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index c24270152640..04b08f4f2fc4 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ആക്സസ്"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ഓഡിയോ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ഓഡിയോ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ശ്രവണ സഹായി"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ശ്രവണ സഹായിലേക്ക് കണക്റ്റ് ചെയ്തു"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"മീഡിയ ഓഡിയോയിലേക്ക് കണക്റ്റുചെയ്തു"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ഫോൺ ഓഡിയോയിൽ കണക്റ്റുചെയ്തു"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ഫയൽ കൈമാറ്റ സെർവറിലേക്ക് കണക്റ്റുചെയ്തു"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ഫോൺ ഓഡിയോയ്ക്കായി ഉപയോഗിക്കുക"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ഫയൽ കൈമാറ്റത്തിനായി ഉപയോഗിക്കുന്നു"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ഇൻപുട്ടിനായി ഉപയോഗിക്കുക"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ശ്രവണ സഹായത്തിനായി ഉപയോഗിക്കുക"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ജോടിയാക്കുക"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ജോടിയാക്കുക"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"റദ്ദാക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 7934e8d4a66d..26f4344db6e7 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम प्रवेश"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडिओ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ऐकण्याची सुविधा"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ऐकण्याच्या सुविधेशी कनेक्ट केलेले आहे"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडिओवर कनेक्ट केले"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन ऑडिओ वर कनेक्ट केले"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाईल स्थानांतर सर्व्हरवर कनेक्ट केले"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फोन ऑडिओसाठी वापरा"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फाईल स्थानांतरणासाठी वापरा"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट साठी वापरा"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ऐकण्याच्या सुविधेसाठी वापरा"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"पेअर करा"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"पेअर करा"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करा"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index e1aa376989fd..8e24ceedcee8 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Akses SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Alat Bantu Pendengaran"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Disambungkan ke Alat Bantu Pendengaran"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Disambungkan ke audio media"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Disambungkan ke audio telefon"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Bersambung ke pelayan pemindahan fail"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Gunakan untuk audio telefon"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Gunakan untuk pemindahan fail"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gunakan untuk input"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gunakan untuk Alat Bantu Pendengaran"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Jadikan pasangan"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"JADIKAN PASANGAN"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Batal"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index f9623168a90d..0b54624409fa 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Tilgang til SIM-kortet"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-lyd: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-lyd"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Høreapparat"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Koblet til høreapparat"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Koblet til medielyd"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Koblet til telefonlyd"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Koblet til tjener for filoverføring"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Bruk for telefonlyd"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Bruk til filoverføring"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Bruk for inndata"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Bruk for høreapparat"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sammenkoble"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOBLE TIL"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 0cac05e4205e..7b780096ed0b 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM पहुँच"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD अडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD अडियो"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"सुन्नमा मद्दत गर्ने यन्त्र"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"सुन्नमा मद्दत गर्ने यन्त्रमा जडान गरियो"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मिडिया अडियोसँग जडित"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन अडियोमा जडान गरियो"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाइल ट्रान्सफर सर्भरमा जडान गरियो"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फोन अडियोको लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फाइल ट्रान्सफरका लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुटको लागि प्रयोग गर्नुहोस्"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"सुन्नमा मद्दत गर्ने यन्त्रका लागि प्रयोग गर्नुहोस्"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"जोडी"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"जोडी"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द गर्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml new file mode 100644 index 000000000000..22f6edabab4c --- /dev/null +++ b/packages/SettingsLib/res/values-or/arrays.xml @@ -0,0 +1,253 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string-array name="wifi_status"> + <item msgid="1922181315419294640"></item> + <item msgid="8934131797783724664">"ସ୍କାନ୍ କରୁଛି…"</item> + <item msgid="8513729475867537913">"ସଂଯୋଗ କରୁଛି…"</item> + <item msgid="515055375277271756">"ପ୍ରାମାଣିକୀକରଣ କରାଯାଉଛି…"</item> + <item msgid="1943354004029184381">"IP ଠିକଣା ପ୍ରାପ୍ତ କରୁଛି…"</item> + <item msgid="4221763391123233270">"ସଂଯୋଜିତ"</item> + <item msgid="624838831631122137">"ନିଲମ୍ବିତ"</item> + <item msgid="7979680559596111948">"ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item> + <item msgid="1634960474403853625">"ବିଚ୍ଛିନ୍ନ"</item> + <item msgid="746097431216080650">"ଅସଫଳ"</item> + <item msgid="6367044185730295334">"ଅବରୋଧିତ"</item> + <item msgid="503942654197908005">"ସାମୟିକ ଭାବେ ଖରାପ ସଂଯୋଜନାକୁ ଏଡାଉଛି"</item> + </string-array> + <string-array name="wifi_status_with_ssid"> + <item msgid="7714855332363650812"></item> + <item msgid="8878186979715711006">"ସ୍କାନ୍ କରୁଛି…"</item> + <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>କୁ ସଂଯୋଗ କରାଯାଉଛି…"</item> + <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ପ୍ରମାଣିତ ହେଉଛି…"</item> + <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ IP ଠିକଣା ହାସଲ କରୁଛି…"</item> + <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ସଂଯୁକ୍ତ"</item> + <item msgid="1330262655415760617">"କଟିଯାଇଛି"</item> + <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item> + <item msgid="197508606402264311">"ସଂଯୁକ୍ତ ନାହିଁ"</item> + <item msgid="8578370891960825148">"ଅସଫଳ"</item> + <item msgid="5660739516542454527">"ଅବରୋଧିତ"</item> + <item msgid="1805837518286731242">"ଦୁର୍ବଳ ସଂଯୋଗକୂ ସାମୟିକ ଭାବେ ଏଡ଼ାଉଛି"</item> + </string-array> + <string-array name="hdcp_checking_titles"> + <item msgid="441827799230089869">"ଆଦୌ ଯାଞ୍ଚ କରନାହିଁ"</item> + <item msgid="6042769699089883931">"କେବଳ DRM କଣ୍ଟେଣ୍ଟ ଠାବ କର"</item> + <item msgid="9174900380056846820">"ସର୍ବଦା ଠାବ କର"</item> + </string-array> + <string-array name="hdcp_checking_summaries"> + <item msgid="505558545611516707">"କଦାପି HDCP ଯାଞ୍ଚ କରିବା ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ"</item> + <item msgid="3878793616631049349">"କେବଳ DRM ବିଷୟବସ୍ତୁ ପାଇଁ HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item> + <item msgid="45075631231212732">"ସର୍ବଦା HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item> + </string-array> + <string-array name="bluetooth_avrcp_versions"> + <item msgid="5347678900838034763">"AVRCP 1.4 (ଡିଫଲ୍ଟ)"</item> + <item msgid="2809759619990248160">"AVRCP 1.3"</item> + <item msgid="6199178154704729352">"AVRCP 1.5"</item> + <item msgid="5172170854953034852">"AVRCP 1.6"</item> + </string-array> + <string-array name="bluetooth_avrcp_version_values"> + <item msgid="2838624067805073303">"avrcp14"</item> + <item msgid="3011533352527449572">"avrcp13"</item> + <item msgid="8837606198371920819">"avrcp15"</item> + <item msgid="3422726142222090896">"avrcp16"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_titles"> + <item msgid="7065842274271279580">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ଡିଫଲ୍ଟ)"</item> + <item msgid="7539690996561263909">"SBC"</item> + <item msgid="686685526567131661">"AAC"</item> + <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ଅଡିଓ"</item> + <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ଅଡିଓ"</item> + <item msgid="6751080638867012696">"LDAC"</item> + <item msgid="723675059572222462">"ବିକଳ୍ପ କୋଡେକ୍ସକୁ ସକ୍ଷମ କରନ୍ତୁ"</item> + <item msgid="3304843301758635896">"ବିକଳ୍ପ କୋଡେକ୍ଗୁଡ଼ିକୁ ଅକ୍ଷମ କରନ୍ତୁ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_summaries"> + <item msgid="5062108632402595000">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item> + <item msgid="6898329690939802290">"SBC"</item> + <item msgid="6839647709301342559">"AAC"</item> + <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ଅଡିଓ"</item> + <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ଅଡିଓ"</item> + <item msgid="7950781694447359344">"LDAC"</item> + <item msgid="2209680154067241740">"ବିକଳ୍ପ କୋଡେକ୍ସ ସକ୍ଷମ କରନ୍ତୁ"</item> + <item msgid="741805482892725657">"ବିକଳ୍ପ କୋଡେକ୍ସ ଅକ୍ଷମ କରନ୍ତୁ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_sample_rate_titles"> + <item msgid="3093023430402746802">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item> + <item msgid="8895532488906185219">"44.1 kHz"</item> + <item msgid="2909915718994807056">"48.0 kHz"</item> + <item msgid="3347287377354164611">"88.2 kHz"</item> + <item msgid="1234212100239985373">"96.0 kHz"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_sample_rate_summaries"> + <item msgid="3214516120190965356">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item> + <item msgid="4482862757811638365">"44.1 kHz"</item> + <item msgid="354495328188724404">"48.0 kHz"</item> + <item msgid="7329816882213695083">"88.2 kHz"</item> + <item msgid="6967397666254430476">"96.0 kHz"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles"> + <item msgid="2684127272582591429">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item> + <item msgid="5618929009984956469">"16 ବିଟ୍ସ/ସାମ୍ପଲ୍"</item> + <item msgid="3412640499234627248">"24 ବିଟ୍ସ/ନମୁନା"</item> + <item msgid="121583001492929387">"32 ବିଟସ୍/ନମୂନା"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries"> + <item msgid="1081159789834584363">"ସିଷ୍ଟମ୍ ମନୋନୟନ (ଡିଫଲ୍ଟ) ବ୍ୟବହାର କରନ୍ତୁ"</item> + <item msgid="4726688794884191540">"୧୬ ବିଟସ୍/ନମୁନା"</item> + <item msgid="305344756485516870">"24 ବିଟସ୍/ନମୂନା"</item> + <item msgid="244568657919675099">"32 ବିଟସ୍/ନମୁନା"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_titles"> + <item msgid="5226878858503393706">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ଡିଫଲ୍ଟ)"</item> + <item msgid="4106832974775067314">"ମୋନୋ"</item> + <item msgid="5571632958424639155">"ଷ୍ଟେରିଓ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_channel_mode_summaries"> + <item msgid="4118561796005528173">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ(ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item> + <item msgid="8900559293912978337">"ମୋନୋ"</item> + <item msgid="8883739882299884241">"ଷ୍ଟେରିଓ"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles"> + <item msgid="7158319962230727476">"ଅଡିଓ ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ(990kbps/909kbps)"</item> + <item msgid="2921767058740704969">"ସନ୍ତୁଳିତ ଅଡିଓ ଓ ସଂଯୋଗ ଗୁଣବତ୍ତା (660kbps/606kbps)"</item> + <item msgid="8860982705384396512">"ସଂଯୋଗର ଗୁଣବତ୍ତା (330kbps/303kbps) ପାଇଁ ଉପଯୁକ୍ତ କରାଯାଇଛି"</item> + <item msgid="4414060457677684127">"ସର୍ବୋତ୍ତମ ପ୍ରୟାସ (ଅନୁକୁଳ ବିଟ୍ ରେଟ୍)"</item> + </string-array> + <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries"> + <item msgid="6398189564246596868">"ଅଡିଓର ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ"</item> + <item msgid="4327143584633311908">"ସନ୍ତୁଳିତ ଅଡିଓ ଓ ସଂଯୋଗ କ୍ୱାଲିଟୀ"</item> + <item msgid="4681409244565426925">"ସଂଯୋଗର ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ"</item> + <item msgid="364670732877872677">"ସର୍ବୋତ୍ତମ ପ୍ରୟାସ (ଅନୁକୂଳ ବିଟ୍ ରେଟ୍)"</item> + </string-array> + <string-array name="select_logd_size_titles"> + <item msgid="8665206199209698501">"ଅଫ୍"</item> + <item msgid="1593289376502312923">"64K"</item> + <item msgid="487545340236145324">"256K"</item> + <item msgid="2423528675294333831">"1M"</item> + <item msgid="180883774509476541">"4M"</item> + <item msgid="2803199102589126938">"16M"</item> + </string-array> + <string-array name="select_logd_size_lowram_titles"> + <item msgid="6089470720451068364">"ବନ୍ଦ"</item> + <item msgid="4622460333038586791">"64K"</item> + <item msgid="2212125625169582330">"256K"</item> + <item msgid="1704946766699242653">"1M"</item> + </string-array> + <string-array name="select_logd_size_summaries"> + <item msgid="6921048829791179331">"ବନ୍ଦ"</item> + <item msgid="2969458029344750262">"64K ପିଛା ଲଗ୍ ବଫର୍"</item> + <item msgid="1342285115665698168">"256K ଲଗ୍ ପ୍ରତି ବଫର୍"</item> + <item msgid="1314234299552254621">"ଲଗ୍ ବଫର୍ ପ୍ରତି 1M"</item> + <item msgid="3606047780792894151">"ଲଗ୍ ବଫର୍ ପ୍ରତି 4M"</item> + <item msgid="5431354956856655120">"16M ଲଗ ପିଛା ବଫର୍"</item> + </string-array> + <string-array name="select_logpersist_titles"> + <item msgid="1744840221860799971">"ବନ୍ଦ"</item> + <item msgid="3054662377365844197">"ସମସ୍ତ"</item> + <item msgid="688870735111627832">"ରେଡିଓ ଛଡ଼ା ଅନ୍ୟ ସବୁ"</item> + <item msgid="2850427388488887328">"କେବଳ କର୍ନେଲ୍"</item> + </string-array> + <string-array name="select_logpersist_summaries"> + <item msgid="2216470072500521830">"ଅଫ"</item> + <item msgid="172978079776521897">"ସମସ୍ତ ଲଗ୍ ବଫର୍"</item> + <item msgid="3873873912383879240">"ରେଡିଓ ଲଗ୍ ବଫର୍ଗୁଡିକ ଛଡ଼ା ଅନ୍ୟ ସବୁ"</item> + <item msgid="8489661142527693381">"କେବଳ କର୍ନେଲ୍ ଲଗ୍ ବଫର୍"</item> + </string-array> + <string-array name="window_animation_scale_entries"> + <item msgid="8134156599370824081">"ଆନିମେଶନ୍ ବନ୍ଦ କରନ୍ତୁ"</item> + <item msgid="6624864048416710414">"ଆନିମେଶନ ସ୍କେଲ .5x"</item> + <item msgid="2219332261255416635">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item> + <item msgid="3544428804137048509">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1.5x"</item> + <item msgid="3110710404225974514">"ଆନିମେଶନ ସ୍କେଲ 2x"</item> + <item msgid="4402738611528318731">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item> + <item msgid="6189539267968330656">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 10x"</item> + </string-array> + <string-array name="transition_animation_scale_entries"> + <item msgid="8464255836173039442">"ଆନିମେଶନ୍ ବନ୍ଦ କରନ୍ତୁ"</item> + <item msgid="3375781541913316411">"ଆନିମେଶନ୍ ସ୍କେଲ୍ .5x"</item> + <item msgid="1991041427801869945">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item> + <item msgid="4012689927622382874">"ଆନିମେସନ୍ ସ୍କେଲ 1.5x"</item> + <item msgid="3289156759925947169">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 2x"</item> + <item msgid="7705857441213621835">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item> + <item msgid="6660750935954853365">"ଆନିମେସନ୍ ସ୍କେଲ୍ 10x"</item> + </string-array> + <string-array name="animator_duration_scale_entries"> + <item msgid="6039901060648228241">"ଆନିମେଶନ୍ ବନ୍ଦ"</item> + <item msgid="1138649021950863198">"ଆନିମେଶନ୍ ସ୍କେଲ୍ .5x"</item> + <item msgid="4394388961370833040">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item> + <item msgid="8125427921655194973">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1.5x"</item> + <item msgid="3334024790739189573">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 2x"</item> + <item msgid="3170120558236848008">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item> + <item msgid="1069584980746680398">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 10x"</item> + </string-array> + <string-array name="overlay_display_devices_entries"> + <item msgid="1606809880904982133">"କିଛି ନାହିଁ"</item> + <item msgid="9033194758688161545">"480p"</item> + <item msgid="1025306206556583600">"480p (ସୁରକ୍ଷିତ)"</item> + <item msgid="1853913333042744661">"p"</item> + <item msgid="3414540279805870511">"720p (ସୁରକ୍ଷିତ)"</item> + <item msgid="9039818062847141551">"1080p"</item> + <item msgid="4939496949750174834">"1080p (ସୁରକ୍ଷିତ)"</item> + <item msgid="1833612718524903568">"4K"</item> + <item msgid="238303513127879234">"4K (ସୁରକ୍ଷିତ)"</item> + <item msgid="3547211260846843098">"4K (ଅପ୍ସ୍କେଲ୍ କରାଯାଇଛି)"</item> + <item msgid="5411365648951414254">"4K (ଉତ୍ତମ, ସୁରକ୍ଷିତ)"</item> + <item msgid="1311305077526792901">"720p, 1080p (ଡୁଆଲ୍ ସ୍କ୍ରୀନ୍)"</item> + </string-array> + <string-array name="enable_opengl_traces_entries"> + <item msgid="3191973083884253830">"କିଛିନାହିଁ"</item> + <item msgid="9089630089455370183">"Logcat"</item> + <item msgid="5397807424362304288">"Systrace (ଗ୍ରାଫିକ୍ସ)"</item> + <item msgid="1340692776955662664">"glGetError ରେ କଲ୍ ଷ୍ଟାକ୍"</item> + </string-array> + <string-array name="show_non_rect_clip_entries"> + <item msgid="993742912147090253">"ଅଫ୍"</item> + <item msgid="675719912558941285">"ଅଣ-ଆୟତାକାର କ୍ଲିପ୍ କ୍ଷେତ୍ର ନୀଳ ରଙ୍ଗରେ ଆଙ୍କନ୍ତୁ"</item> + <item msgid="1064373276095698656">"ଟେଷ୍ଟ ହୋଇଥିବା ଅଙ୍କନ କମାଣ୍ଡଗୁଡ଼ିକୁ ସବୁଜରେ ଚିହ୍ନିତ କରନ୍ତୁ"</item> + </string-array> + <string-array name="track_frame_time_entries"> + <item msgid="2193584639058893150">"ବନ୍ଦ"</item> + <item msgid="2751513398307949636">"ସ୍କ୍ରୀନ୍ରେ ବାର୍ ପରି"</item> + <item msgid="2355151170975410323">"ରେ <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item> + </string-array> + <string-array name="debug_hw_overdraw_entries"> + <item msgid="8190572633763871652">"ଅଫ୍"</item> + <item msgid="7688197031296835369">"ଓଭର୍ ଡ୍ର କ୍ଷେତ୍ରଗୁଡ଼ିକୁ ଦେଖାଅ"</item> + <item msgid="2290859360633824369">"ଡିଉଟେରାନୋମାଲୀ ପାଇଁ କ୍ଷେତ୍ର ଦେଖନ୍ତୁ"</item> + </string-array> + <string-array name="app_process_limit_entries"> + <item msgid="3401625457385943795">"ମାନକ ସୀମା"</item> + <item msgid="4071574792028999443">"କୌଣସି ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ପ୍ରୋସେସ୍ ଚାଲୁନାହିଁ"</item> + <item msgid="4810006996171705398">"ସର୍ବାଧିକ 1ଟି ପ୍ରକ୍ରିୟା"</item> + <item msgid="8586370216857360863">"ସର୍ବାଧିକ 2 ଟି ପ୍ରକ୍ରିୟା"</item> + <item msgid="836593137872605381">"ଅତିବେଶୀରେ 3ଟି ପ୍ରକ୍ରିୟା"</item> + <item msgid="7899496259191969307">"ସର୍ବାଧିକ 4 ଟି ପ୍ରକ୍ରିୟା"</item> + </string-array> + <string-array name="usb_configuration_titles"> + <item msgid="488237561639712799">"ଚାର୍ଜ ହେଉଛି"</item> + <item msgid="5220695614993094977">"MTP (ମିଡିଆ ସ୍ଥାନାନ୍ତର ପ୍ରୋଟୋକଲ୍)"</item> + <item msgid="2086000968159047375">"PTP (ପିକଚର୍ ଟ୍ରାନ୍ସଫର୍ ପ୍ରୋଟୋକଲ୍)"</item> + <item msgid="7398830860950841822">"RNDIS (USB ଏଥରନେଟ)"</item> + <item msgid="1718924214939774352">"ଅଡିଓ ଉତ୍ସ"</item> + <item msgid="8126315616613006284">"MIDI"</item> + </string-array> +</resources> diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml new file mode 100644 index 000000000000..0c2cbdac6ae0 --- /dev/null +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -0,0 +1,466 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** +** Copyright 2015 The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="wifi_fail_to_scan" msgid="1265540342578081461">"ନେଟ୍ୱର୍କଗୁଡ଼ିକୁ ଖୋଜିପାରୁନାହିଁ"</string> + <string name="wifi_security_none" msgid="7985461072596594400">"କିଛି ନାହିଁ"</string> + <string name="wifi_remembered" msgid="4955746899347821096">"ସେଭ୍ ହୋଇଗଲା"</string> + <string name="wifi_disabled_generic" msgid="4259794910584943386">"ଅକ୍ଷମ ହୋଇଛି"</string> + <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP କନଫିଗରେଶନ ବିଫଳ ହୋଇଛି"</string> + <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"ନିମ୍ନ ମାନର ନେଟ୍ୱର୍କ କାରଣରୁ ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string> + <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ୱାଇଫାଇ ସଂଯୋଗ ବିଫଳ ହୋଇଛି"</string> + <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ସତ୍ୟାପନରେ ସମସ୍ୟା"</string> + <string name="wifi_cant_connect" msgid="5410016875644565884">"ସଂଯୋଗ କରିପାରିବ ନାହିଁ"</string> + <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' ସହିତ ସଂଯୁକ୍ତ ହୋଇପାରୁନାହିଁ"</string> + <string name="wifi_check_password_try_again" msgid="516958988102584767">"ପାସ୍ୱର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string> + <string name="wifi_not_in_range" msgid="1136191511238508967">"ପରିସୀମାରେ ନାହିଁ"</string> + <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୁକ୍ତ ହେବନାହିଁ"</string> + <string name="wifi_no_internet" msgid="4663834955626848401">"ଇଣ୍ଟରନେଟ୍ର କୌଣସି ଆକ୍ସେସ୍ ନାହିଁ"</string> + <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> ଦ୍ୱାରା ସେଭ କରାଯାଇଛି"</string> + <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲୀ ସଂଯୁକ୍ତ"</string> + <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ନେଟୱର୍କ ମୂଲ୍ୟାୟନ ପ୍ରଦାତାଙ୍କ ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲ୍ୟ ସଂଯୁକ୍ତ"</string> + <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string> + <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string> + <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍ନେଟ୍ ନାହିଁ"</string> + <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ସାମୟିକ ଭାବେ ପୂର୍ଣ୍ଣ"</string> + <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string> + <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string> + <string name="speed_label_very_slow" msgid="1867055264243608530">"ବହୁତ ମନ୍ଥର"</string> + <string name="speed_label_slow" msgid="813109590815810235">"କମ୍ ବେଗ"</string> + <string name="speed_label_okay" msgid="2331665440671174858">"ଠିକ୍ ଅଛି"</string> + <string name="speed_label_medium" msgid="3175763313268941953">"ମଧ୍ୟମ"</string> + <string name="speed_label_fast" msgid="7715732164050975057">"ଦ୍ରୁତ"</string> + <string name="speed_label_very_fast" msgid="2265363430784523409">"ଅତି ଦ୍ରୁତ"</string> + <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string> + <string name="bluetooth_disconnected" msgid="6557104142667339895">"ବିଛିନ୍ନ ହେଲା"</string> + <string name="bluetooth_disconnecting" msgid="8913264760027764974">"ବିଚ୍ଛିନ୍ନ କରୁଛି…"</string> + <string name="bluetooth_connecting" msgid="8555009514614320497">"ସଂଯୋଗ କରାଯାଉଛି…"</string> + <!-- no translation found for bluetooth_connected (5427152882755735944) --> + <skip /> + <string name="bluetooth_pairing" msgid="1426882272690346242">"ପେୟାର୍ କରୁଛି…"</string> + <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) --> + <skip /> + <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) --> + <skip /> + <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) --> + <skip /> + <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ମିଡିଆ ଅଡିଓ"</string> + <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ଫୋନ୍ କଲ୍ଗୁଡ଼ିକ"</string> + <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍"</string> + <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ଇନ୍ପୁଟ୍ ଡିଭାଇସ୍"</string> + <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍"</string> + <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"ଯୋଗାଯୋଗ ଶେୟାରିଙ୍ଗ"</string> + <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"ଯୋଗାଯୋଗ ଶେୟାର୍ କରିବା ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଶେୟାରିଙ୍ଗ"</string> + <string name="bluetooth_profile_map" msgid="1019763341565580450">"ଟେକ୍ସଟ୍ ମେସେଜ୍"</string> + <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ସିମ୍ ଆକ୍ସେସ୍"</string> + <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ଅଡିଓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> + <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ଅଡିଓ"</string> + <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> + <skip /> + <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> + <skip /> + <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ମିଡିଆ ଅଡିଓ ସହ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ଫୋନ୍ ଅଡିଓ ସହିତ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ସର୍ଭର୍ ସହ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"ମାନଚିତ୍ର ସହିତ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP ସହିତ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ସର୍ଭର୍ ସହ ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string> + <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ଇନ୍ପୁଟ୍ ଡିଇଭାସ୍ ସହ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"ଆଭ୍ୟନ୍ତରୀଣ ଆକ୍ସେସ୍ ପାଇଁ ଡିଭାଇସ୍ ସହିତ ସଂଯୁକ୍ତ"</string> + <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"ଡିଭାଇସ୍ ସହ ସ୍ଥାନୀୟ ଇଣ୍ଟରନେଟ୍ ସଂଯୋଗ ଶେୟାର୍ କରାଯାଉଛି"</string> + <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"ମାନଚିତ୍ର ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ଆକସେସ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"ମିଡିଆ ଅଡିଓ ପାଇଁ ବ୍ୟବହାର କର"</string> + <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ଫୋନ୍ ଅଡିଓ ପାଇଁ ବ୍ୟବହାର କର"</string> + <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ଇନ୍ପୁଟ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> + <skip /> + <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ପେୟାର୍"</string> + <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ପେୟାର୍"</string> + <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> + <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ପେୟାରିଂ ଫଳରେ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଆପଣଙ୍କ ସମ୍ପର୍କଗୁଡ଼ିକୁ ଏବଂ କଲ୍ର ଇତିବୃତିକୁ ଆକସେସ୍ ମଞ୍ଜୁର ହୁଏ।"</string> + <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍ କରିହେଲା ନାହିଁ।"</string> + <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ଏକ ଭୁଲ୍ PIN କିମ୍ବା ପାସକୀ କାରଣରୁ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍ କରିପାରିଲା ନାହିଁ।"</string> + <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ଯୋଗାଯୋଗ ସ୍ଥାପନା କରିପାରୁନାହିଁ।"</string> + <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପେୟାରିଙ୍ଗ ପାଇଁ ପ୍ରତ୍ୟାଖ୍ୟାନ କରିଦିଆଗଲା।"</string> + <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"କମ୍ପ୍ୟୁଟର୍"</string> + <string name="bluetooth_talkback_headset" msgid="5140152177885220949">"ହେଡ୍ସେଟ୍"</string> + <string name="bluetooth_talkback_phone" msgid="4260255181240622896">"ଫୋନ୍"</string> + <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"ଇମେଜିଙ୍ଗ"</string> + <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ହେଡ୍ଫୋନ୍"</string> + <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ଇନ୍ପୁଟ୍ ଉପକରଣ"</string> + <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ବ୍ଲୁଟୂଥ୍"</string> + <string name="accessibility_wifi_off" msgid="1166761729660614716">"ୱାଇ-ଫାଇ ବନ୍ଦ।"</string> + <string name="accessibility_no_wifi" msgid="8834610636137374508">"ୱାଇଫାଇ ବିଚ୍ଛିନ୍ନ କରାଗଲା।"</string> + <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifiର 1 ବାର"</string> + <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ୱାଇ-ଫାଇର ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ୱାଇ-ଫାଇର ତିନୋଟି ବାର୍।"</string> + <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ୱାଇ-ଫାଇର ସଙ୍କେତ ସର୍ବୋଚ୍ଚ।"</string> + <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ଖୋଲା ନେଟୱର୍କ"</string> + <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ସୁରକ୍ଷିତ ନେଟ୍ୱର୍କ"</string> + <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> + <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"କଢ଼ାଯାଇଥିବା ଆପ୍ଗୁଡ଼ିକ"</string> + <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ଆପ୍ ଏବଂ ଉପଯୋଗକର୍ତ୍ତା ବାହାର କରାଗଲା"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ଟିଥରିଙ୍ଗ"</string> + <string name="tether_settings_title_wifi" msgid="3277144155960302049">"ପୋର୍ଟବଲ୍ ହଟସ୍ପଟ୍"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ବ୍ଲୁଟୂଥ ଟିଥରିଙ୍ଗ"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ଟିଥର୍ କରୁଛି"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"ଟିଥରିଙ୍ଗ ଓ ପୋର୍ଟବଲ୍ ହଟ୍ସ୍ପଟ୍"</string> + <string name="managed_user_title" msgid="8109605045406748842">"ସମସ୍ତ କାର୍ଯ୍ୟ ଆପ୍"</string> + <string name="user_guest" msgid="8475274842845401871">"ଅତିଥି"</string> + <string name="unknown" msgid="1592123443519355854">"ଅଜଣା"</string> + <string name="running_process_item_user_label" msgid="3129887865552025943">"ଉପଯୋଗକର୍ତ୍ତା: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string> + <string name="launch_defaults_some" msgid="313159469856372621">"କିଛି ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ ମାନ ସେଟ୍ ହୋଇଛି"</string> + <string name="launch_defaults_none" msgid="4241129108140034876">"କୌଣସି ପୂର୍ବ-ନିର୍ଦ୍ଧାରଣ ସେଟ୍ ହୋଇନାହିଁ"</string> + <string name="tts_settings" msgid="8186971894801348327">"ଲେଖା-ରୁ-କଥା ସେଟିଙ୍ଗ୍"</string> + <string name="tts_settings_title" msgid="1237820681016639683">"ଲେଖା-ରୁ-କଥା ଆଉଟ୍ପୁଟ୍"</string> + <string name="tts_default_rate_title" msgid="6030550998379310088">"ସ୍ପୀଚ୍ ଦର"</string> + <string name="tts_default_rate_summary" msgid="4061815292287182801">"ଲେଖା ପଢ଼ିବାର ବେଗ"</string> + <string name="tts_default_pitch_title" msgid="6135942113172488671">"ପିଚ୍"</string> + <string name="tts_default_pitch_summary" msgid="1944885882882650009">"ସଂଶ୍ଳେଷିତ ସ୍ପିଚ୍ର ଟୋନ୍ରେ ପ୍ରଭାବ ପକାଏ"</string> + <string name="tts_default_lang_title" msgid="8018087612299820556">"ଭାଷା"</string> + <string name="tts_lang_use_system" msgid="2679252467416513208">"ସିଷ୍ଟମ୍ ଭାଷା ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="tts_lang_not_selected" msgid="7395787019276734765">"ଭାଷା ମନୋନୀତ ନୁହେଁ"</string> + <string name="tts_default_lang_summary" msgid="5219362163902707785">"ପଢ଼ାଯାଇଥିବା ଲେଖା ପାଇଁ ଭାଷା-ନିର୍ଦ୍ଦିଷ୍ଟ ସ୍ୱର ସେଟ୍ କରେ"</string> + <string name="tts_play_example_title" msgid="7094780383253097230">"ଗୋଟିଏ ଉଦାହରଣକୁ ଶୁଣନ୍ତୁ"</string> + <string name="tts_play_example_summary" msgid="8029071615047894486">"ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ର ଏକ ଛୋଟ ନମୁନା ଶୁଣନ୍ତୁ"</string> + <string name="tts_install_data_title" msgid="4264378440508149986">"ଭଏସ୍ ଡାଟା ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="tts_install_data_summary" msgid="5742135732511822589">"ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ପାଇଁ ଆବଶ୍ୟକ ଭଏସ୍ ଡାଟା ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="tts_engine_security_warning" msgid="8786238102020223650">"ପାସ୍ୱର୍ଡ ଓ କ୍ରେଡିଟ୍ କାର୍ଡ ନମ୍ୱର୍ଗୁଡ଼ିକ ଭଳି ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ ସମେତ କୁହାଯିବାକୁ ଥିବା ସମସ୍ତ ଲେଖାକୁ, ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ଇଞ୍ଜିନ୍ ସଂଗ୍ରହ କରିପାରେ। ଏହା, <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ଇଞ୍ଜିନ୍ରୁ ଆସିଛି। ଏହି ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ଇଞ୍ଜିନ୍ର ବ୍ୟବହାରକୁ ସକ୍ଷମ କରିବେ?"</string> + <string name="tts_engine_network_required" msgid="1190837151485314743">"ଟେକ୍ସଟ୍-ରୁ-କଥା ଆଉଟପୁଟ୍ ପାଇଁ ଏହି ଭାଷା ଏକ କାମକରୁଥିବା ନେଟୱାର୍କ ସଂଯୋଗ ଆବଶ୍ୟକ କରେ।"</string> + <string name="tts_default_sample_string" msgid="4040835213373086322">"ଏହା ହେଉଛି ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ର ଏକ ଉଦାହରଣ"</string> + <string name="tts_status_title" msgid="7268566550242584413">"ଡିଫଲ୍ଟ ଭାଷା ଷ୍ଟାଟସ୍"</string> + <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> ପୂର୍ଣ୍ଣରୂପେ ସମର୍ଥିତ"</string> + <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> ନେଟ୍ୱର୍କ ସଂଯୋଜନା ଆବଶ୍ୟକ କରେ"</string> + <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> ସପୋର୍ଟ କରୁ ନାହିଁ"</string> + <string name="tts_status_checking" msgid="5339150797940483592">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string> + <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> ପାଇଁ ସେଟିଙ୍ଗ"</string> + <string name="tts_engine_settings_button" msgid="1030512042040722285">"ଇଞ୍ଜିନ୍ ସେଟିଙ୍ଗ ଆରମ୍ଭ କରନ୍ତୁ"</string> + <string name="tts_engine_preference_section_title" msgid="448294500990971413">"ନିଜ ପସନ୍ଦର ଇଞ୍ଜିନ୍"</string> + <string name="tts_general_section_title" msgid="4402572014604490502">"ସାଧାରଣ"</string> + <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"ସ୍ପୀଚ୍ର ପିଚ୍ ରିସେଟ୍ କରନ୍ତୁ"</string> + <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"ପିଚକୁ ରିସେଟ କରନ୍ତୁ, ଯେଉଁଠାରେ ଲେଖା, ଡିଫଲ୍ଟ ଭାବେ କୁହାଯାଏ।"</string> + <string-array name="tts_rate_entries"> + <item msgid="6695494874362656215">"ବହୁତ ମନ୍ଥର"</item> + <item msgid="4795095314303559268">"ମନ୍ଥର"</item> + <item msgid="8903157781070679765">"ସାମାନ୍ୟ"</item> + <item msgid="164347302621392996">"ଦ୍ରୁତ"</item> + <item msgid="5794028588101562009">"ଦ୍ରୁତତର"</item> + <item msgid="7163942783888652942">"ଅତି ଦ୍ରୁତ"</item> + <item msgid="7831712693748700507">"ଦ୍ରୁତ"</item> + <item msgid="5194774745031751806">"ଅତି ତୀବ୍ର"</item> + <item msgid="9085102246155045744">"ଦ୍ରୁତତ୍ତମ"</item> + </string-array> + <string name="choose_profile" msgid="6921016979430278661">"ପ୍ରୋଫାଇଲ୍ ବାଛନ୍ତୁ"</string> + <string name="category_personal" msgid="1299663247844969448">"ବ୍ୟକ୍ତିଗତ"</string> + <string name="category_work" msgid="8699184680584175622">"କାମ"</string> + <string name="development_settings_title" msgid="215179176067683667">"ଡେଭଲପର୍ଙ୍କ ପାଇଁ ବିକଳ୍ପମାନ"</string> + <string name="development_settings_enable" msgid="542530994778109538">"ଡେଭଲପର୍ ବିକଳ୍ପଗୁଡ଼ିକ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="development_settings_summary" msgid="1815795401632854041">"ଆପ୍ର ବିକାଶ ପାଇଁ ବିକଳ୍ପମାନ ସେଟ୍ କରନ୍ତୁ"</string> + <string name="development_settings_not_available" msgid="4308569041701535607">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଡେଭଲପରଙ୍କ ବିକଳ୍ପସମୂହ ଉପଲବ୍ଧ ନୁହେଁ"</string> + <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନୁହେଁ"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଟିଥରିଙ୍ଗ ସେଟିଙ୍ଗ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="apn_settings_not_available" msgid="7873729032165324000">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ନାମର ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="enable_adb" msgid="7982306934419797485">"USB ଡିବଗ୍ ହେଉଛି"</string> + <string name="enable_adb_summary" msgid="4881186971746056635">"USB ସଂଯୁକ୍ତ ହେବାବେଳେ ଡିବଗ୍ ମୋଡ୍"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"USB ଡିବଗିଙ୍ଗ ଅଧିକାରକୁ କାଢ଼ିଦିଅନ୍ତୁ"</string> + <string name="bugreport_in_power" msgid="7923901846375587241">"ବଗ୍ ରିପୋର୍ଟ ଶର୍ଟକଟ୍"</string> + <string name="bugreport_in_power_summary" msgid="1778455732762984579">"ତ୍ରୁଟି ରିପୋର୍ଟ ଦେବାପାଇଁ ପାୱର୍ ମେନୁରେ ଏକ ବଟନ୍ ଦେଖନ୍ତୁ"</string> + <string name="keep_screen_on" msgid="1146389631208760344">"ଜାଗ୍ରତ ରଖନ୍ତୁ"</string> + <string name="keep_screen_on_summary" msgid="2173114350754293009">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string> + <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ବ୍ଲୁଟୁଥ୍ HCI ସ୍ନୁପ୍ ଲଗ୍ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ଗୋଟିଏ ଫାଇଲ୍ରେ ସମସ୍ତ ବ୍ଲୁଟୂଥ୍ HCI ପ୍ୟାକେଟ୍ଗୁଡିକୁ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string> + <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ଅନଲକ୍ କରିବା"</string> + <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"bootloaderକୁ ଅନ୍ଲକ୍ ହେବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ଅନଲକ୍ କରିବା ଅନୁମତି ଦେବେ?"</string> + <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ଚେତାବନୀ: ଏହି ସେଟିଙ୍ଗ ଚାଲୁ ଥିବାବେଳେ ଡିଭାଇସ୍ର ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ କାମ କରିବ ନାହିଁ"</string> + <string name="mock_location_app" msgid="7966220972812881854">"ନକଲି ଲୋକେଶନ୍ ଆପ୍ର ଚୟନ କରନ୍ତୁ"</string> + <string name="mock_location_app_not_set" msgid="809543285495344223">"କୌଣସି ନକଲି ଲୋକେଶନ ଏପ ସେଟ କରାଯାଇନାହିଁ"</string> + <string name="mock_location_app_set" msgid="8966420655295102685">"ନକଲି ଲୋକେଶନ୍ ଆପ୍: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="debug_networking_category" msgid="7044075693643009662">"ନେଟ୍ୱର୍କିଙ୍ଗ"</string> + <string name="wifi_display_certification" msgid="8611569543791307533">"ୱାୟର୍ଲେସ୍ ଡିସ୍ପ୍ଲେ ସର୍ଟିଫିକେଶନ୍"</string> + <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi ଭରବୋସ୍ ଲଗିଙ୍ଗ ସକ୍ଷମ କରନ୍ତୁ"</string> + <!-- no translation found for wifi_connected_mac_randomization (3168165236877957767) --> + <skip /> + <string name="mobile_data_always_on" msgid="8774857027458200434">"ମୋବାଇଲ୍ ଡାଟା ସର୍ବଦା ସକ୍ରିୟ"</string> + <string name="tethering_hardware_offload" msgid="7470077827090325814">"ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର ବେଗ"</string> + <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"ବ୍ଲୁଟୂଥ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ"</string> + <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ପୂର୍ଣ୍ଣ ଭଲ୍ୟୁମ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string> + <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string> + <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍"</string> + <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ସାମ୍ପଲ୍ ରେଟ୍"</string> + <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ: \n ନମୁନା ଦର"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ନମୁନା ପିଛା ବ୍ଲୁଟୁଥ୍ ଅଡିଓ ବିଟ୍ସ"</string> + <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ବ୍ଲୁଟୂଥ ଅଡିଓ କୋଡେକ୍ ବାଛନ୍ତୁ:\nନମୂନା ପ୍ରତି ବିଟସ୍"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ଚ୍ୟାନେଲ୍ ମୋଡ୍"</string> + <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ବ୍ଲୁଟୂଥ୍ ଅଡ଼ିଓ କୋଡେକ୍:\nଚାନେଲ୍ ମୋଡ୍ ବାଛନ୍ତୁ"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ LDAC କୋଡେକ୍: ପ୍ଲେବ୍ୟାକ୍ ଗୁଣବତ୍ତା"</string> + <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ LDAC କୋଡେକ୍ ବାଛନ୍ତୁ:\nପ୍ଲେବ୍ୟାକ୍ କ୍ୱାଲିଟୀ"</string> + <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string> + <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ବ୍ୟକ୍ତିଗତ DNS"</string> + <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍ ବାଛନ୍ତୁ"</string> + <string name="private_dns_mode_off" msgid="8236575187318721684">"ଅଫ୍"</string> + <string name="private_dns_mode_opportunistic" msgid="7608409735589131766">"ସୁଯୋଗବାଦୀ"</string> + <string name="private_dns_mode_provider" msgid="8354935160639360804">"ବ୍ୟକ୍ତିଗତ DNS ପ୍ରଦାତା ହୋଷ୍ଟନାମ"</string> + <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ପ୍ରବେଶ କରନ୍ତୁ"</string> + <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ୱେୟାରଲେସ୍ ପ୍ରଦର୍ଶନ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପଗୁଡିକ ଦେଖାନ୍ତୁ"</string> + <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string> + <!-- no translation found for wifi_connected_mac_randomization_summary (1743059848752201485) --> + <skip /> + <string name="select_logd_size_title" msgid="7433137108348553508">"ଲଗର୍ ବଫର୍ ଆକାରଗୁଡ଼ିକ"</string> + <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ଲଗ୍ ବଫର୍ ପିଛା ଲଗର୍ ଆକାରଗୁଡିକର ଚୟନ କରନ୍ତୁ"</string> + <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ଲଗର୍ ରୋଧି ଷ୍ଟୋରେଜ୍ ଖାଲି କରିବେ?"</string> + <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"ଯଦି ଆମେ ଦୃଢ ଲଗର୍ ସହିତ ଆଉ ତଦାରଖ କରୁନଥିବୁ, ତେବେ ଆମକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଥିବା ଲଗର୍ ଡାଟାକୁ ଲିଭାଇବାକୁ ପଡ଼ିବ।"</string> + <string name="select_logpersist_title" msgid="7530031344550073166">"ଡିଭାଇସ୍ରେ ଲଗାତର ଲଗର୍ ଡାଟା ଷ୍ଟୋର୍ କରନ୍ତୁ"</string> + <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ଡିଭାଇସ୍ରେ ଲଗାତର ଷ୍ଟୋର୍ କରିବାକୁ ଲଗ୍ ବଫର୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="allow_mock_location" msgid="2787962564578664888">"ନକଲି ଲୋକେଶନ୍ର ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="allow_mock_location_summary" msgid="317615105156345626">"ନକଲି ଲୋକେଶନ୍ର ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="debug_view_attributes" msgid="6485448367803310384">"ବିଶେଷତା ଯାଞ୍ଚ ଦର୍ଶନ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ୱାଇ-ଫାଇ ସକ୍ରିୟ ଥିଲେ ମଧ୍ୟ ସର୍ବଦା ମୋବାଇଲ୍ ଡାଟାକୁ ସକ୍ରିୟ ରଖନ୍ତୁ (ଦ୍ରୁତ ନେଟ୍ୱର୍କ ସ୍ୱିଚିଙ୍ଗ ପାଇଁ)।"</string> + <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"ଯଦି ଉପଲବ୍ଧ ଥାଏ, ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଶନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"USB ଡିବଗିଂ କେବଳ ଡେଭଲପମେଣ୍ଟ ଉଦ୍ଦେଶ୍ୟ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ଅଟେ। ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର ଏବଂ ଡିଭାଇସ୍ ମଧ୍ୟରେ ଡାଟା କପି କରିବାକୁ, ବିନା ବିଜ୍ଞପ୍ତିରେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପସ୍ ସଂସ୍ଥାପନ କରିବାକୁ, ଏବଂ ଲଗ୍ ଡାଟା ପଢିବାକୁ ଏହା ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"ଅଧିକୃତ ସମସ୍ତ କମ୍ପ୍ୟୁଟରରୁ USB ଡିବଗ୍ କରିବା ଆକ୍ସେସ୍ ପ୍ରତ୍ୟାହାର କରିବେ କି?"</string> + <string name="dev_settings_warning_title" msgid="7244607768088540165">"ଡେଭଲପମେଣ୍ଟ ସେଟିଙ୍ଗ ଅନୁମତି ଦେବେ?"</string> + <string name="dev_settings_warning_message" msgid="2298337781139097964">"ଏହି ସେଟିଙ୍ଗଗୁଡ଼ିକ କେବଳ ବିକାଶ ବ୍ୟବହାର ପାଇଁ ଉଦ୍ଦିଷ୍ଟ। ସେଗୁଡ଼ିକ କାରଣରୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଓ ଆପ୍ଲିକେଶନ୍ଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ ନକରିପାରେ।"</string> + <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"USB ଜରିଆରେ ଆପ୍ଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ"</string> + <string name="verify_apps_over_usb_summary" msgid="9164096969924529200">"ADB/ADT ମାଧ୍ୟମରେ ଇନଷ୍ଟଲ ହୋଇଥିବା ଆପ୍ଗୁଡ଼ିକ ହାନିକାରକ କାର୍ଯ୍ୟକଳାପ କରୁଛି କି ନାହିଁ ଯାଞ୍ଚ କରନ୍ତୁ।"</string> + <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"(କେବଳ MAC ଠିକଣା ଥାଇ) ନାମ ବିନା ବ୍ଲୁଟୂଥ ଡିଭାଇସଗୁଡ଼ିକ ପ୍ରଦର୍ଶିତ ହେବ"</string> + <string name="bluetooth_disable_absolute_volume_summary" msgid="6031284410786545957">"ରିମୋଟ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକରେ ଯଦି ଅସ୍ୱୀକାର୍ଯ୍ୟ ଭାବେ ଉଚ୍ଚ ଭଲ୍ୟୁମ କିମ୍ବା ନିୟନ୍ତ୍ରଣର ଅଭାବ ପରି ଭଲ୍ୟୁମ ସମସ୍ୟା ଥାଏ ବ୍ଲୁଟୁଥ୍ ଆବସଲ୍ୟୁଟ୍ ଭଲ୍ୟୁମ ବୈଶିଷ୍ଟ୍ୟ ଅକ୍ଷମ କରେ।"</string> + <string name="enable_terminal_title" msgid="95572094356054120">"ସ୍ଥାନୀୟ ଟର୍ମିନାଲ୍"</string> + <string name="enable_terminal_summary" msgid="67667852659359206">"ସ୍ଥାନୀୟ ଶେଲ୍କୁ ଆକସେସ୍ ଦେଉଥିବା ଟର୍ମିନଲ୍ ଆପ୍କୁ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="hdcp_checking_title" msgid="8605478913544273282">"HDCP ଯାଞ୍ଚ କରୁଛି"</string> + <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCPର ଯାଞ୍ଚ ଗତିବିଧି ସେଟ୍ କରନ୍ତୁ"</string> + <string name="debug_debugging_category" msgid="6781250159513471316">"ଡିବଗ୍ କରୁଛି"</string> + <string name="debug_app" msgid="8349591734751384446">"ଡିବଗ୍ ଆପ୍ ବାଛି ନିଅନ୍ତୁ"</string> + <string name="debug_app_not_set" msgid="718752499586403499">"କୌଣସି ଡିବଗ୍ ଆପ୍ଲିକେଶନ୍ ସେଟ୍ ହୋଇନାହିଁ"</string> + <string name="debug_app_set" msgid="2063077997870280017">"ଆପ୍ଲିକେଶନ୍ ଡିବଗ୍ କରୁଛି: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string> + <string name="select_application" msgid="5156029161289091703">"ଆପ୍ଲିକେଶନ୍ ବାଛନ୍ତୁ"</string> + <string name="no_application" msgid="2813387563129153880">"କିଛି ନୁହେଁ"</string> + <string name="wait_for_debugger" msgid="1202370874528893091">"ଡିବଗର୍ ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ"</string> + <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ଡିବଗ୍ ହୋଇଥିବା ଆପ୍ଲିକେଶନ୍, ନିଷ୍ପାଦନ ପୂର୍ବରୁ ଆଟାଚ୍ କରିବା ପାଇଁ ଡିବଗର୍କୁ ଅପେକ୍ଷା କରେ"</string> + <string name="debug_input_category" msgid="1811069939601180246">"ଇନପୁଟ୍"</string> + <string name="debug_drawing_category" msgid="6755716469267367852">"ଅଙ୍କନ"</string> + <string name="debug_hw_drawing_category" msgid="6220174216912308658">"ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଟେଡ୍ ରେଣ୍ଡରିଙ୍ଗ"</string> + <string name="media_category" msgid="4388305075496848353">"ମିଡିଆ"</string> + <string name="debug_monitoring_category" msgid="7640508148375798343">"ତଦାରାଖ କରିବା"</string> + <string name="strict_mode" msgid="1938795874357830695">"କଡ଼ା ମୋଡ୍ ସକ୍ଷମ କରାଯାଇଛି"</string> + <string name="strict_mode_summary" msgid="142834318897332338">"ମୁଖ୍ୟ ଥ୍ରେଡ୍ରେ ଆପ୍ ଦୀର୍ଘ ସମୟ କାର୍ଯ୍ୟ କରିବା ବେଳେ ସ୍କ୍ରିନ୍ ଫ୍ଲାସ୍ କରନ୍ତୁ"</string> + <string name="pointer_location" msgid="6084434787496938001">"ପଏଣ୍ଟର୍ ଲୋକେଶନ୍"</string> + <string name="pointer_location_summary" msgid="840819275172753713">"ଏବେର ଟଚ୍ ଡାଟା ଦେଖାଉଥିବା ସ୍କ୍ରୀନ୍ ଓଭର୍ଲେ"</string> + <string name="show_touches" msgid="2642976305235070316">"ଟାପ୍ଗୁଡ଼ିକୁ ଦେଖାଅ"</string> + <string name="show_touches_summary" msgid="6101183132903926324">"ଟାପ୍ସ ପାଇଁ ଦୃଶ୍ୟ ମତାମତ ଦେଖାଅ"</string> + <string name="show_screen_updates" msgid="5470814345876056420">"ସର୍ଫେସ୍ ଅପ୍ଡେଟ୍ ଦେଖାଅ"</string> + <string name="show_screen_updates_summary" msgid="2569622766672785529">"ସମଗ୍ର ୱିଣ୍ଡୋ ପୃଷ୍ଠ ଅପଡେଟ୍ ହେବା ବେଳେ ସେଗୁଡ଼ିକ ଫ୍ଲାସ୍ କରନ୍ତୁ"</string> + <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ଭ୍ୟୁ ଅପଡେଟ୍ ଦେଖନ୍ତୁ"</string> + <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ସହ ଅଙ୍କାଯାଇଥିବା ବେଳେ ୱିଣ୍ଡୋ ଭିତରେ ଦୃଶ୍ୟଗୁଡ଼ିକ ଫ୍ଲାଶ କରନ୍ତୁ"</string> + <string name="show_hw_layers_updates" msgid="5645728765605699821">"ହାର୍ଡୱେର୍ ଲେୟର୍ର ଅପଡେଟଗୁଡ଼ିକ ଦେଖାନ୍ତୁ"</string> + <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ହାର୍ଡୱେୟାର ଲେୟାରଗୁଡିକ ଅପଡେଟ୍ ହେବା ବେଳେ ସେଗୁଡିକ ସବୁଜ ଫ୍ଲାସ୍ କରନ୍ତୁ"</string> + <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ଓଭର୍ଡ୍ର ଡିବଗ୍ କର"</string> + <string name="disable_overlays" msgid="2074488440505934665">"HW ଓଭରଲେସ ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="disable_overlays_summary" msgid="3578941133710758592">"ସ୍କ୍ରୀନ୍ କମ୍ପୋଜିଟିଙ୍ଗ ପାଇଁ ସର୍ବଦା GPU ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="simulate_color_space" msgid="6745847141353345872">"ରଙ୍ଗ ସ୍ଥାନ ଅନୁକରଣ କରନ୍ତୁ"</string> + <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ଟ୍ରେସ୍ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="usb_audio_disable_routing" msgid="8114498436003102671">"USB ଅଡିଓ ରାଉଟିଙ୍ଗ ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"USB ଅଡିଓ ଉପକରଣଗୁଡ଼ିକୁ ଅଟୋମେଟିକ୍ ରୂଟିଙ୍ଗ ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="debug_layout" msgid="5981361776594526155">"ଲେଆଉଟ୍ ବାଉଣ୍ଡ ଦେଖାଅ"</string> + <string name="debug_layout_summary" msgid="2001775315258637682">"କ୍ଲିପ୍ ବାଉଣ୍ଡ, ମାର୍ଜିନ୍ ଆଦି ଦେଖନ୍ତୁ"</string> + <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ଲେଆଉଟ୍ ଦିଗ ବାଧ୍ୟ କରନ୍ତୁ"</string> + <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ସମସ୍ତ ଲୋକେଲ୍ ପାଇଁ ସ୍କ୍ରିନ୍ ଲେଆଉଟ୍ ଦିଗ ଡାହାଣରୁ ବାମକୁ ବାଧ୍ୟ କରନ୍ତୁ"</string> + <string name="force_hw_ui" msgid="6426383462520888732">"GPU ରେଣ୍ଡରିଂ ବାଧ୍ୟ କରନ୍ତୁ"</string> + <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D ଅଙ୍କନ ପାଇଁ ଜିପିୟୁର ବ୍ୟବହାର ଉପରେ ଜୋର ଦେବା"</string> + <string name="force_msaa" msgid="7920323238677284387">"4x MSAA ବାଧ୍ୟ କରନ୍ତୁ"</string> + <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ଆପ୍ରେ 4x MSAA ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="show_non_rect_clip" msgid="505954950474595172">"ଅଣ-ଆୟତାକାର କ୍ଲିପ୍ କାର୍ଯ୍ୟକୁ ଡିବଗ୍ କରନ୍ତୁ"</string> + <string name="track_frame_time" msgid="6146354853663863443">"ପ୍ରୋଫାଇଲ୍ GPU ରେଣ୍ଡରିଂ"</string> + <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ଡିବଗ୍ ଲେୟର୍ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ଡିବଗ୍ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ GPU ଡିବଗ୍ ଲେୟର୍ ଲୋଡ୍ କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="window_animation_scale_title" msgid="6162587588166114700">"ୱିଣ୍ଡୋ ଆନିମେଶନ୍ ସ୍କେଲ୍"</string> + <string name="transition_animation_scale_title" msgid="387527540523595875">"ଟ୍ରାଞ୍ଜିସନ୍ ଆନିମେସନ୍ ସ୍କେଲ୍"</string> + <string name="animator_duration_scale_title" msgid="3406722410819934083">"ଆନିମେଟର୍ ଅବଧି ସ୍କେଲ୍"</string> + <string name="overlay_display_devices_title" msgid="5364176287998398539">"ମଧ୍ୟମ ଡିସ୍ପ୍ଲେର ଛଳନା କରନ୍ତୁ"</string> + <string name="debug_applications_category" msgid="4206913653849771549">"ଆପ୍ଗୁଡ଼ିକ"</string> + <string name="immediately_destroy_activities" msgid="1579659389568133959">"କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ ରଖନ୍ତୁ ନାହିଁ"</string> + <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ଉପଯୋଗକର୍ତ୍ତା ଏହାକୁ ଛାଡ଼ିବା କ୍ଷଣି ସମସ୍ତ କାର୍ଯ୍ୟକଳାପକୁ ନଷ୍ଟ କରିଦିଅନ୍ତୁ"</string> + <string name="app_process_limit_title" msgid="4280600650253107163">"ପୃଷ୍ଠପଟ ପ୍ରକ୍ରିୟା ସୀମା"</string> + <string name="show_all_anrs" msgid="28462979638729082">"ସମସ୍ତ ANRs ଦେଖାଦେଉ"</string> + <string name="show_all_anrs_summary" msgid="641908614413544127">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ \"ଆପ୍ ଉତ୍ତର ଦେଉନାହିଁ\" ଡାୟଲଗ୍ ଦେଖାଅ"</string> + <string name="show_notification_channel_warnings" msgid="1399948193466922683">"ବିଜ୍ଞପ୍ତି ଚାନେଲ୍ ଚେତାବନୀ ଦେଖାଦେଉ"</string> + <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ଏକ ବୈଧ ଚ୍ୟାନେଲ୍ ବିନା ଏକ ଆପ୍ ଗୋଟିଏ ବିଜ୍ଞପ୍ତି ପୋଷ୍ଠ କରିବା ବେଳେ ଅନ୍-ସ୍କ୍ରୀନ୍ ସତର୍କତା ଦେଖାଏ"</string> + <string name="force_allow_on_external" msgid="3215759785081916381">"ଏକ୍ସଟର୍ନଲ୍ ଆପ୍ଗୁଡ଼ିକୁ ଜବରଦସ୍ତି ଅନୁମତି ଦିଅନ୍ତୁ"</string> + <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ଯେକୌଣସି ଆପ୍କୁ ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍ରେ ଲେଖାଯୋଗ୍ୟ କରନ୍ତୁ, ମେନିଫେଷ୍ଟ ମୂଲ୍ୟ ଯାହା ହୋଇଥାଉ ନା କାହିଁକି"</string> + <string name="force_resizable_activities" msgid="8615764378147824985">"ଆକାର ବଦଳାଇବା ପାଇଁ କାର୍ଯ୍ୟକଳାପକୁ ବାଧ୍ୟ କରନ୍ତୁ"</string> + <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ସ୍ପଷ୍ଟ ଭାଲ୍ୟୁର ଚିନ୍ତା ନକରି ମଲ୍ଟୀ-ୱିଣ୍ଡୋ ପାଇଁ ସମସ୍ତ କାର୍ଯ୍ୟ ବଦଳାଇବାଯୋଗ୍ୟ କରନ୍ତୁ"</string> + <string name="enable_freeform_support" msgid="1461893351278940416">"ଫ୍ରୀଫର୍ମ ୱିଣ୍ଡୋ ସକ୍ଷମ କର"</string> + <string name="enable_freeform_support_summary" msgid="8247310463288834487">"ପରୀକ୍ଷାମୂଳକ ଫ୍ରୀଫର୍ମ ୱିଣ୍ଡୋସ୍ ପାଇଁ ସପୋର୍ଟ ସକ୍ଷମ କରନ୍ତୁ।"</string> + <string name="local_backup_password_title" msgid="3860471654439418822">"ଡେସ୍କଟପ୍ ବ୍ୟାକ୍ଅପ୍ର ପାସ୍ୱର୍ଡ"</string> + <string name="local_backup_password_summary_none" msgid="6951095485537767956">"ଡେସ୍କଟପ୍ ପୂର୍ଣ୍ଣ ବ୍ୟାକ୍ଅପ୍ଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ସୁରକ୍ଷିତ ନୁହେଁ"</string> + <string name="local_backup_password_summary_change" msgid="5376206246809190364">"ଡେସ୍କଟପ୍ର ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକ୍ଅପ୍ ପାଇଁ ପାସ୍ୱର୍ଡ ବଦଳାଇବା କିମ୍ୱା କାଢ଼ିଦେବା ନିମନ୍ତେ ଟାପ୍ କରନ୍ତୁ"</string> + <string name="local_backup_password_toast_success" msgid="582016086228434290">"ନୂଆ ବ୍ୟାକ୍ଅପ୍ ପାସ୍ୱର୍ଡ ସେଟ୍ କରିଦିଆଗଲା"</string> + <string name="local_backup_password_toast_confirmation_mismatch" msgid="7805892532752708288">"ନୂଆ ପାସ୍ୱର୍ଡ ଓ ସୁନିଶ୍ଚିତତା ମେଳ ହେଉନାହିଁ"</string> + <string name="local_backup_password_toast_validation_failure" msgid="5646377234895626531">"ବ୍ୟାକ୍ଅପ୍ ପାସ୍ୱର୍ଡ ସେଟିଙ୍ଗ ବିଫଳ ହୋଇଛି"</string> + <string-array name="color_mode_names"> + <item msgid="2425514299220523812">"ଜୀବନ୍ତ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item> + <item msgid="8446070607501413455">"ପ୍ରାକୃତିକ"</item> + <item msgid="6553408765810699025">"ମାନକ"</item> + </string-array> + <string-array name="color_mode_descriptions"> + <item msgid="4979629397075120893">"ବର୍ଦ୍ଧିତ ରଙ୍ଗ"</item> + <item msgid="8280754435979370728">"ଆଖି ଦ୍ୱାରା ଦେଖାଯାଇଥିବା ପରି ପ୍ରାକୃତିକ ରଙ୍ଗ"</item> + <item msgid="5363960654009010371">"ଡିଜିଟାଲ୍ କଣ୍ଟେଣ୍ଟ ପାଇଁ ରଙ୍ଗଗୁଡ଼ିକ ଅନୁକୂଳିତ ହୋଇଛି"</item> + </string-array> + <!-- no translation found for inactive_apps_title (9042996804461901648) --> + <skip /> + <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ନିଷ୍କ୍ରିୟ। ଟୋଗଲ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string> + <string name="inactive_app_active_summary" msgid="4174921824958516106">"ସକ୍ରିୟ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string> + <!-- no translation found for standby_bucket_summary (6567835350910684727) --> + <skip /> + <string name="runningservices_settings_title" msgid="8097287939865165213">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string> + <string name="runningservices_settings_summary" msgid="854608995821032748">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string> + <string name="select_webview_provider_title" msgid="4628592979751918907">"ୱେବ୍ଦୃଶ୍ୟ ପ୍ରୟୋଗ"</string> + <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView କାର୍ଯ୍ୟକାରିତାକୁ ସେଟ୍ କରନ୍ତୁ"</string> + <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ଏହି ପସନ୍ଦ ଆଉ ମାନ୍ୟ ନାହିଁ। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string> + <string name="convert_to_file_encryption" msgid="3060156730651061223">"ଫାଇଲ ଏନକ୍ରିପ୍ସନକୁ ବଦଳାଅ"</string> + <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ବଦଳାନ୍ତୁ…"</string> + <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ଫାଇଲ୍ ଏନ୍କ୍ରିପ୍ଟ ହୋଇସାରିଲାଣି"</string> + <string name="title_convert_fbe" msgid="1263622876196444453">"ଫାଇଲ୍ ଭିତ୍ତିକ ଏନ୍କ୍ରିପ୍ସନ୍ ପାଇଁ ବଦଳାଉଛି"</string> + <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ଫାଇଲ୍ ଭିତ୍ତିକ ଏନ୍କ୍ରିପ୍ସନ୍ରେ ଡାଟା ପାର୍ଟିଶନ୍ ବଦଳାନ୍ତୁ।\n !!ଚେତାବନୀ!! ଏହା ଆପଣଙ୍କର ସମସ୍ତ ଡାଟା ଉଡ଼ାଇଦେବ।\n ଏହି ବୈଶିଷ୍ଟ୍ୟ ହେଉଛି ଆଲ୍ଫା ଏବଂ ଠିକ ଭାବେ କାମ କରିନପାରେ।\n ଜାରି ରଖିବା ପାଇଁ \"ୱାଇପ୍ ଓ କନ୍ଭର୍ଟ…\" ଦାବନ୍ତୁ"</string> + <string name="button_convert_fbe" msgid="5152671181309826405">"ଲିଭାନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ…"</string> + <string name="picture_color_mode" msgid="4560755008730283695">"ପିକ୍ଚର୍ ରଙ୍ଗ ମୋଡ୍"</string> + <string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"ଅକ୍ଷମ ହୋଇଛି"</string> + <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"ସମ୍ପୂର୍ଣ୍ଣ ବର୍ଣ୍ଣାନ୍ଧତା"</string> + <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"ବର୍ଣ୍ଣାନ୍ଧତା (ନାଲି-ସବୁଜ)"</string> + <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"ପ୍ରୋଟାନୋମାଲି (ଲାଲ୍-ସବୁଜ)"</string> + <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (ନୀଳ-ହଳଦିଆ)"</string> + <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ରଙ୍ଗ ସଠିକତା"</string> + <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ଏହି ପରୀକ୍ଷାମୂଳକ ବୈଶିଷ୍ଟ୍ୟ ପର୍ଫର୍ମେନ୍ସକୁ ପ୍ରଭାବିତ କରିପାରେ।"</string> + <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ଦ୍ୱାରା ଓଭର୍ରାଇଡ୍ କରାଯାଇଛି"</string> + <string name="power_remaining_duration_only" msgid="845431008899029842">"ପ୍ରାୟ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ ରହିଛି"</string> + <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପ୍ରାୟ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string> + <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାପାଇଁ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ ଅଛି"</string> + <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string> + <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) --> + <skip /> + <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) --> + <skip /> + <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) --> + <skip /> + <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) --> + <skip /> + <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) --> + <skip /> + <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ପ୍ରାୟ <xliff:g id="TIME">%2$s</xliff:g> ଅବଶିଷ୍ଟ ରହିଛି"</string> + <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପ୍ରାୟ <xliff:g id="TIME">%2$s</xliff:g> ଅବଶିଷ୍ଟ"</string> + <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) --> + <skip /> + <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) --> + <skip /> + <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) --> + <skip /> + <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string> + <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବା ପର୍ଯ୍ୟନ୍ତ"</string> + <string name="battery_info_status_unknown" msgid="196130600938058547">"ଅଜ୍ଞାତ"</string> + <string name="battery_info_status_charging" msgid="1705179948350365604">"ଚାର୍ଜ ହେଉଛି"</string> + <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ଚାର୍ଜ ହେଉଛି"</string> + <string name="battery_info_status_discharging" msgid="310932812698268588">"ଚାର୍ଜ ହେଉନାହିଁ"</string> + <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ପ୍ଲଗ୍ରେ ଲାଗିଛି, ହେଲେ ଏବେ ଚାର୍ଜ କରିପାରିବ ନାହିଁ"</string> + <string name="battery_info_status_full" msgid="2824614753861462808">"ସମ୍ପୂର୍ଣ୍ଣ"</string> + <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string> + <string name="enabled_by_admin" msgid="5302986023578399263">"ଆଡମିନ୍ଙ୍କ ଦ୍ୱାରା ସକ୍ଷମ କରାଯାଇଛି"</string> + <string name="disabled_by_admin" msgid="8505398946020816620">"ଆଡ୍ମିନ୍ ଦ୍ଵାରା ଅକ୍ଷମ କରାଯାଇଛି"</string> + <string name="disabled" msgid="9206776641295849915">"ଅକ୍ଷମ ହୋଇଛି"</string> + <string name="external_source_trusted" msgid="2707996266575928037">"ଅନୁମୋଦିତ"</string> + <string name="external_source_untrusted" msgid="2677442511837596726">"ଅନୁମତି ନାହିଁ"</string> + <string name="install_other_apps" msgid="6986686991775883017">"ଅଜଣା ଆପ୍ଗୁଡଡ଼ିକ ଇନ୍ଷ୍ଟଲ୍ କର"</string> + <string name="home" msgid="3256884684164448244">"ସେଟିଙ୍ଗ ହୋମ୍"</string> + <string-array name="battery_labels"> + <item msgid="8494684293649631252">"0%"</item> + <item msgid="8934126114226089439">"୫୦%"</item> + <item msgid="1286113608943010849">"୧୦୦%"</item> + </string-array> + <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ପୂର୍ବେ"</string> + <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string> + <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ଛୋଟ"</string> + <string name="screen_zoom_summary_default" msgid="2247006805614056507">"ଡିଫଲ୍ଟ"</string> + <string name="screen_zoom_summary_large" msgid="4835294730065424084">"ବଡ"</string> + <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"ବୃହତ୍ତମ"</string> + <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ବୃହତ୍ତମ"</string> + <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"କଷ୍ଟମ୍ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string> + <string name="help_feedback_label" msgid="6815040660801785649">"ସହାୟତା ଓ ମତାମତ"</string> + <string name="content_description_menu_button" msgid="8182594799812351266">"ମେନୁ"</string> + <string name="retail_demo_reset_message" msgid="118771671364131297">"ଡେମୋ ମୋଡ୍ରେ ଫ୍ୟାକ୍ଟୋରୀ ରିସେଟ୍ କରିବାକୁ ପାସ୍ୱାର୍ଡ ଲେଖନ୍ତୁ"</string> + <string name="retail_demo_reset_next" msgid="8356731459226304963">"ପରବର୍ତ୍ତୀ"</string> + <string name="retail_demo_reset_title" msgid="696589204029930100">"ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string> + <string name="active_input_method_subtypes" msgid="3596398805424733238">"ସକ୍ରିୟ ଇନପୁଟ୍-ପଦ୍ଧତିଗୁଡ଼ିକ"</string> + <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ସିଷ୍ଟମ୍ ଭାଷା ବ୍ୟବହାର କରନ୍ତୁ"</string> + <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> ପାଇଁ ସେଟିଙ୍ଗ ଖୋଲିବାରେ ବିଫଳ"</string> + <string name="ime_security_warning" msgid="4135828934735934248">"ଏହି ଇନ୍ପୁଟ୍ ପଦ୍ଧତି, ପାସ୍ୱର୍ଡ ଓ କ୍ରେଡିଟ୍ କାର୍ଡ ନମ୍ୱର୍ ଭଳି ବ୍ୟକ୍ତିଗତ ଡାଟା ସମେତ ଆପଣ ଟାଇପ୍ କରିଥିବା ସମସ୍ତ ଅକ୍ଷର ସଂଗହ କରିପାରେ।ଏହା, <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> ଆପ୍ରୁ ଆସିଛି| ଏହି ଇନ୍ପୁଟ୍ ପଦ୍ଧତି ବ୍ୟବହାର କରିବେ?"</string> + <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"ଧ୍ୟାନଦିଅନ୍ତୁ: ରିବୁଟ୍ କରିବା ପରେ, ଆପଣଙ୍କ ଫୋନ୍ ଅନଲକ୍ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଏହି ଆପ୍ ଆରମ୍ଭ ହୋଇପାରିବ ନାହିଁ"</string> + <string name="ims_reg_title" msgid="7609782759207241443">"IMS ପଞ୍ଜିକରଣ ସ୍ଥିତି"</string> + <string name="ims_reg_status_registered" msgid="933003316932739188">"ପଞ୍ଜିକୃତ"</string> + <string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ପଞ୍ଜିକୃତ ହୋଇନାହିଁ"</string> + <string name="status_unavailable" msgid="7862009036663793314">"ଉପଲବ୍ଧ ନାହିଁ"</string> + <!-- no translation found for wifi_tether_connected_summary (3871603864314407780) --> + <!-- no translation found for accessibility_manual_zen_more_time (1636187409258564291) --> + <skip /> + <!-- no translation found for accessibility_manual_zen_less_time (6590887204171164991) --> + <skip /> + <!-- no translation found for zen_mode_enable_dialog_turn_on (8287824809739581837) --> + <skip /> + <string name="cancel" msgid="6859253417269739139">"କ୍ୟାନ୍ସଲ୍"</string> + <!-- no translation found for zen_mode_settings_turn_on_dialog_title (2297134204747331078) --> + <skip /> + <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"କଦାପି ନୁହେଁ"</string> + <!-- no translation found for zen_interruption_level_priority (2078370238113347720) --> + <skip /> + <!-- no translation found for zen_mode_and_condition (4927230238450354412) --> + <skip /> + <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) --> + <skip /> + <!-- no translation found for zen_alarm_warning (6236690803924413088) --> + <skip /> + <!-- no translation found for alarm_template (4996153414057676512) --> + <skip /> + <!-- no translation found for alarm_template_far (3779172822607461675) --> + <skip /> +</resources> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index bfea9a888d4e..6549861a11dc 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ਸਿਮ ਪਹੁੰਚ"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ਆਡੀਓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ਆਡੀਓ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ਸੁਣਨ ਦਾ ਸਾਧਨ"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ਸੁਣਨ ਦੇ ਸਾਧਨ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ਮੀਡੀਆ ਆਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ਫ਼ੋਨ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ਫਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ਫ਼ੋਨ ਔਡੀਓ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ਇਨਪੁਟ ਲਈ ਵਰਤੋ"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ਸੁਣਨ ਦੇ ਸਾਧਨ ਲਈ ਵਰਤੋ"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ਪੇਅਰ ਕਰੋ"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ਪੇਅਰ ਕਰੋ"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ਰੱਦ ਕਰੋ"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index fd177e5577ac..55e4308939ee 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Dostop do kartice SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Zvok visoke kakovosti: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Zvok visoke kakovosti"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Slušni pripomoček"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezava s slušnim pripomočkom je vzpostavljena"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezan s profilom za predstavnostni zvok"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezava s profilom za zvok telefona vzpostavljena"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezava s strežnikom za prenos datotek je vzpostavljena"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Uporabi za zvok telefona"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Uporabi za prenos datotek"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Uporabi za vnos"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Uporaba za slušni pripomoček"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Seznani"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SEZNANI"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Prekliči"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index cf0fe124830b..5524e2c5c737 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Qasje në kartën SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparati i dëgjimit"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Lidhur me aparatin e dëgjimit"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"U lidh me audion e medias"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"U lidh me audion e telefonit"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"U lidh me serverin e transferimit të skedarëve"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Përdor për audion e telefonit"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Përdor për transferimin e skedarëve"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Përdore për hyrjen"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Përdore për aparatin e dëgjimit"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Çifto"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ÇIFTO"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Anulo"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 4509470d3352..d8c6e4d1c2b0 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-åtkomst"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-ljud: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-ljud"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hörapparat"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Ansluten till hörapparat"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ansluten till medialjud"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ansluten till telefonens ljud"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ansluten till filöverföringsserver"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Använd för telefonens ljud"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Använd för filöverföring"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Använd för inmatning"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Använd med hörapparat"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parkoppling"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PARKOPPLA"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 274222bbaa07..b417cfbfacd1 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"சிம் அணுகல்"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ஆடியோ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ஆடியோ"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"செவித்துணைக் கருவி"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"செவித்துணைக் கருவியுடன் இணைக்கப்பட்டிருக்கும்போது"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"மீடியா ஆடியோவுடன் இணைக்கப்பட்டது"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"மொபைல் ஆடியோவுடன் இணைக்கப்பட்டது"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"கோப்பைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"மொபைல் ஆடியோவைப் பயன்படுத்து"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"கோப்பு பரிமாற்றத்திற்காகப் பயன்படுத்து"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"உள்ளீட்டுக்குப் பயன்படுத்து"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"செவித்துணைக் கருவிக்காகப் பயன்படுத்து"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"இணை"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"இணை"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ரத்துசெய்"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 31f0cdf7e923..99a35a34f0fd 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM యాక్సెస్"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ఆడియో: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ఆడియో"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"వినికిడి పరికరం"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"వినికిడి పరికరానికి కనెక్ట్ చేస్తోంది"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"మీడియా ఆడియోకు కనెక్ట్ చేయబడింది"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ఫోన్ ఆడియోకు కనెక్ట్ చేయబడింది"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ఫైల్ బదిలీ సర్వర్కు కనెక్ట్ చేయబడింది"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ఫోన్ ఆడియో కోసం ఉపయోగించు"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ఫైల్ బదిలీ కోసం ఉపయోగించు"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ఇన్పుట్ కోసం ఉపయోగించు"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"వినికిడి పరికరం కోసం ఉపయోగించు"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"జత చేయి"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"జత చేయి"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"రద్దు చేయి"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 1985bda3e76f..9fdeb4af5042 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Erişimi"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ses: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ses"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"İşitme Cihazı"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"İşitme Cihazına bağlandı"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Medya sesine bağlanıldı"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon sesine bağlandı"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Dosya aktarım sunucusuna bağlandı"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Telefon sesi için kullan"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Dosya aktarımı için kullan"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Giriş için kullan"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"İşitme Cihazı için kullan"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Eşle"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"EŞLE"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"İptal"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 90c7774103c5..7c221d7fd38a 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM رسائی"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD آڈیو: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD آڈیو"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"سماعتی آلہ"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"سماعتی آلے سے منسلک"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"میڈیا آڈیو سے مربوط"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"فون آڈیو سے مربوط"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"فائل منتقلی سرور سے مربوط ہو گیا ہے"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"فون آڈیو کیلئے استعمال کریں"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"فائل منتقل کرنے کیلئے استعمال کریں"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ان پٹ کیلئے استعمال"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"سماعتی آلے کیلئے استعمال کریں"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"جوڑا بنائیں"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"جوڑا بنائیں"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"منسوخ کریں"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index e37ab74fbec7..74bac0aa42cc 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"Quyền truy cập SIM"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Âm thanh HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Âm thanh HD"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Trợ thính"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Đã kết nối với thiết bị trợ thính"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Đã kết nối với âm thanh phương tiện"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Đã kết nối với âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Đã kết nối với máy chủ chuyển tệp"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Sử dụng cho âm thanh điện thoại"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Sử dụng để chuyển tệp"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Sử dụng để nhập"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Sử dụng cho thiết bị trợ thính"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Ghép nối"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"GHÉP NỐI"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Hủy"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 89edf547e43b..3590aceca3be 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取权限"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 音频:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 音频"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助听器"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已连接到助听器"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已连接到媒体音频"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已连接到手机音频"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已连接到文件传输服务器"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用于手机音频"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用于文件传输"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用于输入"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用于助听器"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配对"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配对"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 9b0ec86920ce..f2162f4be241 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"高清音訊:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"高清音訊"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助聽器"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已連線至助聽器"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已連接媒體音頻裝置"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已連接手機耳機"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線至檔案傳輸伺服器"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用於手機音效"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用於傳輸檔案"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用於輸入"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用於助聽器"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配對"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配對"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 1d6b4b95be56..fa3001aea94d 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -75,10 +75,8 @@ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取權"</string> <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 高解析音訊:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string> <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 高解析音訊"</string> - <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) --> - <skip /> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) --> - <skip /> + <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助聽器"</string> + <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已連接到助聽器"</string> <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"連接至媒體音訊"</string> <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"連接至電話音訊"</string> <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線到檔案傳輸伺服器"</string> @@ -95,8 +93,7 @@ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用於電話音訊"</string> <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用於傳輸檔案"</string> <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用於輸入"</string> - <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) --> - <skip /> + <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用於助聽器"</string> <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配對"</string> <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配對"</string> <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index c78f4541384a..58d5db32a7e3 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -553,7 +553,7 @@ <string name="select_private_dns_configuration_title">Private DNS</string> <string name="select_private_dns_configuration_dialog_title">Select Private DNS Mode</string> <string name="private_dns_mode_off">Off</string> - <string name="private_dns_mode_opportunistic">Opportunistic</string> + <string name="private_dns_mode_opportunistic">Automatic</string> <string name="private_dns_mode_provider">Private DNS provider hostname</string> <string name="private_dns_mode_provider_hostname_hint">Enter hostname of DNS provider</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java new file mode 100644 index 000000000000..246ca474da32 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java @@ -0,0 +1,153 @@ +/* + * Copyright (C) 2017 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.applications; + +import android.app.AppGlobals; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.ComponentInfo; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.os.RemoteException; +import android.os.UserHandle; +import android.util.IconDrawableFactory; + +import com.android.settingslib.widget.CandidateInfo; +import com.android.settingslib.wrapper.PackageManagerWrapper; + +/** + * Data model representing an app in DefaultAppPicker UI. + */ +public class DefaultAppInfo extends CandidateInfo { + + public final int userId; + public final ComponentName componentName; + public final PackageItemInfo packageItemInfo; + public final String summary; + protected final PackageManagerWrapper mPm; + private final Context mContext; + + public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn) { + this(context, pm, uid, cn, null /* summary */, true /* enabled */); + } + + public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info) { + this(context, pm, info, null /* summary */, true /* enabled */); + } + + public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn, + String summary, boolean enabled) { + super(enabled); + mContext = context; + mPm = pm; + packageItemInfo = null; + userId = uid; + componentName = cn; + this.summary = summary; + } + + public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info, + String summary, boolean enabled) { + super(enabled); + mContext = context; + mPm = pm; + userId = UserHandle.myUserId(); + packageItemInfo = info; + componentName = null; + this.summary = summary; + } + + @Override + public CharSequence loadLabel() { + if (componentName != null) { + try { + final ComponentInfo componentInfo = getComponentInfo(); + if (componentInfo != null) { + return componentInfo.loadLabel(mPm.getPackageManager()); + } else { + final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser( + componentName.getPackageName(), 0, userId); + return appInfo.loadLabel(mPm.getPackageManager()); + } + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } else if (packageItemInfo != null) { + return packageItemInfo.loadLabel(mPm.getPackageManager()); + } else { + return null; + } + + } + + @Override + public Drawable loadIcon() { + final IconDrawableFactory factory = IconDrawableFactory.newInstance(mContext); + if (componentName != null) { + try { + final ComponentInfo componentInfo = getComponentInfo(); + final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser( + componentName.getPackageName(), 0, userId); + if (componentInfo != null) { + return factory.getBadgedIcon(componentInfo, appInfo, userId); + } else { + return factory.getBadgedIcon(appInfo); + } + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } + if (packageItemInfo != null) { + try { + final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser( + packageItemInfo.packageName, 0, userId); + return factory.getBadgedIcon(packageItemInfo, appInfo, userId); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + } else { + return null; + } + } + + @Override + public String getKey() { + if (componentName != null) { + return componentName.flattenToString(); + } else if (packageItemInfo != null) { + return packageItemInfo.packageName; + } else { + return null; + } + } + + private ComponentInfo getComponentInfo() { + try { + ComponentInfo componentInfo = AppGlobals.getPackageManager().getActivityInfo( + componentName, 0, userId); + if (componentInfo == null) { + componentInfo = AppGlobals.getPackageManager().getServiceInfo( + componentName, 0, userId); + } + return componentInfo; + } catch (RemoteException e) { + return null; + } + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java index 6b9902425bcb..6b9902425bcb 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java index a1c8de566578..a1c8de566578 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java index 3cda9c9e3789..784c714f0b01 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java @@ -444,6 +444,7 @@ public class BluetoothEventManager { private void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) { + mDeviceManager.onActiveDeviceChanged(activeDevice, bluetoothProfile); synchronized (mCallbacks) { for (BluetoothCallback callback : mCallbacks) { callback.onActiveDeviceChanged(activeDevice, bluetoothProfile); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java index e1ebbc4c166c..f6ec6a86d13d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java @@ -27,6 +27,7 @@ import android.os.SystemClock; import android.text.TextUtils; import android.util.Log; import android.bluetooth.BluetoothAdapter; +import android.support.annotation.VisibleForTesting; import com.android.settingslib.R; @@ -461,12 +462,12 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } /** - * Set the device status as active or non-active per Bluetooth profile. + * Update the device status as active or non-active per Bluetooth profile. * * @param isActive true if the device is active * @param bluetoothProfile the Bluetooth profile */ - public void setActiveDevice(boolean isActive, int bluetoothProfile) { + public void onActiveDeviceChanged(boolean isActive, int bluetoothProfile) { boolean changed = false; switch (bluetoothProfile) { case BluetoothProfile.A2DP: @@ -478,7 +479,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> mIsActiveDeviceHeadset = isActive; break; default: - Log.w(TAG, "setActiveDevice: unknown profile " + bluetoothProfile + + Log.w(TAG, "onActiveDeviceChanged: unknown profile " + bluetoothProfile + " isActive " + isActive); break; } @@ -487,6 +488,26 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice> } } + /** + * Get the device status as active or non-active per Bluetooth profile. + * + * @param bluetoothProfile the Bluetooth profile + * @return true if the device is active + */ + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + public boolean isActiveDevice(int bluetoothProfile) { + switch (bluetoothProfile) { + case BluetoothProfile.A2DP: + return mIsActiveDeviceA2dp; + case BluetoothProfile.HEADSET: + return mIsActiveDeviceHeadset; + default: + Log.w(TAG, "getActiveDevice: unknown profile " + bluetoothProfile); + break; + } + return false; + } + void setRssi(short rssi) { if (mRssi != rssi) { mRssi = rssi; diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java index c3ff617bfaa7..a8e0039ce3a4 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java @@ -24,6 +24,7 @@ import android.util.Log; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * CachedBluetoothDeviceManager manages the set of remote Bluetooth devices. @@ -167,6 +168,15 @@ public class CachedBluetoothDeviceManager { } } } + + public synchronized void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, + int bluetoothProfile) { + for (CachedBluetoothDevice cachedDevice : mCachedDevices) { + boolean isActive = Objects.equals(cachedDevice, activeDevice); + cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile); + } + } + private void log(String msg) { if (DEBUG) { Log.d(TAG, msg); diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java index ee1219126fe3..ee1219126fe3 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java index 169aac9eb60f..169aac9eb60f 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java index 213002fb9726..213002fb9726 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java index abcb989802e9..abcb989802e9 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java index 31e675c2355b..31e675c2355b 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java index 3299cb2d1221..3299cb2d1221 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java index 28137ff64fb5..28137ff64fb5 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java index 58465f299578..58465f299578 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java index 4fe9d56a4179..4fe9d56a4179 100755..100644 --- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java index f740f7c01ce1..b0451b7ad2ea 100644 --- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java +++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java @@ -107,7 +107,7 @@ public class SuggestionController { } catch (NullPointerException e) { Log.w(TAG, "mRemote service detached before able to query", e); return null; - } catch (RemoteException e) { + } catch (RemoteException | RuntimeException e) { Log.w(TAG, "Error when calling getSuggestion()", e); return null; } @@ -120,7 +120,7 @@ public class SuggestionController { } try { mRemoteService.dismissSuggestion(suggestion); - } catch (RemoteException e) { + } catch (RemoteException | RuntimeException e) { Log.w(TAG, "Error when calling dismissSuggestion()", e); } } @@ -133,7 +133,7 @@ public class SuggestionController { try { mRemoteService.launchSuggestion(suggestion); - } catch (RemoteException e) { + } catch (RemoteException | RuntimeException e) { Log.w(TAG, "Error when calling launchSuggestion()", e); } } diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java new file mode 100644 index 000000000000..3d55c4fee358 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java @@ -0,0 +1,53 @@ +/* + * 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 com.android.settingslib.utils; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.support.annotation.VisibleForTesting; +import android.support.v4.util.ArrayMap; + + +/** + * Icon cache to avoid multiple loads on the same icon. + */ +public class IconCache { + private final Context mContext; + @VisibleForTesting + final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>(); + + public IconCache(Context context) { + mContext = context; + } + + public Drawable getIcon(Icon icon) { + if (icon == null) { + return null; + } + Drawable drawable = mMap.get(icon); + if (drawable == null) { + drawable = icon.loadDrawable(mContext); + updateIcon(icon, drawable); + } + return drawable; + } + + public void updateIcon(Icon icon, Drawable drawable) { + mMap.put(icon, drawable); + } +} diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java b/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java new file mode 100644 index 000000000000..cdb4ffd6e1f9 --- /dev/null +++ b/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java @@ -0,0 +1,37 @@ +/* + * 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 com.android.settingslib.widget; + +import android.graphics.drawable.Drawable; + +/** + * Base class for defining a selectable item in UI. + */ +public abstract class CandidateInfo { + + public final boolean enabled; + + public CandidateInfo(boolean enabled) { + this.enabled = enabled; + } + + public abstract CharSequence loadLabel(); + + public abstract Drawable loadIcon(); + + public abstract String getKey(); +} diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index df1a7a84e07e..2482095af419 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -527,10 +527,7 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro WifiConfiguration connectionConfig = null; if (mLastInfo != null) { - // TODO(sghuman): Refactor to match config network id when updating configs below, and - // then update network info and wifi info only on match - connectionConfig = getWifiConfigurationForNetworkId( - mLastInfo.getNetworkId(), configs); + connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId(), configs); } // Rather than dropping and reacquiring the lock multiple times in this method, we lock @@ -564,6 +561,17 @@ public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestro accessPoints.add(accessPoint); } + // If there were no scan results, create an AP for the currently connected network (if + // it exists). + // TODO(sghuman): Investigate if this works for an ephemeral (auto-connected) network + // when there are no scan results, as it may not have a valid WifiConfiguration + if (accessPoints.isEmpty() && connectionConfig != null) { + AccessPoint activeAp = new AccessPoint(mContext, connectionConfig); + activeAp.update(connectionConfig, mLastInfo, mLastNetworkInfo); + accessPoints.add(activeAp); + scoresToRequest.add(NetworkKey.createFromWifiInfo(mLastInfo)); + } + requestScoresForNetworkKeys(scoresToRequest); for (AccessPoint ap : accessPoints) { ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge); diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java index b1f3f3ce4300..235daf23a664 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java +++ b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java @@ -130,6 +130,13 @@ public class PackageManagerWrapper { } /** + * Calls {@code PackageManager.queryIntentServices} + */ + public List<ResolveInfo> queryIntentServices(Intent intent, int i) { + return mPm.queryIntentServices(intent, i); + } + + /** * Calls {@code PackageManager.replacePreferredActivity} */ public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty, diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java index 8fd4700b9bb0..ca965f38f639 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java @@ -696,6 +696,36 @@ public class WifiTrackerTest { } @Test + public void onStartShouldDisplayConnectedAccessPointWhenThereAreNoScanResults() + throws Exception { + Network mockNetwork = mock(Network.class); + when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork); + + when(mockWifiManager.getConnectionInfo()).thenReturn(CONNECTED_AP_1_INFO); + + NetworkInfo networkInfo = new NetworkInfo( + ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype"); + networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "connected", "test"); + when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(networkInfo); + + // Don't return any scan results + when(mockWifiManager.getScanResults()).thenReturn(new ArrayList<>()); + + WifiTracker tracker = createMockedWifiTracker(); + startTracking(tracker); + + verify(mockWifiManager).getConnectionInfo(); + verify(mockWifiManager, times(1)).getConfiguredNetworks(); + verify(mockConnectivityManager).getNetworkInfo(any(Network.class)); + + // mStaleAccessPoints is true + verify(mockWifiListenerExecutor, never()).onAccessPointsChanged(); + + assertThat(tracker.getAccessPoints().size()).isEqualTo(1); + assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue(); + } + + @Test public void stopTrackingShouldRemoveAllPendingWork() throws Exception { WifiTracker tracker = createMockedWifiTracker(); startTracking(tracker); @@ -778,7 +808,7 @@ public class WifiTrackerTest { mAccessPointsChangedLatch = new CountDownLatch(1); tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION)); - assertThat(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS)); + assertThat(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS)).isTrue(); assertThat(tracker.getAccessPoints()).isEmpty(); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java new file mode 100644 index 000000000000..6a161d0a645c --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 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.applications; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; + +import com.android.settingslib.SettingsLibRobolectricTestRunner; +import com.android.settingslib.wrapper.PackageManagerWrapper; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; + +@RunWith(SettingsLibRobolectricTestRunner.class) +public class DefaultAppInfoTest { + + @Mock + private PackageItemInfo mPackageItemInfo; + @Mock + private ComponentName mComponentName; + @Mock + private PackageManager mPackageManager; + @Mock + private PackageManagerWrapper mPackageManagerWrapper; + @Mock + private ApplicationInfo mApplicationInfo; + @Mock + private Drawable mIcon; + + private Context mContext; + private DefaultAppInfo mInfo; + + @Before + public void setUp() throws PackageManager.NameNotFoundException { + MockitoAnnotations.initMocks(this); + mContext = spy(RuntimeEnvironment.application); + doReturn(mPackageManager).when(mContext).getPackageManager(); + when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager); + when(mPackageManagerWrapper.getApplicationInfoAsUser(anyString(), anyInt(), + anyInt())).thenReturn(mApplicationInfo); + when(mPackageManager.loadUnbadgedItemIcon(mPackageItemInfo, mApplicationInfo)).thenReturn( + mIcon); + } + + @Test + public void initInfoWithActivityInfo_shouldLoadInfo() { + mPackageItemInfo.packageName = "test"; + mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, mPackageItemInfo); + mInfo.loadLabel(); + Drawable icon = mInfo.loadIcon(); + + assertThat(mInfo.getKey()).isEqualTo(mPackageItemInfo.packageName); + assertThat(icon).isNotNull(); + verify(mPackageItemInfo).loadLabel(mPackageManager); + } + + @Test + public void initInfoWithComponent_shouldLoadInfo() { + when(mComponentName.getPackageName()).thenReturn("com.android.settings"); + + mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, 0 /* uid */, mComponentName); + mInfo.getKey(); + + verify(mComponentName).flattenToString(); + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java new file mode 100644 index 000000000000..d6b20064823a --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java @@ -0,0 +1,283 @@ +/* + * 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 com.android.settingslib.bluetooth; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothClass; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothProfile; +import android.content.Context; + +import com.android.settingslib.R; + +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; +import org.robolectric.annotation.Config; + +import java.util.Collection; + +@RunWith(RobolectricTestRunner.class) +public class CachedBluetoothDeviceManagerTest { + private final static String DEVICE_NAME_1 = "TestName_1"; + private final static String DEVICE_NAME_2 = "TestName_2"; + private final static String DEVICE_ALIAS_1 = "TestAlias_1"; + private final static String DEVICE_ALIAS_2 = "TestAlias_2"; + private final static String DEVICE_ADDRESS_1 = "AA:BB:CC:DD:EE:11"; + private final static String DEVICE_ADDRESS_2 = "AA:BB:CC:DD:EE:22"; + private final BluetoothClass DEVICE_CLASS_1 = + new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES); + private final BluetoothClass DEVICE_CLASS_2 = + new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE); + @Mock + private LocalBluetoothAdapter mLocalAdapter; + @Mock + private LocalBluetoothProfileManager mLocalProfileManager; + @Mock + private LocalBluetoothManager mLocalBluetoothManager; + @Mock + private BluetoothEventManager mBluetoothEventManager; + @Mock + private HeadsetProfile mHfpProfile; + @Mock + private A2dpProfile mA2dpProfile; + @Mock + private PanProfile mPanProfile; + @Mock + private BluetoothDevice mDevice1; + @Mock + private BluetoothDevice mDevice2; + private CachedBluetoothDeviceManager mCachedDeviceManager; + private Context mContext; + private String[] mActiveDeviceStringsArray; + private String mActiveDeviceStringNone; + private String mActiveDeviceStringAll; + private String mActiveDeviceStringMedia; + private String mActiveDeviceStringPhone; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mContext = RuntimeEnvironment.application; + when(mDevice1.getAddress()).thenReturn(DEVICE_ADDRESS_1); + when(mDevice2.getAddress()).thenReturn(DEVICE_ADDRESS_2); + when(mDevice1.getName()).thenReturn(DEVICE_NAME_1); + when(mDevice2.getName()).thenReturn(DEVICE_NAME_2); + when(mDevice1.getAliasName()).thenReturn(DEVICE_ALIAS_1); + when(mDevice2.getAliasName()).thenReturn(DEVICE_ALIAS_2); + when(mDevice1.getBluetoothClass()).thenReturn(DEVICE_CLASS_1); + when(mDevice2.getBluetoothClass()).thenReturn(DEVICE_CLASS_2); + + when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager); + when(mLocalAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON); + when(mHfpProfile.isProfileReady()).thenReturn(true); + when(mA2dpProfile.isProfileReady()).thenReturn(true); + when(mPanProfile.isProfileReady()).thenReturn(true); + mCachedDeviceManager = new CachedBluetoothDeviceManager(mContext, mLocalBluetoothManager); + } + + /** + * Test to verify addDevice(). + */ + @Test + public void testAddDevice_validCachedDevices_devicesAdded() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice2); + assertThat(cachedDevice2).isNotNull(); + + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(devices).contains(cachedDevice2); + + assertThat(mCachedDeviceManager.findDevice(mDevice1)).isEqualTo(cachedDevice1); + assertThat(mCachedDeviceManager.findDevice(mDevice2)).isEqualTo(cachedDevice2); + } + + /** + * Test to verify getName(). + */ + @Test + public void testGetName_validCachedDevice_nameFound() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + assertThat(mCachedDeviceManager.getName(mDevice1)).isEqualTo(DEVICE_ALIAS_1); + } + + /** + * Test to verify onDeviceNameUpdated(). + */ + @Test + public void testOnDeviceNameUpdated_validName_nameUpdated() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + assertThat(cachedDevice1.getName()).isEqualTo(DEVICE_ALIAS_1); + + final String newAliasName = "NewAliasName"; + when(mDevice1.getAliasName()).thenReturn(newAliasName); + mCachedDeviceManager.onDeviceNameUpdated(mDevice1); + assertThat(cachedDevice1.getName()).isEqualTo(newAliasName); + } + + /** + * Test to verify clearNonBondedDevices(). + */ + @Test + public void testClearNonBondedDevices_bondedAndNonBondedDevices_nonBondedDevicesCleared() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice2); + assertThat(cachedDevice2).isNotNull(); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING); + mCachedDeviceManager.clearNonBondedDevices(); + Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(devices).contains(cachedDevice2); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + mCachedDeviceManager.clearNonBondedDevices(); + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).contains(cachedDevice1); + assertThat(devices).doesNotContain(cachedDevice2); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + mCachedDeviceManager.clearNonBondedDevices(); + devices = mCachedDeviceManager.getCachedDevicesCopy(); + assertThat(devices).doesNotContain(cachedDevice1); + assertThat(devices).doesNotContain(cachedDevice2); + } + + /** + * Test to verify onBtClassChanged(). + */ + @Test + public void testOnBtClassChanged_validBtClass_classChanged() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + assertThat(cachedDevice1.getBtClass()).isEqualTo(DEVICE_CLASS_1); + + final BluetoothClass newBluetoothClass = DEVICE_CLASS_2; + when(mDevice1.getBluetoothClass()).thenReturn(newBluetoothClass); + mCachedDeviceManager.onBtClassChanged(mDevice1); + assertThat(cachedDevice1.getBtClass()).isEqualTo(newBluetoothClass); + } + + /** + * Test to verify onDeviceDisappeared(). + */ + @Test + public void testOnDeviceDisappeared_deviceBondedUnbonded_unbondedDeviceDisappeared() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isFalse(); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE); + assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isTrue(); + } + + /** + * Test to verify onActiveDeviceChanged(). + */ + @Test + public void testOnActiveDeviceChanged_connectedDevices_activeDeviceChanged() { + CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice1); + assertThat(cachedDevice1).isNotNull(); + CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter, + mLocalProfileManager, mDevice2); + assertThat(cachedDevice2).isNotNull(); + + when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED); + + // Connect both devices for A2DP and HFP + cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); + cachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); + cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); + cachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); + + // Verify that both devices are connected and none is Active + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + + // The first device is active for A2DP, the second device is active for HFP + mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP); + mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); + + // The first device is active for A2DP and HFP + mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + + // The second device is active for A2DP and HFP + mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.A2DP); + mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); + + // No active device for A2DP + mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue(); + + // No active device for HFP + mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse(); + assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse(); + } +} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java index 92c68e63fa0d..077572789446 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java @@ -147,7 +147,7 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); // Set device as Active for A2DP and test connection state summary - mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(media)"); // Test with battery level @@ -163,7 +163,7 @@ public class CachedBluetoothDeviceTest { mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; // Set A2DP profile to be connected, Active and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); - mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(media)"); // Set A2DP profile to be disconnected and test connection state summary @@ -179,7 +179,7 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); // Set device as Active for HFP and test connection state summary - mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(phone)"); // Test with battery level @@ -195,7 +195,7 @@ public class CachedBluetoothDeviceTest { mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN; // Set HFP profile to be connected, Active and test connection state summary mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); - mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(phone)"); // Set HFP profile to be disconnected and test connection state summary @@ -212,8 +212,8 @@ public class CachedBluetoothDeviceTest { assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected"); // Set device as Active for A2DP and HFP and test connection state summary - mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP); - mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active"); // Test with battery level @@ -222,16 +222,16 @@ public class CachedBluetoothDeviceTest { "Connected, battery 10%, active"); // Disconnect A2DP only and test connection state summary - mCachedDevice.setActiveDevice(false, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP); mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( "Connected (no media), battery 10%, active(phone)"); // Disconnect HFP only and test connection state summary - mCachedDevice.setActiveDevice(false, BluetoothProfile.HEADSET); + mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET); mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED); mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); - mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo( "Connected (no phone), battery 10%, active(media)"); @@ -240,8 +240,8 @@ public class CachedBluetoothDeviceTest { // Set A2DP and HFP profiles to be connected, Active and test connection state summary mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED); mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED); - mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP); - mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP); + mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET); assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active"); // Set A2DP and HFP profiles to be disconnected and test connection state summary diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java new file mode 100644 index 000000000000..026ad47f99a2 --- /dev/null +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java @@ -0,0 +1,72 @@ +/* + * 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 com.android.settingslib.utils; + +import static com.google.common.truth.Truth.assertThat; + +import static junit.framework.Assert.assertTrue; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +@RunWith(RobolectricTestRunner.class) +public class IconCacheTest { + private Icon mIcon; + private Context mContext; + private IconCache mIconCache; + + @Before + public void setUp() { + mContext = spy(RuntimeEnvironment.application); + mIcon = mock(Icon.class); + Drawable drawable = mock(Drawable.class); + doReturn(drawable).when(mIcon).loadDrawable(mContext); + mIconCache = new IconCache(mContext); + } + + @Test + public void testGetIcon_iconisNull() { + assertThat(mIconCache.getIcon(null)).isNull(); + } + + @Test + public void testGetIcon_iconAlreadyLoaded() { + mIconCache.getIcon(mIcon); + verify(mIcon, times(1)).loadDrawable(mContext); + mIconCache.getIcon(mIcon); + verify(mIcon, times(1)).loadDrawable(mContext); + } + + @Test + public void testGetIcon_iconLoadedFirstTime() { + mIconCache.getIcon(mIcon); + assertTrue(mIconCache.mMap.containsKey(mIcon)); + } +} diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index dd89df1b5b15..2b181dcfd25e 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -858,7 +858,10 @@ public class SettingsBackupAgent extends BackupAgentHelper { out.writeInt(NETWORK_POLICIES_BACKUP_VERSION); out.writeInt(policies.length); for (NetworkPolicy policy : policies) { - if (policy != null) { + // We purposefully only backup policies that the user has + // defined; any inferred policies might include + // carrier-protected data that we can't export. + if (policy != null && !policy.inferred) { byte[] marshaledPolicy = policy.getBytesForBackup(); out.writeByte(BackupUtils.NOT_NULL); out.writeInt(marshaledPolicy.length); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 0fee81be389d..b000d8421cf4 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -448,6 +448,9 @@ class SettingsProtoDumpUtil { Settings.Global.CARRIER_APP_WHITELIST, GlobalSettingsProto.CARRIER_APP_WHITELIST); dumpSetting(s, p, + Settings.Global.CARRIER_APP_NAMES, + GlobalSettingsProto.CARRIER_APP_NAMES); + dumpSetting(s, p, Settings.Global.USB_MASS_STORAGE_ENABLED, GlobalSettingsProto.USB_MASS_STORAGE_ENABLED); dumpSetting(s, p, diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index d919d6ac9d2c..d284bf9076e1 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -145,6 +145,8 @@ android:name="android.permission.MANAGE_WIFI_WHEN_PERMISSION_REVIEW_REQUIRED" /> <uses-permission android:name="android.permission.WATCH_APPOPS" /> + <uses-permission android:name="android.permission.CONTROL_KEYGUARD" /> + <application android:label="@string/app_label" android:defaultToDeviceProtectedStorage="true" android:directBootAware="true"> diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml new file mode 100644 index 000000000000..9d6c37a95346 --- /dev/null +++ b/packages/Shell/res/values-as/strings.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="3701846017049540910">"শ্বেল"</string> + <string name="bugreport_notification_channel" msgid="2574150205913861141">"বাগ সম্পৰ্কীয় প্ৰতিবেদন"</string> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> + <!-- no translation found for bugreport_updating_title (4423539949559634214) --> + <skip /> + <!-- no translation found for bugreport_updating_wait (3322151947853929470) --> + <skip /> + <!-- no translation found for bugreport_finished_text (1223616207145252689) --> + <skip /> + <!-- no translation found for bugreport_finished_text (5758325479058638893) --> + <skip /> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) --> + <skip /> + <!-- no translation found for bugreport_confirm (5917407234515812495) --> + <skip /> + <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) --> + <skip /> + <!-- no translation found for bugreport_storage_title (5332488144740527109) --> + <skip /> + <!-- no translation found for bugreport_unreadable_text (586517851044535486) --> + <skip /> + <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) --> + <skip /> + <!-- no translation found for bugreport_unnamed (2800582406842092709) --> + <skip /> + <!-- no translation found for bugreport_info_action (2158204228510576227) --> + <skip /> + <!-- no translation found for bugreport_screenshot_action (8677781721940614995) --> + <skip /> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> + <!-- no translation found for bugreport_screenshot_failed (5853049140806834601) --> + <skip /> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> + <!-- no translation found for bugreport_info_name (4414036021935139527) --> + <skip /> + <!-- no translation found for bugreport_info_title (2306030793918239804) --> + <skip /> + <!-- no translation found for bugreport_info_description (5072835127481627722) --> + <skip /> + <!-- no translation found for save (4781509040564835759) --> + <skip /> + <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) --> + <skip /> +</resources> diff --git a/packages/Shell/res/values-or/strings.xml b/packages/Shell/res/values-or/strings.xml new file mode 100644 index 000000000000..bfb3b535157b --- /dev/null +++ b/packages/Shell/res/values-or/strings.xml @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2013 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="3701846017049540910">"ଶେଲ୍"</string> + <!-- no translation found for bugreport_notification_channel (2574150205913861141) --> + <skip /> + <!-- no translation found for bugreport_in_progress_title (4311705936714972757) --> + <skip /> + <!-- no translation found for bugreport_finished_title (4429132808670114081) --> + <skip /> + <!-- no translation found for bugreport_updating_title (4423539949559634214) --> + <skip /> + <!-- no translation found for bugreport_updating_wait (3322151947853929470) --> + <skip /> + <!-- no translation found for bugreport_finished_text (1223616207145252689) --> + <skip /> + <!-- no translation found for bugreport_finished_text (5758325479058638893) --> + <skip /> + <!-- no translation found for bugreport_finished_text (8353769438382138847) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) --> + <skip /> + <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) --> + <skip /> + <!-- no translation found for bugreport_confirm (5917407234515812495) --> + <skip /> + <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) --> + <skip /> + <string name="bugreport_storage_title" msgid="5332488144740527109">"ବଗ୍ ରିପୋର୍ଟ"</string> + <!-- no translation found for bugreport_unreadable_text (586517851044535486) --> + <skip /> + <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) --> + <skip /> + <!-- no translation found for bugreport_unnamed (2800582406842092709) --> + <skip /> + <!-- no translation found for bugreport_info_action (2158204228510576227) --> + <skip /> + <!-- no translation found for bugreport_screenshot_action (8677781721940614995) --> + <skip /> + <!-- no translation found for bugreport_screenshot_taken (5684211273096253120) --> + <skip /> + <!-- no translation found for bugreport_screenshot_failed (5853049140806834601) --> + <skip /> + <!-- no translation found for bugreport_info_dialog_title (1355948594292983332) --> + <skip /> + <!-- no translation found for bugreport_info_name (4414036021935139527) --> + <skip /> + <!-- no translation found for bugreport_info_title (2306030793918239804) --> + <skip /> + <!-- no translation found for bugreport_info_description (5072835127481627722) --> + <skip /> + <!-- no translation found for save (4781509040564835759) --> + <skip /> + <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) --> + <skip /> +</resources> diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java index 1bb36fb9dde3..0734e0dae790 100644 --- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java +++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java @@ -60,7 +60,7 @@ public class BugreportStorageProvider extends FileSystemProvider { final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection)); final RowBuilder row = result.newRow(); row.add(Root.COLUMN_ROOT_ID, DOC_ID_ROOT); - row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED); + row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY); row.add(Root.COLUMN_ICON, android.R.mipmap.sym_def_app_icon); row.add(Root.COLUMN_TITLE, getContext().getString(R.string.bugreport_storage_title)); row.add(Root.COLUMN_DOCUMENT_ID, DOC_ID_ROOT); diff --git a/packages/SystemUI/README.md b/packages/SystemUI/README.md index ae0a362fee31..d80e4ffab25e 100644 --- a/packages/SystemUI/README.md +++ b/packages/SystemUI/README.md @@ -1,5 +1,172 @@ -# SystemUI Documentation +# SystemUI + +“Everything you see in Android that's not an app” + +SystemUI is a persistent process that provides UI for the system but outside +of the system_server process. + +The starting point for most of sysui code is a list of services that extend +SystemUI that are started up by SystemUIApplication. These services then depend +on some custom dependency injection provided by Dependency. + +Inputs directed at sysui (as opposed to general listeners) generally come in +through IStatusBar. Outputs from sysui are through a variety of private APIs to +the android platform all over. + +## SystemUIApplication + +When SystemUIApplication starts up, it will start up the services listed in +config_systemUIServiceComponents or config_systemUIServiceComponentsPerUser. + +Each of these services extend SystemUI. SystemUI provides them with a Context +and gives them callbacks for onConfigurationChanged (this historically was +the main path for onConfigurationChanged, now also happens through +ConfigurationController). They also receive a callback for onBootCompleted +since these objects may be started before the device has finished booting. + +SystemUI and SystemUIApplication also have methods for putComponent and +getComponent which were existing systems to get a hold of other parts of +sysui before Dependency existed. Generally new things should not be added +to putComponent, instead Dependency and other refactoring is preferred to +make sysui structure cleaner. + +Each SystemUI service is expected to be a major part of system ui and the +goal is to minimize communication between them. So in general they should be +relatively silo'd. + +## Dependencies + +The first SystemUI service that is started should always be Dependency. +Dependency provides a static method for getting a hold of dependencies that +have a lifecycle that spans sysui. Dependency has code for how to create all +dependencies manually added. SystemUIFactory is also capable of +adding/replacing these dependencies. + +Dependencies are lazily initialized, so if a Dependency is never referenced at +runtime, it will never be created. + +If an instantiated dependency implements Dumpable it will be included in dumps +of sysui (and bug reports), allowing it to include current state information. +This is how \*Controllers dump state to bug reports. + +If an instantiated dependency implements ConfigurationChangeReceiver it will +receive onConfigurationChange callbacks when the configuration changes. + +## IStatusBar + +CommandQueue is the object that receives all of the incoming events from the +system_server. It extends IStatusBar and dispatches those callbacks back any +number of listeners. The system_server gets a hold of the IStatusBar when +StatusBar calls IStatusBarService#registerStatusBar, so if StatusBar is not +included in the XML service list, it will not be registered with the OS. + +CommandQueue posts all incoming callbacks to a handler and then dispatches +those messages to each callback that is currently registered. CommandQueue +also tracks the current value of disable flags and will call #disable +immediately for any callbacks added. + +There are a few places where CommandQueue is used as a bus to communicate +across sysui. Such as when StatusBar calls CommandQueue#recomputeDisableFlags. +This is generally used a shortcut to directly trigger CommandQueue rather than +calling StatusManager and waiting for the call to come back to IStatusBar. + +## Default SystemUI services list + +### [com.android.systemui.Dependency](/packages/SystemUI/src/com/android/systemui/Dependency.java) + +Provides custom dependency injection. + +### [com.android.systemui.util.NotificationChannels](/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java) + +Creates/initializes the channels sysui uses when posting notifications. + +### [com.android.systemui.statusbar.CommandQueue$CommandQueueStart](/packages/SystemUI/src/com/android/systemui/sstatusbar/CommandQueue.java) + +Creates CommandQueue and calls putComponent because its always been there +and sysui expects it to be there :/ + +### [com.android.systemui.keyguard.KeyguardViewMediator](/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java) + +Manages keyguard view state. + +### [com.android.systemui.recents.Recents](/packages/SystemUI/src/com/android/systemui/recents/Recents.java) + +Recents tracks all the data needed for recents and starts/stops the recents +activity. It provides this cached data to RecentsActivity when it is started. + +### [com.android.systemui.volume.VolumeUI](/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java) + +Registers all the callbacks/listeners required to show the Volume dialog when +it should be shown. + +### [com.android.systemui.stackdivider.Divider](/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java) + +Shows the drag handle for the divider between two apps when in split screen +mode. + +### [com.android.systemui.SystemBars](/packages/SystemUI/src/com/android/systemui/SystemBars.java) + +This is a proxy to the actual SystemUI for the status bar. This loads from +config_statusBarComponent which defaults to StatusBar. (maybe this should be +removed and copy how config_systemUiVendorServiceComponent works) + +### [com.android.systemui.status.phone.StatusBar](/packages/SystemUI/src/com/android/systemui/status/phone/StatusBar.java) + +This shows the UI for the status bar and the notification shade it contains. +It also contains a significant amount of other UI that interacts with these +surfaces (keyguard, AOD, etc.). StatusBar also contains a notification listener +to receive notification callbacks. + +### [com.android.systemui.usb.StorageNotification](/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java) + +Tracks USB status and sends notifications for it. + +### [com.android.systemui.power.PowerUI](/packages/SystemUI/src/com/android/systemui/power/PowerUI.java) + +Tracks power status and sends notifications for low battery/power saver. + +### [com.android.systemui.media.RingtonePlayer](/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java) + +Plays ringtones. + +### [com.android.systemui.keyboard.KeyboardUI](/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java) + +Shows UI for keyboard shortcuts (triggered by keyboard shortcut). + +### [com.android.systemui.pip.PipUI](/packages/SystemUI/src/com/android/systemui/pip/PipUI.java) + +Shows the overlay controls when Pip is showing. + +### [com.android.systemui.shortcut.ShortcutKeyDispatcher](/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java) + +Dispatches shortcut to System UI components. + +### @string/config_systemUIVendorServiceComponent + +Component allowing the vendor/OEM to inject a custom component. + +### [com.android.systemui.util.leak.GarbageMonitor$Service](/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java) + +Tracks large objects in sysui to see if there are leaks. + +### [com.android.systemui.LatencyTester](/packages/SystemUI/src/com/android/systemui/LatencyTester.java) + +Class that only runs on debuggable builds that listens to broadcasts that +simulate actions in the system that are used for testing the latency. + +### [com.android.systemui.globalactions.GlobalActionsComponent](/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java) + +Shows the global actions dialog (long-press power). + +### [com.android.systemui.ScreenDecorations](/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java) + +Draws decorations about the screen in software (e.g. rounded corners, cutouts). + +### [com.android.systemui.fingerprint.FingerprintDialogImpl](/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java) + +Fingerprint UI. --- + * [Plugins](/packages/SystemUI/docs/plugins.md) * [Demo Mode](/packages/SystemUI/docs/demo_mode.md) diff --git a/packages/SystemUI/docs/plugin_hooks.md b/packages/SystemUI/docs/plugin_hooks.md new file mode 100644 index 000000000000..5b08bfc387db --- /dev/null +++ b/packages/SystemUI/docs/plugin_hooks.md @@ -0,0 +1,60 @@ +# Plugin hooks +### Action: com.android.systemui.action.PLUGIN_OVERLAY +Expected interface: [OverlayPlugin](/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java) + +Use: Allows plugin access to the status bar and nav bar window for whatever nefarious purposes you can imagine. + +### Action: com.android.systemui.action.PLUGIN_QS +Expected interface: [QS](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java) + +Use: Allows the entire QS panel to be replaced with something else that is optionally expandable. + +Notes: To not mess up the notification panel interaction, much of the QSContainer interface needs to actually be implemented. + +### Action: com.android.systemui.action.PLUGIN_QS_FACTORY +Expected interface: [QSFactory](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java) + +Use: Controls the creation of QS Tiles and their views, can used to add or change system QS tiles, can also be used to change the layout/interaction of the tile views. + +### Action: com.android.systemui.action.PLUGIN_NAV_BUTTON +Expected interface: [NavBarButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java) + +Use: Allows a plugin to create a new nav bar button, or override an existing one with a view of its own. + +### Action: com.android.systemui.action.PLUGIN_NAV_GESTURE +Expected interface: [NavGesture](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java) + +Use: Allows touch events from the nav bar to be intercepted and used for other gestures. + +### Action: com.android.systemui.action.PLUGIN_LOCKSCREEN_RIGHT_BUTTON +Expected interface: [IntentButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java) + +Use: Allows a plugin to specify the icon for the bottom right lock screen button, and the intent that gets launched when it is activated. + +### Action: com.android.systemui.action.PLUGIN_LOCKSCREEN_LEFT_BUTTON +Expected interface: [IntentButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java) + +Use: Allows a plugin to specify the icon for the bottom left lock screen button, and the intent that gets launched when it is activated. + +### Action: com.android.systemui.action.PLUGIN_GLOBAL_ACTIONS +Expected interface: [GlobalActions](/packages/SystemUI/plugin/src/com/android/systemui/plugins/GlobalActions.java) + +Use: Allows the long-press power menu to be completely replaced. + +### Action: com.android.systemui.action.PLUGIN_VOLUME +Expected interface: [VolumeDialog](/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialog.java) + +Use: Allows replacement of the volume dialog. + +### Action: com.android.systemui.action.PLUGIN_NOTIFICATION_SWIPE_ACTION +Expected interface: [NotificationSwipeActionHelper](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java) + +Use: Control over swipes/input for notification views, can be used to control what happens when you swipe/long-press + + +# Global plugin dependencies +These classes can be accessed by any plugin using PluginDependency as long as they @Requires them. + +[VolumeDialogController](/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java) - Mostly just API for the volume plugin + +[ActivityStarter](/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java) - Allows starting of intents while co-operating with keyguard unlocks. diff --git a/packages/SystemUI/docs/plugins.md b/packages/SystemUI/docs/plugins.md new file mode 100644 index 000000000000..ed91f3daf869 --- /dev/null +++ b/packages/SystemUI/docs/plugins.md @@ -0,0 +1,227 @@ +# SystemUI Plugins + +Plugins provide an easy way to rapidly prototype SystemUI features. Plugins are APKs that will be installable only on Build.IS_DEBUGGABLE (dogfood) builds, that can change the behavior of SystemUI at runtime. This is done by creating a basic set of interfaces that the plugins can expect to be in SysUI, then the portion of code controlled by the interface can be iterated on faster than currently. + +Plugins keep the experimental and turbulent code outside of master and only on the devices which need to use the prototype. You can distribute early prototype directly to those that need to see it either through drive or email, and only show it to dogfooders when ready. + +## Adding Plugin Hooks + +Existing plugin hooks can be found [here](/packages/SystemUI/docs/plugin_hooks.md). + +### Writing the Interface(s) + +The first step of adding a plugin hook to SysUI is to define the interface layer between the plugin and SysUI. This interface should be relatively stable so that many different plugins will work across multiple different builds. + +All interfaces need to be independent and not reference classes from SysUI. They should be placed in the plugin library, under com.android.systemui.plugin or sub-packages. The main interface (entry point) for the plugin should extend the interface Plugin so that you can listen for it. + + +The most important part of interfaces is the version included in them. Every time the interface changes in an incompatible way, the version should be incremented. Incompatible changes are changes to the signature of any of the interface methods, or the addition of a new method that doesn’t have a default implementation. All classes that are in the plugin library should be tagged with a version, they should also be tagged with an action if they are the root interface for the Plugin. If a plugin makes use of the other versioned interface, they can use DependsOn to indicate their dependence. They are tagged using annotations like the following. + + +```java +@ProvidesInterface(action = MyPlugin.ACTION, version = MyPlugin.VERSION) +@DependsOn(target = OtherInterface.class) +public interface MyPlugin extends Plugin { + String ACTION = "com.android.systemui.action.PLUGIN_MY_PLUGIN"; + int VERSION = 1; + ... +} +``` + +### Plugin Listener + +To actually listen for plugins, you implement a plugin listener that has the following interface. + +```java +public interface PluginListener<T extends Plugin> { + /** + * Called when the plugin has been loaded and is ready to be used. + * This may be called multiple times if multiple plugins are allowed. + * It may also be called in the future if the plugin package changes + * and needs to be reloaded. + */ + void onPluginConnected(T plugin); + + /** + * Called when a plugin has been uninstalled/updated and should be removed + * from use. + */ + default void onPluginDisconnected(T plugin) { + // Optional. + } +} +``` + +Then you register the PluginListener with the PluginManager. The constants for action and version should be defined on class T. If allowMultiple is false, the plugin listener will only be connected to one plugin at a time. + +```java +void addPluginListener(String action, PluginListener<T> listener, + int version, boolean allowMultiple); +``` + +### Examples +[Allow quick settings panel to be replaced with another view](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java) + +[Allow plugins to create new nav bar buttons](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java) + +[Allow lockscreen camera/phone/assistant buttons to be replaced](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java) + +## Writing Plugins +### Make Files and Manifests + +When compiling plugins there are a couple vital pieces required. +1. They must be signed with the platform cert +2. They must include SystemUIPluginLib in LOCAL_JAVA_LIBRARIES (NOT LOCAL_STATIC_JAVA_LIBRARIES) + +Basically just copy the [example file](/packages/SystemUI/plugin/ExamplePlugin/Android.mk). + +To declare a plugin, you add a service to your manifest. Add an intent filter to match the action for the plugin, and set the name to point at the class that implements the plugin interface. + +```xml + <service android:name=".SampleOverlayPlugin" + android:label="@string/plugin_label"> + <intent-filter> + <action android:name="com.android.systemui.action.PLUGIN_OVERLAY" /> + </intent-filter> + </service> +``` + +Plugins must also hold the plugin permission. + +```xml + <uses-permission android:name="com.android.systemui.permission.PLUGIN" /> + ``` + + +### Implementing the interface + +Implementing the interface is generally pretty straightforward. The version of the plugin should tagged with an annotation to declare its dependency on each of the plugin classes it depends on. This ensures that the latest version will be included in the plugin APK when it is compiled. + +```java +@Requires(target = OverlayPlugin.class, version = OverlayPlugin.VERSION) +public class SampleOverlayPlugin implements OverlayPlugin { + ... +} +``` + +After the plugin is created and passes all permission/security checks, then the plugin will receive the onCreate callback. The pluginContext is pregenerated for the plugin and can be used to inflate or get any resources included in the plugin APK. + +```java +public void onCreate(Context sysuiContext, Context pluginContext); +``` + +When the plugin is being removed, the plugin will receive the onDestroy callback. At this point the plugin should ensure that all its resources and static references are cleaned up. + +```java +public void onDestroy(); +``` + +### Adding Settings + +A plugin can provide plugin-specific settings that will be surfaced as a gear button on the plugin tuner screen where plugins can be enabled or disabled. To add settings just add an activity to receive the PLUGIN_SETTINGS action. + +```xml + <activity android:name=".PluginSettings" + android:label="@string/plugin_label"> + <intent-filter> + <action android:name="com.android.systemui.action.PLUGIN_SETTINGS" /> + </intent-filter> + </activity> + ``` + +The plugin settings activity does not run in SysUI like the rest of the plugin, so it cannot reference any of the classes from SystemUIPluginLib. + +## Examples +[The definitive ExamplePlugin](/packages/SystemUI/plugin/ExamplePlugin) + +[Replace lock screen camera button with a settings trigger](todo) + +[A nav button that launches an action](todo) + + +## Writing plugins in Android Studio + +As long as the plugin doesn’t depend on any hidden APIs (which plugins should avoid anyway) and only uses Plugin APIs, you can be setup to build in android studio with only a couple steps. + +### Signing + +Plugins need to be signed with the platform cert, so you’ll need a copy of the keystore that contains the same cert. You might find one at http://go/plugin-keystore, you can copy it to the root directory of your project. Then you can tell your module to be signed with it by adding the following to the android section of your module’s build.gradle. + +```groovy +android { + ... + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + signingConfig signingConfigs.debug + } + } + signingConfigs { + debug { + keyAlias 'platform' + keyPassword 'android' + storeFile file('../platform.keystore') + storePassword 'android' + } + } + ... +} +``` + + +### Compiling against Plugin APIs + +To be able to implement a plugin, you’ll need a jar file that contains the plugin classes for compilation. Generally you can grab a recent plugin lib from jmonk’s experimental directory. However if you recently changed one of the plugin interfaces, you might want to build an updated version, you can use the following script to do so. + +``` +$ frameworks/base/packages/SystemUI/plugin/update_plugin_lib.sh +``` + +Once you have the jar you are going to compile against, you need to include it in your android studio project as a file dependency. Once it is included change its scope from Compile to Provided in the project structure (you may need to build once before changing to provided). This is required to ensure you don’t actually include the plugin library in your plugin APK. + +## Implementation Details + +Plugins are APKs that contain code and resources that can be dynamically loaded into SystemUI. The plugins are compiled against a set of relatively stable (and version tagged) interfaces, that the implementations are provided by SysUI. This figure shows an overview of how the plugin compiling/loading flow works. + + + +### Security + +Whenever loading a code from another APK into a privileged process like SysUI, there are serious security concerns to be addressed. To handle this, plugins have a couple lines of defense to ensure these don’t create any security holes. + +The first line of defense is Build.IS_DEBUGGABLE checks. In 2 different places, SysUI checks to ensure that the build is debuggable before even scanning or loading any plugins on the device. There are even tests in place to help ensure these checks are not lost. + +The second line of defense is a signature permission. This ensures that plugins are always provided by the source of the android build. All plugins must hold this permission for any of their code to be loaded, otherwise the infraction will be logged, and the plugin ignored. + +```xml + <permission android:name="com.android.systemui.permission.PLUGIN" + android:protectionLevel="signature" /> + ``` + +### Plugin Management + +Plugins are scanned for by intent filters of services. A plugin is not actually a service, but the benefits of declaring it as a service makes it worth it. Each plugin listener in SysUI simply specifies an action to look for, and the PluginManager scans for services declaring that action and uses that to know the class to instantiate. + + +The other major advantage to declaring plugins through components in a manifest is management of enabled state. Whether a plugin is enabled or disabled is managed by the package manager component enabled state. When a device has had a plugin installed on it, an extra section is added to the SystemUI Tuner, it lists all of the plugins on the device and allows the components to be easily enabled and disabled. + +### Versioning + +When a plugin listener is registered in SysUI, the interface version is specified. Whenever a plugin is detected, the first thing that is done after instantiation is the version is checked. If the version of the interface the plugin was compiled with does not match the version SysUI contains, then the plugin will be ignored. + +### Class loading + +When plugins are loaded, they are done so by creating a PathClassLoader that points at the plugin APK. The parent of the classloader is a special classloader based on SysUI’s that only includes the classes within the package com.android.systemui.plugin and its sub-packages. + +Having SysUI provide the implementations of the interfaces allows them to be more stable. Some version changes can be avoided by adding defaults to the interfaces, and not requiring older plugins to implement new functionality. The plugin library can also have static utility methods that plugins compile against, but the implementations are in sync with the platform builds. + +The class filtering in the parent classloader allows plugins to include any classes they want without worrying about collisions with SysUI. Plugins can include SettingsLib, or copy classes directly out of SysUI to facilitate faster prototyping. + +### Crashing + +Whether it be from accidental reference of hidden APIs, unstable prototypes, or other unexpected reasons, plugins will inevitably cause SysUI to crash. When this happens it needs to ensure a bad acting plugin do not stop the phone from being usable. + +When a plugin crashes, the PluginManager catches it and tries to determine the plugin that caused the crash. If any of the classes in the stack trace are from the package of the plugin APK, then the plugin is disabled. If no plugins can be identified as the source of the crash, then all plugins are disabled, just to be sure they aren’t causing future crashes. diff --git a/packages/SystemUI/docs/sysui-plugins.png b/packages/SystemUI/docs/sysui-plugins.png Binary files differnew file mode 100644 index 000000000000..283d6d2fd049 --- /dev/null +++ b/packages/SystemUI/docs/sysui-plugins.png diff --git a/packages/SystemUI/docs/sysui-plugins.svg b/packages/SystemUI/docs/sysui-plugins.svg new file mode 100644 index 000000000000..0014dda302cf --- /dev/null +++ b/packages/SystemUI/docs/sysui-plugins.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" standalone="yes"?> + +<svg version="1.1" viewBox="0.0 0.0 800.0 600.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l800.0 0l0 600.0l-800.0 0l0 -600.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l800.0 0l0 600.0l-800.0 0z" fill-rule="evenodd"></path><path fill="#cfe2f3" d="m554.9921 190.7559l220.0 0l0 218.48817l-220.0 0z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m554.9921 190.7559l220.0 0l0 218.48817l-220.0 0z" fill-rule="evenodd"></path><path fill="#000000" d="m619.24243 306.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.4279175 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1447754 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm14.293396 0l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.0529785 5.484375l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.5997925 7.0l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m73.0 119.49606l333.00787 0l0 361.00787l-333.00787 0z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m73.0 119.49606l333.00787 0l0 361.00787l-333.00787 0z" fill-rule="evenodd"></path><path fill="#000000" d="m194.21265 142.11919l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm8.600983 0l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.052948 5.484375l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.599823 7.0l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m131.50394 359.5042l0 0c0 -7.456726 6.044861 -13.501587 13.501587 -13.501587l192.99683 0c3.580841 0 7.0150146 1.4224854 9.547058 3.9545288c2.5320435 2.5320435 3.9545288 5.966217 3.9545288 9.547058l0 54.0047c0 7.456726 -6.044861 13.501587 -13.501587 13.501587l-192.99683 0c-7.456726 0 -13.501587 -6.044861 -13.501587 -13.501587z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m131.50394 359.5042l0 0c0 -7.456726 6.044861 -13.501587 13.501587 -13.501587l192.99683 0c3.580841 0 7.0150146 1.4224854 9.547058 3.9545288c2.5320435 2.5320435 3.9545288 5.966217 3.9545288 9.547058l0 54.0047c0 7.456726 -6.044861 13.501587 -13.501587 13.501587l-192.99683 0c-7.456726 0 -13.501587 -6.044861 -13.501587 -13.501587z" fill-rule="evenodd"></path><path fill="#000000" d="m217.46965 389.1297l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.95314 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.1250153 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.9531403 0 2.7812653 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m133.0 207.33095l0 0c0 -6.810196 5.520752 -12.330948 12.330948 -12.330948l192.34596 0c3.2703857 0 6.4067993 1.2991486 8.719299 3.6116486c2.3125 2.3125 3.6116638 5.448929 3.6116638 8.719299l0 49.322342c0 6.810211 -5.520752 12.330963 -12.330963 12.330963l-192.34596 0c-6.810196 0 -12.330948 -5.520752 -12.330948 -12.330963z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m133.0 207.33095l0 0c0 -6.810196 5.520752 -12.330948 12.330948 -12.330948l192.34596 0c3.2703857 0 6.4067993 1.2991486 8.719299 3.6116486c2.3125 2.3125 3.6116638 5.448929 3.6116638 8.719299l0 49.322342c0 6.810211 -5.520752 12.330963 -12.330963 12.330963l-192.34596 0c-6.810196 0 -12.330948 -5.520752 -12.330948 -12.330963z" fill-rule="evenodd"></path><path fill="#000000" d="m204.56313 238.91212l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519821 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7350922 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328842 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500717 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m550.98425 233.0l-200.97638 -1.0078735" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m550.98425 233.0l-194.97647 -0.97779846" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m356.01608 230.3705l-4.5463257 1.628952l4.5297546 1.674469z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m406.00787 133.0l145.98425 0l0 98.99213l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m416.44537 159.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm15.559021 0l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.547577 1.96875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m416.24225 181.92l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm9.766357 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297577 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm9.735107 -4.015625l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm6.197052 1.125l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125z" fill-rule="nonzero"></path><path fill="#000000" d="m422.50787 203.92l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 9.46875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516357 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.641357 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906952 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688202 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm2.9375 7.265625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm13.980164 -8.5625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m416.44537 225.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500732 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m351.50394 386.50656l204.00003 1.4803162" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m351.50394 386.50656l198.00015 1.4367676" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m549.4921 389.59503l4.5499268 -1.6187744l-4.526001 -1.6846008z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m409.0 325.0l133.00787 0l0 61.51181l-133.00787 0z" fill-rule="evenodd"></path><path fill="#000000" d="m418.84375 347.6231l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm9.819763 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm3.582306 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610077 3.65625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.469482 4.859375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm8.625732 1.9375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m419.4375 373.91998l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519806 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm21.871521 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm2.40625 -1.296875q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563202 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m241.50394 346.00262l0 -77.00787" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m241.50394 346.00262l0 -77.00787" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m241.51181 273.88583l145.98425 0l0 67.212585l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m251.35556 296.50894l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.0042114 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm9.210358 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 2.359375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.156952 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1448364 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.113556 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"></path><path fill="#000000" d="m251.69931 322.80582l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.191696 -11.46875l0 -1.890625l1.6406403 0l0 1.890625l-1.6406403 0zm0 11.46875l0 -9.671875l1.6406403 0l0 9.671875l-1.6406403 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0zm8.671875 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm15.370789 2.890625l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500732 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m409.0 386.50656l145.98425 0l0 77.00787l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m418.84375 409.1297l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm16.491638 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.047577 5.765625l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.421875 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516327 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9489136 -1.421875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m419.23438 423.95782l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448364 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953827 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230194 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.618927 0l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm11.105164 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.516357 1.3125l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm14.715271 5.765625l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.7770386 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6189575 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m419.4375 457.42657l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519806 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500702 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path></g></svg> + diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java index 4b3afdc3eb7a..6c31b2af039e 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java @@ -181,6 +181,5 @@ public interface VolumeDialogController { void onScreenOff(); void onShowSafetyWarning(int flags); void onAccessibilityModeChanged(Boolean showA11yStream); - void onConnectedDeviceChanged(String deviceName); } } diff --git a/packages/SystemUI/plugin/update_plugin_lib.sh b/packages/SystemUI/plugin/update_plugin_lib.sh new file mode 100755 index 000000000000..a105b451d108 --- /dev/null +++ b/packages/SystemUI/plugin/update_plugin_lib.sh @@ -0,0 +1,15 @@ +#!/bin/bash +cd $ANDROID_BUILD_TOP/frameworks/base/packages/SystemUI/plugin +# Clear out anything old. +rm -rf /tmp/plugin_classes/ +mkdir /tmp/plugin_classes + +# Compile the jar +javac -cp $ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar:$ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/classes.jar `find src -name *.java` -d /tmp/plugin_classes/ +echo "" >> /tmp/plugin_classes/manifest.txt +jar cvfm SystemUIPluginLib.jar /tmp/plugin_classes/manifest.txt -C /tmp/plugin_classes . + +# Place the jar and update the latest +mv SystemUIPluginLib.jar ./SystemUIPluginLib-`date +%m-%d-%Y`.jar +rm SystemUIPluginLib-latest.jar +ln -s SystemUIPluginLib-`date +%m-%d-%Y`.jar SystemUIPluginLib-latest.jar diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml index d0389ebc2640..828c9df4525e 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml @@ -34,6 +34,7 @@ android:layout_marginBottom="7dp" android:paddingStart="64dp" android:paddingEnd="64dp" + android:textColor="?attr/wallpaperTextColor" android:theme="@style/TextAppearance.Keyguard" /> <LinearLayout android:id="@+id/row" diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml index 31635a507d6f..fa14d1b55896 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml @@ -62,7 +62,7 @@ android:layout_gravity="center_horizontal" android:layout_centerHorizontal="true" android:layout_alignParentTop="true" - android:letterSpacing="0.04" + android:letterSpacing="0.03" android:textColor="?attr/wallpaperTextColor" android:singleLine="true" style="@style/widget_big_thin" @@ -76,6 +76,7 @@ android:layout_marginTop="22dp" android:layout_below="@id/clock_view" android:background="#f00" + android:backgroundTint="?attr/wallpaperTextColor" android:layout_centerHorizontal="true" /> <include layout="@layout/keyguard_status_area" diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml index b3ed8f5c9004..8956735afabf 100644 --- a/packages/SystemUI/res-keyguard/values-ar/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"تم ضبط التنبيه التالي على <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"تعطيل شريحة eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"يتعذّر إيقاف eSIM."</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"يتعذّر إيقاف eSIM بسبب خطأ."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"نسيت النقش"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"نقش خاطئ"</string> @@ -69,7 +71,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ارسم نقشك"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"أدخل رقم التعريف الشخصي لشريحة SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"يجب تعطيل شريحة eSIM لاستخدام الجهاز دون خدمة جوال."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> يجب إيقاف eSIM لاستخدام الجهاز دون خدمة جوّال."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"أدخل رقم التعريف الشخصي"</string> <string name="kg_password_instructions" msgid="136952397352976538">"أدخل كلمة المرور"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"شريحة SIM معطّلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوّال للاطلاع على التفاصيل."</string> diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml new file mode 100644 index 000000000000..06820a6f1576 --- /dev/null +++ b/packages/SystemUI/res-keyguard/values-as/strings.xml @@ -0,0 +1,147 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* //device/apps/common/assets/res/any/strings.xml +** +** Copyright 2006, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_name" msgid="3171996292755059205">"কীগাৰ্ড"</string> + <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"পিন ক\'ড লিখক"</string> + <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"ছিমৰ PUK আৰু নতুন পিন ক\'ড লিখক"</string> + <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"ছিমৰ PUK ক\'ড"</string> + <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"নতুন ছিমৰ পিন ক\'ড"</string> + <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"পাছৱৰ্ড লিখিবলৈ স্পৰ্শ কৰক"</font></string> + <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"আনলক কৰিবলৈ পাছৱৰ্ড লিখক"</string> + <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"আনলক কৰিবলৈ পিন লিখক"</string> + <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন ক\'ড।"</string> + <!-- no translation found for keyguard_sim_error_message_short (592109500618448312) --> + <skip /> + <string name="keyguard_charged" msgid="2222329688813033109">"চ্চার্জ কৰা হ\'ল"</string> + <string name="keyguard_plugged_in" msgid="89308975354638682">"চ্চার্জ কৰি থকা হৈছে"</string> + <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string> + <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"লাহে লাহে চ্চাৰ্জ হৈ আছে"</string> + <string name="keyguard_low_battery" msgid="9218432555787624490">"আপোনাৰ চ্চার্জাৰ সংযোগ কৰক।"</string> + <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"আনলক কৰিবলৈ মেনু টিপক।"</string> + <string name="keyguard_network_locked_message" msgid="6743537524631420759">"নেটৱর্ক লক কৰা অৱস্থাত আছে"</string> + <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"কোনো ছিম কাৰ্ড নাই"</string> + <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"টেবলেটত ছিম কার্ড নাই।"</string> + <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ফ\'নত ছিম কার্ড নাই।"</string> + <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"এখন ছিম কাৰ্ড ভৰাওক।"</string> + <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ছিম কাৰ্ডখন নাই বা চিনাক্ত কৰিব নোৱাৰি। এখন ছিম কাৰ্ড ভৰাওক।"</string> + <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড।"</string> + <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"আপোনাৰ ছিম কাৰ্ডখন স্থায়ীভাৱে অক্ষম হৈছে।\n অন্য এখন ছিমৰ বাবে আপোনাৰ ৱায়াৰলেছ সেৱা প্ৰদানকাৰীৰ সৈতে যোগাযোগ কৰক।"</string> + <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ছিম কাৰ্ড লক কৰা হৈছে।"</string> + <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ছিম কার্ডখন PUKৰ দ্বাৰা লক কৰা হৈছে।"</string> + <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ছিম কার্ড আনলক কৰি থকা হৈছে…"</string> + <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"পিনৰ ক্ষেত্ৰ"</string> + <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ছিম পিনৰ ক্ষেত্ৰ"</string> + <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ছিমৰ PUK ক্ষেত্ৰ"</string> + <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পৰৱৰ্তী এলাৰ্ম <xliff:g id="ALARM">%1$s</xliff:g> বজাত ছেট কৰা হৈছে"</string> + <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মচক"</string> + <!-- no translation found for disable_carrier_button_text (6914341927421916114) --> + <skip /> + <!-- no translation found for error_disable_esim_title (4852978431156228006) --> + <skip /> + <!-- no translation found for error_disable_esim_msg (676694908770135639) --> + <skip /> + <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এণ্টাৰ বুটাম"</string> + <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"আৰ্হি পাহৰিলে নেকি"</string> + <string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল আৰ্হি"</string> + <string name="kg_wrong_password" msgid="4580683060277329277">"ভুল পাছৱৰ্ড"</string> + <string name="kg_wrong_pin" msgid="4785660766909463466">"ভুল পিন"</string> + <!-- no translation found for kg_too_many_failed_attempts_countdown (4368805541257003755) --> + <string name="kg_pattern_instructions" msgid="5547646893001491340">"আপোনাৰ আৰ্হি আঁকক"</string> + <!-- no translation found for kg_sim_pin_instructions (6389000973113699187) --> + <skip /> + <!-- no translation found for kg_sim_pin_instructions_multi (1643757228644271861) --> + <skip /> + <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> + <skip /> + <string name="kg_pin_instructions" msgid="4069609316644030034">"পিন দিয়ক"</string> + <string name="kg_password_instructions" msgid="136952397352976538">"পাছৱৰ্ড দিয়ক"</string> + <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ছিমখন বর্তমান অক্ষম অৱস্থাত আছে। অব্যাহত ৰাখিবলৈ PUK ক\'ড লিখক। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।"</string> + <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ছিমখন বর্তমান অক্ষম অৱস্থাত আছে। অব্যাহত ৰাখিবলৈ PUK ক\'ড দিয়ক। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।"</string> + <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"আপোনাৰ পছন্দৰ পিন ক\'ড লিখক"</string> + <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"আপোনাৰ পচন্দৰ পিন ক\'ড নিশ্চিত কৰক"</string> + <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"ছিম কার্ড আনলক কৰি থকা হৈছে…"</string> + <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"৪টাৰ পৰা ৮টা সংখ্যাযুক্ত এটা পিন লিখক।"</string> + <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK ক\'ডটো ৮টা বা তাতকৈ অধিক সংখ্যা থকা হ\'ব লাগিব।"</string> + <string name="kg_invalid_puk" msgid="5399287873762592502">"শুদ্ধ PUK ক\'ডটো পুনৰ দিয়ক। বাৰে বাৰে ভুল ক\'ড দিলে ছিমখন স্থায়ীভাৱে অক্ষম হ\'ব।"</string> + <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"পিন ক\'ড মিলা নাই"</string> + <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"বহুতবাৰ ভুলকৈ আর্হি অঁকা হৈছে"</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"আপুনি আপোনাৰ পিন <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ লিখিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g>ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"আপুনি আপোনাৰ পাছৱৰ্ড <xliff:g id="NUMBER_0">%1$d</xliff:g>বাৰ ভুলকৈ লিখিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।"</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"আপুনি আপোনাৰ আনলক আৰ্হি <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g>ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string> + <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে টেবলেটটো ৰিছেট কৰা হ\'ব, যি কার্যই টেবলেটটোত থকা সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে ফ\'নটো ৰিছেট কৰা হ\'ব, যি কার্যই ফ\'নটোত থকা সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই টেবলেটটো ৰিছেট কৰা হ\'ব, যি কার্যই ইয়াৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ফ\'নটো ৰিছেট কৰা হ\'ব, যিয়ে ইয়াৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যি কার্যই ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যি কার্যই প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"আপুনি আপোনাৰ আনলক আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। <xliff:g id="NUMBER_1">%2$d</xliff:g>তকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ টেবলেটটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"আপুনি আপোনাৰ আনলক আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। <xliff:g id="NUMBER_1">%2$d</xliff:g>তকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ ফ\'নটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string> + <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"ছিমৰ ভুল পিন ক\'ড, আপোনাৰ ডিভাইচটো আনলক কৰিবলৈ আপুনি এতিয়া আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰিবই লাগিব।"</string> + <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967"> + <item quantity="one">ছিমৰ ভুল পিন ক’ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ প্ৰয়াস কৰিব পাৰিব।</item> + <item quantity="other">ছিমৰ ভুল পিন ক’ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ প্ৰয়াস কৰিব পাৰিব।</item> + </plurals> + <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ছিম ব্যৱহাৰযোগ্য নহয়। আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক।"</string> + <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513"> + <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> + <string name="kg_password_pin_failed" msgid="8769990811451236223">"ছিম পিনৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!"</string> + <string name="kg_password_puk_failed" msgid="1331621440873439974">"ছিম PUKৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!"</string> + <string name="kg_pin_accepted" msgid="7637293533973802143">"ক\'ড গ্ৰহণ কৰা হ\'ল!"</string> + <string name="keyguard_carrier_default" msgid="4274828292998453695">"কোনো সেৱা নাই।"</string> + <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ইনপুট পদ্ধতি সলনি কৰক"</string> + <string name="airplane_mode" msgid="3807209033737676010">"এয়াৰপ্লেন ম\'ড"</string> + <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত আৰ্হি দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"অতিৰিক্ত সুৰক্ষাৰ বাবে আর্হি দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"অতিৰিক্ত সুৰক্ষাৰ বাবে পিন দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"অতিৰিক্ত সুৰক্ষাৰ বাবে পাছৱর্ড দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"প্ৰ\'ফাইল সলনি কৰোঁতে আৰ্হি দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string> + <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"প্ৰ\'ফাইল সলনি কৰোঁতে পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string> + <!-- no translation found for kg_prompt_reason_device_admin (3452168247888906179) --> + <skip /> + <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string> + <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533"> + <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। আর্হি নিশ্চিত কৰক।</item> + <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। আর্হি নিশ্চিত কৰক।</item> + </plurals> + <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385"> + <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পিন নিশ্চিত কৰক।</item> + <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পিন নিশ্চিত কৰক।</item> + </plurals> + <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527"> + <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item> + <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item> + </plurals> + <string name="fingerprint_not_recognized" msgid="348813995267914625">"চিনাক্ত কৰিব পৰা নগ\'ল"</string> + <!-- no translation found for kg_password_default_pin_message (6203676909479972943) --> + <!-- no translation found for kg_password_default_puk_message (8744416410184198352) --> +</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 079ba925b8c2..a652905f4b29 100644 --- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sledeći alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Onemogućavanje eSIM-a nije uspelo"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM ne može da se onemogući zbog greške."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravio/la sam šablon"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan šablon"</string> @@ -66,7 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte šablon"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogućite eSIM da biste uređaj koristili bez mobilne usluge."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM da biste uređaj koristili bez mobilne usluge."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da biste nastavili. Detaljne informacije potražite od mobilnog operatera."</string> diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml index a3a38154968b..744fde30fd96 100644 --- a/packages/SystemUI/res-keyguard/values-be/strings.xml +++ b/packages/SystemUI/res-keyguard/values-be/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Наступны будзільнік пастаўлены на <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Выдаліць"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Адключыць eSIM-карту"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Немагчыма адключыць eSIM-карту"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Немагчыма адключыць eSIM-карту з-за памылкі."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Увесці"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Забыў(-ла) узор"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Няправільны ўзор"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйце ўзор"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Увядзіце PIN-код SIM-карты."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Увядзіце PIN-код SIM-карты для \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Адключыце eSIM-карту, каб выкарыстоўваць прыладу без сэрвісу мабільнай перадачы даных."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Каб выкарыстоўваць прыладу без мабільнай сувязі, адключыце eSIM-карту."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Увядзіце PIN-код"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Увядзіце пароль"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-карта зараз адключана. Увядзіце PUK-код, каб працягнуць. Звяжыцеся са сваім аператарам, каб атрымаць дадатковую інфармацыю."</string> diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml index 87c7519fa91b..3c94610b28fd 100644 --- a/packages/SystemUI/res-keyguard/values-bg/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Следващият будилник е зададен за <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Изтриване"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Деактивиране на ел. SIM карта"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Електронната SIM карта не може да бъде деактивирана"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Електронната SIM карта не може да бъде деактивирана поради грешка."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"„Enter“"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Забравена фигура"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Грешна фигура"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Начертайте фигурата си"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Въведете ПИН кода за SIM картата."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Въведете ПИН кода"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Въведете паролата"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Свържете се с оператора за подробности."</string> diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml index 81c56da4146b..215928db42ea 100644 --- a/packages/SystemUI/res-keyguard/values-bn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পরবর্তী অ্যালার্ম <xliff:g id="ALARM">%1$s</xliff:g> এ সেট করা হয়েছে"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মুছুন"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"ই-সিমটি অক্ষম করুন"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ই-সিম বন্ধ করা যাচ্ছে না"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"একটি সমস্যার কারণে ই-সিমটি বন্ধ করা যাচ্ছে না।"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এন্টার"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"প্যাটার্ন ভুলে গেছি"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল প্যাটার্ন"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"আপনার প্যাটার্ন আঁকুন"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"সিমের পিন লিখুন।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> মোবাইল পরিষেবা ছাড়া ডিভাইস ব্যবহার করার জন্য ই-সিম বন্ধ করুন।"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"পিন লিখুন"</string> <string name="kg_password_instructions" msgid="136952397352976538">"পাসওয়ার্ড লিখুন"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"সিমটি এখন অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোডটি লিখুন। বিশদ বিবরণের জন্য পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string> diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml index 6ff819ca45e6..d4851085d5f4 100644 --- a/packages/SystemUI/res-keyguard/values-bs/strings.xml +++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM karticu"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nije moguće onemogućiti eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM nije moguće onemogućiti zbog greške."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string> @@ -70,8 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte uzorak"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN SIM kartice."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM za korištenje uređaja bez mobilne usluge."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da nastavite. Za više informacija obratite se operateru."</string> diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml index 511516ea7926..283226c9dc02 100644 --- a/packages/SystemUI/res-keyguard/values-ca/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"S\'ha definit la pròxima alarma per a l\'hora següent: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Suprimeix"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desactiva l\'eSIM"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"No es pot desactivar l\'eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"S\'ha produït un error i no es pot desactivar l\'eSIM."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retorn"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"He oblidat el patró"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"El patró no és correcte"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuixa el patró"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introdueix el PIN de la SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva l\'eSIM per utilitzar el dispositiu sense servei mòbil."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introdueix el PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Introdueix la contrasenya"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La SIM està desactivada. Introdueix el codi PUK per continuar. Contacta amb l\'operador de telefonia mòbil per obtenir més informació."</string> diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml index 852a9c1d246c..d74278637ef3 100644 --- a/packages/SystemUI/res-keyguard/values-de/strings.xml +++ b/packages/SystemUI/res-keyguard/values-de/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nächster Wecker gestellt für <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Löschen"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM deaktivieren"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Die eSIM kann nicht deaktiviert werden"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Die eSim kann aufgrund eines Fehlers nicht deaktiviert werden."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Eingabe"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Muster vergessen"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Falsches Muster"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Muster zeichnen"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Gib die SIM-PIN ein"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Deaktiviere eSIM, um das Gerät ohne Mobilfunkdienst zu verwenden."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiviere die eSIM, um das Gerät ohne Mobilfunkdienst zu verwenden."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN eingeben"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Passwort eingeben"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Weitere Informationen erhältst du von deinem Mobilfunkanbieter."</string> diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml index 0127ef163af9..4c3390b81f97 100644 --- a/packages/SystemUI/res-keyguard/values-el/strings.xml +++ b/packages/SystemUI/res-keyguard/values-el/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Το επόμενο ξυπνητήρι ορίστηκε στις <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Διαγραφή"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Απενεργοποίηση eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Αδυναμία απενεργοποίησης eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Δεν είναι δυνατή η απενεργοποίηση της eSIM, εξαιτίας κάποιου σφάλματος."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ξεχάσατε το μοτίβο"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Λάθος μοτίβο"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Σχεδιάστε το μοτίβο σας"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Εισαγωγή αριθμού PIN κάρτας SIM"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Εισαγάγετε τον αριθμό PIN της κάρτας SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Απενεργοποιήστε την eSIM, για να χρησιμοποιήσετε τη συσκευή χωρίς υπηρεσία για κινητά."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Απενεργοποιήστε την eSIM, για να χρησιμοποιήσετε τη συσκευή χωρίς υπηρεσία για κινητά."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Εισαγάγετε τον αριθμό PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Εισαγάγετε κωδικό πρόσβασης"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Η κάρτα SIM είναι απενεργοποιημένη αυτή τη στιγμή. Εισαγάγετε τον κωδικό PUK για να συνεχίσετε. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας σας για λεπτομέρειες."</string> diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml index df0c45b54bbb..9fd0ed5606e4 100644 --- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml +++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma establecida: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Borrar"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Inhabilitar eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"No se puede inhabilitar la eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"No se puede inhabilitar la eSIM debido a un error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"¿Olvidaste el patrón?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Patrón incorrecto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ingresa el PIN de la tarjeta SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Inhabilita la eSIM para usar el dispositivo sin servicio de datos móviles."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Ingresa el PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Escribe la contraseña"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, comunícate con el proveedor."</string> diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml index bca98ef32af3..eaf14001fbed 100644 --- a/packages/SystemUI/res-keyguard/values-et/strings.xml +++ b/packages/SystemUI/res-keyguard/values-et/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Järgmine alarm on määratud ajaks <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Kustuta"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Keela eSIM-kaart"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-kaarti ei saa keelata"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Vea tõttu ei saa eSIM-kaarte keelata."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Sisesta"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Unustasin mustri"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Vale muster"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Joonistage oma muster"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sisestage SIM-kaardi PIN-kood."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kaardi PIN-kood."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Keelake eSIM-kaart, et seadet ilma mobiilsideteenuseta kasutada."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Keelake eSIM-kaart, et seadet ilma mobiilsideteenuseta kasutada."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Sisestage PIN-kood"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Sisestage parool"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Lisateabe saamiseks võtke ühendust operaatoriga."</string> diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml index ce46e6ae4b05..0cb3e0b031ae 100644 --- a/packages/SystemUI/res-keyguard/values-fa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"زنگ ساعت بعدی برای <xliff:g id="ALARM">%1$s</xliff:g> تنظیم شد"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"حذف"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"غیرفعال کردن eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"سیمکارت داخلی غیرفعال نشد"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"به دلیل بروز خطا، سیمکارت داخلی غیرفعال نشد."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"الگو را فراموش کردهاید"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"الگوی اشتباه"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"الگوی خود را رسم کنید"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"پین سیمکارت را وارد کنید."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"پین سیمکارت «<xliff:g id="CARRIER">%1$s</xliff:g>» را وارد کنید."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"برای استفاده از دستگاه بدون سرویس همراه، eSIM را غیرفعال کنید."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>برای استفاده از دستگاه بدون سرویس همراه، سیمکارت داخلی را غیرفعال کنید."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"کد پین را وارد کنید"</string> <string name="kg_password_instructions" msgid="136952397352976538">"گذرواژه را وارد کنید"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"اکنون سیمکارت غیرفعال است. کد پین را برای ادامه وارد کنید. برای جزئیات با شرکت مخابراتی خود تماس بگیرید."</string> diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml index 34b638e7a4c8..5d5e3639644a 100644 --- a/packages/SystemUI/res-keyguard/values-fr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Date et heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Supprimer"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Désactiver la carte eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Impossible de désactiver la carte eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Impossible de désactiver la carte eSIM en raison d\'une erreur."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Entrée"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"J\'ai oublié le schéma"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Schéma incorrect"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Saisissez le code PIN de la carte SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Saisissez le code"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Saisissez le mot de passe"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La carte SIM est maintenant désactivée. Pour continuer, saisissez la clé PUK. Contactez votre opérateur pour en savoir plus."</string> diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml index e21e8441f7f8..7075c37d09dd 100644 --- a/packages/SystemUI/res-keyguard/values-gl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma definida para: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Desactivar eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Non se puido desactivar a eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"A eSIM non se puido desactivar debido a un erro."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueciches o padrón"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrón incorrecto"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Debuxa o teu padrón"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduce o PIN da SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desactiva a eSIM para usar o dispositivo sen servizo móbil."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva a eSIM para usar o dispositivo sen o servizo móbil."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Introduce o PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Insire o teu contrasinal"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Agora a tarxeta SIM está desactivada. Introduce o código PUK para continuar. Ponte en contacto co operador para obter máis información."</string> diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml index d2e6c023d3f5..d7faa2ace032 100644 --- a/packages/SystemUI/res-keyguard/values-gu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> માટે આગલું એલાર્મ સેટ કર્યું"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"કાઢી નાખો"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMને અક્ષમ કરો"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ઇ-સિમ બંધ કરી શકાતું નથી"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"એક ભૂલને લીધે ઇ-સિમ બંધ કરી શકાતું નથી."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"દાખલ કરો"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"પૅટર્ન ભૂલી ગયાં"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ખોટી પૅટર્ન"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"તમારી પૅટર્ન દોરો"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"સિમ પિન દાખલ કરો"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા માટે ઇ-સિમને બંધ કરો."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"પિન દાખલ કરો"</string> <string name="kg_password_instructions" msgid="136952397352976538">"પાસવર્ડ દાખલ કરો"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"સિમ હમણાં અક્ષમ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. વિગતો માટે કૅરિઅરનો સંપર્ક કરો."</string> diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml index dfd06b2824bd..746e8837c719 100644 --- a/packages/SystemUI/res-keyguard/values-hi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अगला अलार्म <xliff:g id="ALARM">%1$s</xliff:g> बजे के लिए सेट किया गया है"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मिटाएं"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM अक्षम करें"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ई-सिम बंद नहीं किया जा सकता"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"किसी गड़बड़ी की वजह से ई-सिम बंद नहीं किया जा सकता."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पैटर्न भूल गए हैं"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत पैटर्न"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"अपना पैटर्न बनाएं"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन डालें."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा के बिना डिवाइस का इस्तेमाल करने के लिए ई-सिम बंद करें."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"पिन डालें"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड डालें"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम अब काम नहीं करेगा. जारी रखने के लिए PUK कोड डालें. ज़्यादा जानकारी के लिए अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें."</string> diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml index cfdf5cd8662f..f4dca4c0a8a3 100644 --- a/packages/SystemUI/res-keyguard/values-hr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sljedeći alarm postavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nije moguće onemogućiti eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Onemogućivanje eSIM-a nije uspjelo zbog pogreške."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Unos"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string> @@ -66,7 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Iscrtajte svoj uzorak"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogućite eSIM kako biste uređaj upotrebljavali bez mobilne usluge."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM kako biste uređaj upotrebljavali bez mobilne usluge."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Unesite zaporku"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM je sad onemogućen. Unesite PUK kôd da biste nastavili. Obratite se mobilnom operateru za više pojedinosti."</string> diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml index 71f34a9b639f..b9a51bc08762 100644 --- a/packages/SystemUI/res-keyguard/values-hu/strings.xml +++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"A következő ébresztés beállított ideje: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Törlés"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Az e-SIM-kártya letiltása"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nem lehet letiltani az eSIM-et"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Hiba történt, így az eSIM-et nem lehet letiltani."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Elfelejtettem a mintát"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Helytelen minta"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Rajzolja le a mintát"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Adja meg a SIM-kártya PIN-kódját."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Tiltsa le az e-SIM-kártyát az eszköz mobilszolgáltatás nélküli használatához."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tiltsa le az e-SIM-et az eszköz mobilszolgáltatás nélküli használatához."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Adja meg a PIN-kódot"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Írja be a jelszót"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. A részletekért vegye fel a kapcsolatot szolgáltatójával."</string> diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml index ee3621c35932..e5d2c892d10f 100644 --- a/packages/SystemUI/res-keyguard/values-in/strings.xml +++ b/packages/SystemUI/res-keyguard/values-in/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarm berikutnya disetel untuk <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Hapus"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Nonaktifkan eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Tidak dapat menonaktifkan eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM tidak dapat dinonaktifkan karena terjadi error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Masukkan"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Lupa Pola?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Pola Salah"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Gambar pola Anda"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Nonaktifkan eSIM untuk menggunakan perangkat tanpa layanan seluler."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Nonaktifkan eSIM untuk menggunakan perangkat tanpa layanan seluler."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Sandi"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM telah dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Hubungi operator untuk keterangan selengkapnya."</string> diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml index cead5c4c97f4..e0ef1f85e4b3 100644 --- a/packages/SystemUI/res-keyguard/values-is/strings.xml +++ b/packages/SystemUI/res-keyguard/values-is/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Næsti vekjari stilltur á <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eyða"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Aftengja eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Ekki tókst að gera eSIM-kort óvirkt"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Villa kom í veg fyrir að hægt væri að gera eSIM-kortið óvirkt."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Færa inn"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Man ekki mynstrið"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Rangt mynstur"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teiknaðu mynstrið þitt"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sláðu inn PIN-númer SIM-kortsins."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Aftengdu eSIM til að nota tækið án farsímakerfisþjónustu."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Gerðu eSIM-kortið óvirkt til að nota tækið án tengingar við farsímakerfi."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Sláðu inn PIN-númer"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Sláðu inn aðgangsorð"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortið hefur verið gert óvirkt. Sláðu inn PUK-númerið til að halda áfram. Hafðu samband við símafyrirtækið til að fá frekari upplýsingar."</string> diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml index 8be3a8922e95..35facff23aa2 100644 --- a/packages/SystemUI/res-keyguard/values-iw/strings.xml +++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ההתראה הבאה נקבעה ל-<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"השבתת ה-eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"לא ניתן להשבית את כרטיס ה-eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"לא ניתן להשבית את כרטיס ה-eSIM עקב שגיאה."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"שכחתי את קו ביטול הנעילה"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"קו ביטול הנעילה שגוי"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"שרטט את קו ביטול הנעילה"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"הזן את קוד הגישה של כרטיס ה-SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"הזן את קוד הגישה של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"השבת את ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"הזן קוד גישה"</string> <string name="kg_password_instructions" msgid="136952397352976538">"הזן את הסיסמה"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."</string> diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml index 6bdc20010b21..044284965f58 100644 --- a/packages/SystemUI/res-keyguard/values-ja/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"次のアラームを <xliff:g id="ALARM">%1$s</xliff:g> に設定しました"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"削除"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM を無効にする"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM を無効にできません"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"エラーのため、eSIM を無効にできません。"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"入力"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"パターンを忘れた場合"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"パターンが正しくありません"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"パターンを入力してください"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN を入力してください。"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください。"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"モバイル サービスなしで端末を使用するには eSIM を無効にしてください。"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>モバイル サービスなしで端末を使用するには eSIM を無効にしてください。"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN を入力してください"</string> <string name="kg_password_instructions" msgid="136952397352976538">"パスワードを入力してください"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM が無効になりました。続行するには PUK コードを入力してください。詳しくは携帯通信会社にお問い合わせください。"</string> diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml index 31ccaae0d574..48fecdf2eeaa 100644 --- a/packages/SystemUI/res-keyguard/values-ka/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"შემდეგი მაღვიძარა დაყენებულია <xliff:g id="ALARM">%1$s</xliff:g>-ზე"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"წაშლა"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-ის გათიშვა"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-ის გათიშვა ვერ ხერხდება"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM-ის გათიშვა ვერ ხერხდება წარმოქმნილი შეცდომის გამო."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"შეყვანა"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"დაგავიწყდათ ნიმუში"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ნიმუში არასწორია"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"დახატეთ თქვენი ნიმუში"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"შეიყვანეთ SIM ბარათის PIN-კოდი."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-ისთვის."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"შეიყვანეთ PIN-კოდი"</string> <string name="kg_password_instructions" msgid="136952397352976538">"შეიყვანეთ პაროლი"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს."</string> diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml index f9e12f115345..dd1571709549 100644 --- a/packages/SystemUI/res-keyguard/values-kk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Келесі дабыл уақыты: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Жою"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM картасын өшіру"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM картасы өшірілмеді"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Қатеге байланысты eSIM картасы өшірілмеді."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Енгізу"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Өрнекті ұмытып қалдыңыз ба?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Өрнек қате"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Өрнекті енгізіңіз"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN кодын енгізіңіз."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Құрылғыны мобильдік қызметсіз пайдалану үшін eSIM картасын өшіріңіз."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Құрылығыны мобильдік байланыс қызметінсіз пайдалану үшін eSIM картасын өшіріңіз."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN кодын енгізіңіз"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Кілтсөзді енгізіңіз"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. Толығырақ ақпаратты оператордан алыңыз."</string> diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml index 3bf437992a11..8b516c2bcdc3 100644 --- a/packages/SystemUI/res-keyguard/values-km/strings.xml +++ b/packages/SystemUI/res-keyguard/values-km/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"បានកំណត់ម៉ោងរោទិ៍បន្ទាប់នៅថ្ងៃ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"លុប"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"បិទ eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"មិនអាចបិទ eSIM បានទេ"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"មិនអាចបិទ eSIM បានទេ ដោយសារមានបញ្ហា។"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ភ្លេចលំនាំ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"លំនាំមិនត្រឹមត្រូវទេ"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"គូរលំនាំរបស់អ្នក"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"បញ្ចូលកូដ PIN របស់ស៊ីម។"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"បញ្ចូលកូដ PIN របស់ស៊ីមសម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"។"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"បិទ eSIM ដើម្បីប្រើប្រាស់ឧបករណ៍ដោយមិនចាំបាច់ប្រើសេវាកម្មទិន្នន័យចល័ត។"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> បិទ eSIM ដើម្បីប្រើឧបករណ៍ដោយគ្មានសេវាកម្មទូរសព្ទចល័ត។"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"បញ្ចូលកូដ PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"បញ្ចូលពាក្យសម្ងាត់"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ឥឡូវនេះ ស៊ីមត្រូវបានបិទដំណើរការហើយ។ បញ្ចូលកូដ PUK ដើម្បីបន្ត។ សូមទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string> diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml index 690ce658845c..d14c1a284e6a 100644 --- a/packages/SystemUI/res-keyguard/values-kn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> ಗಂಟೆಗೆ ಮುಂದಿನ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ಅಳಿಸಿ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ದೋಷದ ಕಾರಣದಿಂದಾಗಿ eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ನಮೂದಿಸಿ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ಪ್ಯಾಟರ್ನ್ ಮರೆತಿದ್ದೀರಿ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ಮೊಬೈಲ್ ಸೇವೆ ಇಲ್ಲದೆ ಸಾಧನವನ್ನು ಬಳಸಲು eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ಪಿನ್ ನಮೂದಿಸಿ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ಈಗ ಸಿಮ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml index 1a34229a01af..cd2f0792e6bf 100644 --- a/packages/SystemUI/res-keyguard/values-ko/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g>에 다음 알람이 설정됨"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"삭제"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM 사용 중지"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM을 사용 중지할 수 없음"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"오류로 인해 eSIM을 사용 중지할 수 없습니다."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 키"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"패턴을 잊음"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"잘못된 패턴"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"패턴 그리기"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN을 입력하세요."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN을 입력하세요."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN 입력"</string> <string name="kg_password_instructions" msgid="136952397352976538">"비밀번호 입력"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. 자세한 내용은 이동통신사에 문의하시기 바랍니다."</string> diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml index a4f5b7dcaf6a..f1b6baa379eb 100644 --- a/packages/SystemUI/res-keyguard/values-ky/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Кийинки ойготкуч саат <xliff:g id="ALARM">%1$s</xliff:g> коюлган"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Жок кылуу"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-картаны өчүрүү"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-картаны өчүрүүгө болбойт"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Катадан улам eSIM-картаны өчүрүүгө болбойт."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Киргизүү"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Графикалык ачкычты унутуп калдым"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Графикалык ачкыч туура эмес"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Графикалык ачкычты тартыңыз"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-картанын PIN-кодун киргизиңиз."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM-картасынын PIN-кодун киргизиңиз."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN-кодду киргизиңиз"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Сырсөздү киргизиңиз"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. Анын чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз."</string> diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml index 10a81d03200a..97a5dcf85fb8 100644 --- a/packages/SystemUI/res-keyguard/values-lo/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ລຶບ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"ປິດການໃຊ້ eSIM ແລ້ວ"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ບໍ່ສາມາດປິດການເຮັດວຽກຂອງ eSIM ໄດ້"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ບໍ່ສາມາດປິດການນຳໃຊ້ eSIM ໄດ້ເນື່ອງຈາກມີຂໍ້ຜິດພາດ."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ປ້ອນເຂົ້າ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ລືມຮູບແບບປົດລັອກ?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ຮູບແບບຜິດ"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ປິດການນຳໃຊ້ eSIM ເພື່ອໃຊ້ອຸປະກອນໂດຍບໍ່ຕ້ອງເຊື່ອມຕໍ່ເຄືອຂ່າຍ."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ໃສ່ລະຫັດ PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ໃສ່ລະຫັດຜ່ານ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ຊິມຖືກປິດການນຳໃຊ້ແລ້ວ. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ."</string> diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml index bf041a0912ef..7909ee3e1a7b 100644 --- a/packages/SystemUI/res-keyguard/values-lt/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Kitas nustatytas signalas: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ištrinti"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Išjungti eSIM kortelę"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nepavyko išjungti „eSIM“ kortelės"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Dėl klaidos nepavyko išjungti „eSIM“ kortelės."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pamiršau atrakinimo piešinį"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Netinkamas atrakinimo piešinys"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nupieškite atrakinimo piešinį"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Įveskite SIM kortelės PIN kodą."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Išjungti eSIM kortelę ir naudoti įrenginį be mobiliojo ryšio paslaugos."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Išjunkite eSIM kortelę ir naudokite įrenginį be mobiliojo ryšio paslaugos."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Įveskite PIN kodą"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Įveskite slaptažodį"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Dabar SIM neleidžiama. Jei norite tęsti, įveskite PUK kodą. Jei reikia išsamios informacijos, susisiekite su operatoriumi."</string> diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml index 475e9ce56fbe..137f60aeaee1 100644 --- a/packages/SystemUI/res-keyguard/values-lv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nākamā signāla atskaņošanas laiks: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Dzēšanas taustiņš"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Atspējot eSIM karti"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nevar atspējot eSIM karti"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Kļūdas dēļ nevar atspējot eSIM karti."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Ievadīšanas taustiņš"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Aizmirsu kombināciju"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nepareiza kombinācija."</string> @@ -66,7 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Zīmējiet savu kombināciju."</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ievadiet SIM kartes PIN kodu."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Ievadiet PIN."</string> <string name="kg_password_instructions" msgid="136952397352976538">"Ievadiet paroli"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karte ir atspējota. Lai turpinātu, ievadiet PUK kodu. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru."</string> diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml index 7e12a227bff6..5cc635c0b6b8 100644 --- a/packages/SystemUI/res-keyguard/values-ml/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"അടുത്ത അലാറം <xliff:g id="ALARM">%1$s</xliff:g>-ന് സജ്ജീകരിച്ചു"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ഇല്ലാതാക്കുക"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM പ്രവർത്തനരഹിതമാക്കുക"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ഇ-സിം പ്രവർത്തനരഹിതമാക്കാനാകുന്നില്ല"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"പിശക് കാരണം ഇ-സിം പ്രവർത്തനരഹിതമാക്കാനാകുന്നില്ല"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"എന്റർ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"പാറ്റേൺ മറന്നു"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"പാറ്റേൺ തെറ്റാണ്"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"സിം പിൻ നൽകുക."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> മൊബൈൽ സേവനമില്ലാതെ ഉപകരണം ഉപയോഗിക്കാൻ ഇ-സിം പ്രവർത്തനരഹിതമാക്കുക."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"പിൻ നൽകുക"</string> <string name="kg_password_instructions" msgid="136952397352976538">"പാസ്വേഡ് നൽകുക"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string> diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml index 5f9b63d9f76b..258f8c426bca 100644 --- a/packages/SystemUI/res-keyguard/values-mn/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Дараагийн сэрүүлгийг <xliff:g id="ALARM">%1$s</xliff:g>-д тавьсан"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Устгах"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-г идэвхгүй болгох"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-г идэвхгүй болгох боломжгүй"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Алдаа гарсан тул eSIM-г идэвхгүй болгох боломжгүй байна."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Оруулах"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Загварыг мартсан"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Загвар буруу байна"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Загварыг оруулна уу"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-н ПИН-г оруулна уу."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Төхөөрөмжийг мобайл үйлчилгээгүй ашиглахын тулд eSIM-г идэвхгүй болгоно уу."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Төхөөрөмжийг мобайл үйлчилгээгүйгээр ашиглахын тулд eSIM-г идэвхгүй болгоно уу."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ПИН оруулна уу"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Нууц үг оруулна уу"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM идэвхгүй байна. Үргэлжлүүлэх бол PUK кодыг оруулна уу. Дэлгэрэнгүй мэдээлэл авах бол оператор компанитайгаа холбогдоно уу."</string> diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml index daa40c60d99b..b8d7b4e0b12a 100644 --- a/packages/SystemUI/res-keyguard/values-mr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"पुढील अलार्म <xliff:g id="ALARM">%1$s</xliff:g> साठी सेट केला"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"हटवा"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM बंद करा"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM बंद करू नका"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"एका एररमुळे eSIM बंद होऊ शकत नाही."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"एंटर करा"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पॅटर्न विसरलात"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"चुकीचा पॅटर्न"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"तुमचा पॅटर्न काढा"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन एंटर करा"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवेशिवाय डिव्हाइस वापरण्यासाठी eSIM बंद करा."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"पिन एंटर करा"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड एंटर करा"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम आता अक्षम केले आहे. सुरू ठेवण्यासाठी PUK कोड एंटर करा. तपशीलांसाठी वाहकाशी संपर्क साधा."</string> diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml index d37e7ee141e8..2ee456b26d91 100644 --- a/packages/SystemUI/res-keyguard/values-ms/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Penggera seterusnya ditetapkan pada <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Padam"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Lumpuhkan eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Tidak dapat melumpuhkan eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM tidak dapat dilumpuhkan kerana ralat."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Kekunci Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Terlupa Corak"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Corak salah"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Lukis corak anda"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Kata Laluan"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kini dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk mendapatkan butiran."</string> diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml index 2c0e3d6c4c3a..5d504b38a8a8 100644 --- a/packages/SystemUI/res-keyguard/values-nb/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Neste alarm er stilt inn for <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Slett"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Deaktiver e-SIM-kortet"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Kan ikke deaktivere e-SIM-kortet"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"E-SIM-kortet kan ikke deaktiveres på grunn av en feil."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glemt mønsteret?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Feil mønster"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn mønsteret ditt"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Skriv inn PIN-koden for SIM-kortet."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver e-SIM-kortet for å bruke enheten uten mobiltjeneste."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Skriv inn PIN-koden"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Skriv inn passordet"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string> diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml index dcb309f59d04..8079d702b62d 100644 --- a/packages/SystemUI/res-keyguard/values-ne/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अर्को अलार्म <xliff:g id="ALARM">%1$s</xliff:g> का लागि सेट गरियो"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मेट्नुहोस्"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM लाई असक्षम पार्नुहोस्"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM लाई असक्षम पार्न सकिएन"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"कुनै त्रुटिका कारण यो eSIM लाई असक्षम पार्न सकिएन।"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"प्रविष्टि गर्नुहोस्"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ढाँचा बिर्सनुभयो"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत ढाँचा"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"आफ्नो ढाँचा कोर्नुहोस्"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्ट गर्नुहोस्।"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा बिना यन्त्रको प्रयोग गर्न eSIM लाई असक्षम पार्नुहोस्।"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN प्रविष्टि गर्नुहोस्"</string> <string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड प्रविष्ट गर्नुहोस्"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM कार्ड अहिले असक्षम छ। सुचारु गर्नको लागि PUK कोड प्रविष्ट गर्नुहोस्। विवरणको लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।"</string> diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml index 6aa66dd2ca39..c18b7217a1ec 100644 --- a/packages/SystemUI/res-keyguard/values-nl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Volgende wekker ingesteld voor <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Simkaart uitschakelen"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"E-simkaart kan niet worden uitgeschakeld"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"De e-simkaart kan niet worden uitgeschakeld vanwege een fout."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Patroon vergeten"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Onjuist patroon"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken je patroon"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Geef de pincode van de simkaart op."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Geef je pincode op"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Geef je wachtwoord op"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string> diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml index ddb83e980be7..47282114be25 100644 --- a/packages/SystemUI/res-keyguard/values-pa/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ਅਗਲਾ ਅਲਾਰਮ <xliff:g id="ALARM">%1$s</xliff:g> \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ਮਿਟਾਓ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ਈ-ਸਿਮ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ਕੋਈ ਗੜਬੜ ਹੋਣ ਕਰਕੇ ਈ-ਸਿਮ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ਦਾਖਲ ਕਰੋ"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ਗਲਤ ਪੈਟਰਨ"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ ਈ-ਸਿਮ ਬੰਦ ਕਰੋ।"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ਸਿਮ ਹੁਣ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string> diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml index ee6ad623a742..471289a71f4a 100644 --- a/packages/SystemUI/res-keyguard/values-pl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Następny alarm ustawiony na: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Usuwanie"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Wyłącz eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Nie można wyłączyć karty eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Nie można wyłączyć karty eSIM z powodu błędu."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nie pamiętam wzoru"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nieprawidłowy wzór"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Narysuj wzór"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Wpisz kod PIN karty SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Wyłącz eSIM, by używać urządzenia bez usługi sieci komórkowej."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Wyłącz kartę eSIM, by używać urządzenia bez usługi sieci komórkowej."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Wpisz kod PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Wpisz hasło"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Skontaktuj się z operatorem, by uzyskać więcej informacji."</string> @@ -91,10 +93,10 @@ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string> <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string> <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> - <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> - <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> + <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> + <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string> <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie."</string> diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 73f2b7f1e2a7..3369d456ce89 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -82,7 +82,7 @@ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Demasiadas tentativas para desenhar o padrão"</string> <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Introduziu o PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Introduziu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Desenhou a sua padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este tablet será reposto, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este telemóvel será reposto, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. Este tablet será reposto, o que eliminará todos os dados do mesmo."</string> @@ -95,8 +95,8 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, o perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967"> <item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item> diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml index b69f50241b89..bb74cd3263f7 100644 --- a/packages/SystemUI/res-keyguard/values-sk/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nasledujúci budík je nastavený na <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Odstrániť"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Zakázať eSIM kartu"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM karta sa nedá deaktivovať"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM karta sa nedá deaktivovať, pretože sa vyskytla chyba."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nepamätám si vzor"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Nesprávny vzor"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Nakreslite svoj vzor"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Zadajte PIN pre SIM kartu"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Zakážte eSIM kartu a používajte zariadenie bez mobilnej služby."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zakážte eSIM kartu a používajte zariadenie bez mobilnej služby."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Zadajte kód PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Zadajte heslo"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta je teraz zakázaná. Ak chcete pokračovať, zadajte kód PUK. Podrobné informácie získate od operátora."</string> diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml index cd53c6c67eed..3443d6632467 100644 --- a/packages/SystemUI/res-keyguard/values-sl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naslednji alarm je nastavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbris"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogoči kartico e-SIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Digitalne kartice e-SIM ni mogoče onemogočiti"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Digitalne kartice e-SIM zaradi napake ni mogoče onemogočiti."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Tipka Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pozabljen vzorec"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Napačen vzorec"</string> @@ -67,7 +69,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Narišite vzorec"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Vnesite kodo PIN kartice SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogočite kartico e-SIM, če želite napravo uporabljati brez mobilne storitve."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogočite digitalno kartico e-SIM, če želite napravo uporabljati brez mobilne storitve."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Vnesite kodo PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Vnesite geslo"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Kartica SIM je onemogočena. Če želite nadaljevati, vnesite kodo PUK. Za dodatne informacije se obrnite na operaterja."</string> diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml index 0a55795d0b5e..10b5430dd6fa 100644 --- a/packages/SystemUI/res-keyguard/values-sq/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarmi tjetër i caktuar: <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Fshi"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Çaktivizo kartën eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Karta eSIM nuk mund të çaktivizohet"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Karta eSIM nuk mund të çaktivizohet për shkak të një gabimi."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Dërgo"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Harrova motivin"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Motivi është i gabuar"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Vizato motivin tënd"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Fut kodin PIN të kartës SIM"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Fut kodin PIN të kartës SIM për \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Çaktivizo kartën eSIM për ta përdorur pajisjen pa shërbimin celular."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Çaktivizo kartën eSIM për ta përdorur pajisjen pa shërbimin celular."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Fut kodin PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Fut fjalëkalimin"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM tani është e çaktivizuar. Fut kodin PUK për të vazhduar. Kontakto me operatorin për detaje."</string> diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml index 08db0bd14844..f9d5b77a17b0 100644 --- a/packages/SystemUI/res-keyguard/values-sr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Следећи аларм је подешен за <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Избриши"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Онемогући eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Онемогућавање eSIM-а није успело"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM не може да се онемогући због грешке."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Заборавио/ла сам шаблон"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Погрешан шаблон"</string> @@ -66,7 +68,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте шаблон"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Унесите PIN за SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Онемогућите eSIM да бисте уређај користили без мобилне услуге."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Онемогућите eSIM да бисте уређај користили без мобилне услуге."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Унесите PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Унесите лозинку"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картица је сада онемогућена. Унесите PUK кôд да бисте наставили. Детаљне информације потражите од мобилног оператера."</string> diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml index 54a1d0d1feb9..04c22a67d0a3 100644 --- a/packages/SystemUI/res-keyguard/values-sv/strings.xml +++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nästa alarm är inställt på <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Radera"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Inaktivera eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Det gick inte att inaktivera eSIM-kortet"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Det gick inte att inaktivera eSIM-kortet på grund av ett fel."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retur"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glömt ditt grafiska lösenord?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Fel grafiskt lösenord"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Rita ditt grafiska lösenord"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ange pinkod för SIM-kortet."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Inaktivera eSIM om du vill använda enheten utan mobiltjänst."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inaktivera eSIM om du vill använda enheten utan mobiltjänst."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Ange pinkod"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Ange lösenord"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet har inaktiverats. Du måste ange en PUK-kod innan du kan fortsätta. Kontakta operatören för mer information."</string> diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml index 376c74f29338..5ba5692709fd 100644 --- a/packages/SystemUI/res-keyguard/values-ta/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"அடுத்த அலாரம் <xliff:g id="ALARM">%1$s</xliff:g>க்கு அமைக்கப்பட்டுள்ளது"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"நீக்கும் பொத்தான்"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"இ-சிம்மை முடக்கும்"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMஐ முடக்க முடியவில்லை"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"பிழை ஏற்பட்டதால் eSIMஐ முடக்க முடியவில்லை."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"என்டர் பொத்தான்"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"பேட்டர்ன் நினைவில்லையா"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"தவறான பேட்டர்ன்"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"பேட்டர்னை வரையவும்"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"சிம் பின்னை உள்ளிடவும்."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> மொபைல் சேவை இல்லாமல் சாதனத்தைப் பயன்படுத்த, eSIMஐ முடக்கவும்."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"பின்னை உள்ளிடவும்"</string> <string name="kg_password_instructions" msgid="136952397352976538">"கடவுச்சொல்லை உள்ளிடவும்"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர, PUK குறியீட்டை உள்ளிடவும். விவரங்களுக்கு, தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string> diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml index 934d6a234cee..dce2739cac9c 100644 --- a/packages/SystemUI/res-keyguard/values-te/strings.xml +++ b/packages/SystemUI/res-keyguard/values-te/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"తర్వాత అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"తొలగించు"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMని నిలిపివేయండి"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMని నిలపడం సాధ్యపడదు"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ఎర్రర్ కారణంగా eSIMని నిలపడం సాధ్యపడదు."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"నమూనాను మర్చిపోయాను"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"ఆకృతి తప్పు"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"మీ నమూనాను గీయండి"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM పిన్ని నమోదు చేయండి."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్ని నమోదు చేయండి."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> మొబైల్ సేవ లేకుండా పరికరాన్ని ఉపయోగించడం కోసం eSIMని నిలిపివేయండి."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"పిన్ను నమోదు చేయండి"</string> <string name="kg_password_instructions" msgid="136952397352976538">"పాస్వర్డ్ని నమోదు చేయండి"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ఇప్పుడు SIM నిలిపివేయబడింది. కొనసాగించాలంటే, PUK కోడ్ను నమోదు చేయండి. వివరాల కోసం క్యారియర్ను సంప్రదించండి."</string> diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml index aa33421b2549..ec50fe0f096f 100644 --- a/packages/SystemUI/res-keyguard/values-th/strings.xml +++ b/packages/SystemUI/res-keyguard/values-th/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ตั้งเวลาปลุกครั้งถัดไปไว้ที่ <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ลบ"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"ปิดใช้ซิมอิเล็กทรอนิกส์"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"ปิดใช้ eSIM ไม่ได้"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ปิดใช้ eSIM ไม่ได้เนื่องจากมีข้อผิดพลาด"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ลืมรูปแบบ"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"รูปแบบไม่ถูกต้อง"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"วาดรูปแบบของคุณ"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ป้อน PIN ของซิม"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ปิดใช้ซิมอิเล็กทรอนิกส์เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ปิดใช้ eSIM เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"ป้อน PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"ป้อนรหัสผ่าน"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ซิมการ์ดถูกปิดใช้แล้ว ป้อนรหัส PUK เพื่อดำเนินการต่อ โปรดสอบถามรายละเอียดจากผู้ให้บริการ"</string> diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml index 30657d4457f9..e6204db66714 100644 --- a/packages/SystemUI/res-keyguard/values-tl/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nakatakda ang susunod na alarm sa <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"I-delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"I-disable ang eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Hindi ma-disable ang eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Hindi ma-disable ang eSIM dahil sa isang error."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nakalimutan ang Pattern"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Mali ang Pattern"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Iguhit ang iyong pattern"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ilagay ang PIN ng SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Ilagay ang PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Ilagay ang Password"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Naka-disable na ngayon ang SIM. Ilagay ang PUK code upang magpatuloy. Makipag-ugnayan sa carrier para sa mga detalye."</string> diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml index e716ee488434..d2ba3c93be32 100644 --- a/packages/SystemUI/res-keyguard/values-tr/strings.xml +++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> olarak ayarlandı"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM\'i devre dışı bırak"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM devre dışı bırakılamıyor"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Bir hata nedeniyle eSIM devre dışı bırakılamıyor."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Deseni unuttunuz mu?"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Desen"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Deseninizi çizin"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN kodunu girin."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Cihazı mobil hizmet olmadan kullanmak için eSIM\'i devre dışı bırakın."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN\'i girin"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Şifreyi Girin"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kart artık devre dışı bırakıldı. Devam etmek için PUK kodunu girin. Ayrıntılı bilgi için operatörle bağlantı kurun."</string> diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml index 28a52c0eb613..877e566fd769 100644 --- a/packages/SystemUI/res-keyguard/values-ur/strings.xml +++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"اگلا الارم <xliff:g id="ALARM">%1$s</xliff:g> کیلئے سیٹ ہے"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"حذف کریں"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM غیر فعال کریں"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM کو غیر فعال نہیں کیا جا سکتا"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"ایک خرابی کی وجہ سے eSIM کو غیر فعال نہیں کیا جا سکتا۔"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"درج کریں"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"پیٹرن بھول گئے"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"غلط پیٹرن"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"اپنا پیٹرن ڈرا کریں"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN درج کریں۔"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"PIN درج کریں"</string> <string name="kg_password_instructions" msgid="136952397352976538">"پاسورڈ درج کریں"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string> diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml index d20b87ecbf59..eb2607d980cf 100644 --- a/packages/SystemUI/res-keyguard/values-vi/strings.xml +++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Báo thức tiếp theo được đặt cho <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Xóa"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"Vô hiệu hóa eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"Không thể tắt eSIM"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"Không thể tắt eSIM do lỗi."</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Nhập"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Đã quên hình mở khóa"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"Hình mở khóa sai"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"Vẽ hình mở khóa của bạn"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Nhập mã PIN của SIM."</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Vô hiệu hóa eSIM để sử dụng thiết bị khi không có dịch vụ di động."</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tắt eSIM để sử dụng thiết bị khi không có dịch vụ di động."</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"Nhập mã PIN"</string> <string name="kg_password_instructions" msgid="136952397352976538">"Nhập mật khẩu"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM hiện bị vô hiệu hóa. Hãy nhập mã PUK để tiếp tục. Liên hệ với nhà cung cấp dịch vụ để biết chi tiết."</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml index 8ee5812f36aa..c55f2d5adb4c 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"下一个闹钟时间已设置为<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"删除"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM 卡"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"无法停用 eSIM 卡"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"出现错误,无法停用 eSIM 卡。"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"输入"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘记了图案"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"图案错误"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"绘制您的图案"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"请输入 SIM 卡 PIN 码。"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码。"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"停用 eSIM 卡即可在没有移动服务的情况下使用设备。"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在没有移动服务的情况下使用设备。"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"请输入 PIN 码"</string> <string name="kg_password_instructions" msgid="136952397352976538">"请输入密码"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡现已停用,需要输入 PUK 码才能继续使用。要了解详情,请联系您的运营商。"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml index 5b0754e6e344..07a4f430ca6d 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml @@ -53,6 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"已經將下一個鬧鐘時間設做<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete 鍵 (刪除)"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM"</string> + <string name="error_disable_esim_title" msgid="4852978431156228006">"無法停用 eSIM 卡"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"發生錯誤,因此無法停用此 eSIM 卡。"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵 (輸入)"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘記上鎖圖案"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"上鎖圖案錯誤"</string> @@ -65,7 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出上鎖圖案"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string> - <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"停用 eSIM,即可在沒有流動服務的情況下使用裝置。"</string> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 停用 eSIM 卡,即可在沒有流動服務的情況下使用裝置。"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"輸入 PIN 碼"</string> <string name="kg_password_instructions" msgid="136952397352976538">"輸入密碼"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡現已停用,請輸入 PUK 碼以繼續。詳情請與流動網絡供應商聯絡。"</string> diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml index ee234cc91634..de2f73a5fd6d 100644 --- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml @@ -53,10 +53,8 @@ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"刪除"</string> <string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM 卡"</string> - <!-- no translation found for error_disable_esim_title (4852978431156228006) --> - <skip /> - <!-- no translation found for error_disable_esim_msg (676694908770135639) --> - <skip /> + <string name="error_disable_esim_title" msgid="4852978431156228006">"無法停用 eSIM 卡"</string> + <string name="error_disable_esim_msg" msgid="676694908770135639">"發生錯誤,因此無法停用 eSIM 卡。"</string> <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵"</string> <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘記解鎖圖案"</string> <string name="kg_wrong_pattern" msgid="7620081431514773802">"解鎖圖案錯誤"</string> @@ -69,8 +67,7 @@ <string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出解鎖圖案"</string> <string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string> <string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string> - <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) --> - <skip /> + <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在沒有行動服務的情況下使用裝置。"</string> <string name="kg_pin_instructions" msgid="4069609316644030034">"輸入 PIN 碼"</string> <string name="kg_password_instructions" msgid="136952397352976538">"輸入密碼"</string> <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡已遭停用,輸入 PUK 碼即可繼續使用。如需瞭解詳情,請與電信業者聯絡。"</string> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 4934e147e42b..1c1c7579b8ad 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -60,8 +60,8 @@ <dimen name="widget_horizontal_padding">8dp</dimen> <dimen name="widget_icon_size">16dp</dimen> <dimen name="widget_icon_padding">8dp</dimen> - <!-- Dash between notification shelf and date/alarm --> - <dimen name="widget_bottom_separator_padding">29dp</dimen> + <!-- Space between notification shelf and dash above it --> + <dimen name="widget_bottom_separator_padding">28dp</dimen> <!-- The y translation to apply at the start in appear animations. --> <dimen name="appear_y_translation_start">32dp</dimen> diff --git a/packages/SystemUI/res/color/white_disabled.xml b/packages/SystemUI/res/color/white_disabled.xml new file mode 100644 index 000000000000..617e2321dc59 --- /dev/null +++ b/packages/SystemUI/res/color/white_disabled.xml @@ -0,0 +1,20 @@ +<?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. +--> + +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="@android:color/white" + android:alpha="?android:attr/disabledAlpha" /> +</selector> diff --git a/packages/SystemUI/res/drawable/brightness_mirror_background.xml b/packages/SystemUI/res/drawable/brightness_mirror_background.xml index b3a04841e64f..43c9b73a6eff 100644 --- a/packages/SystemUI/res/drawable/brightness_mirror_background.xml +++ b/packages/SystemUI/res/drawable/brightness_mirror_background.xml @@ -16,4 +16,5 @@ --> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@color/qs_background_dark" /> + <corners android:radius="8dp" /> </shape> diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml new file mode 100644 index 000000000000..45d8dc109330 --- /dev/null +++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml @@ -0,0 +1,37 @@ +<?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. +--> +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:id="@android:id/background" + android:gravity="center_vertical|fill_horizontal"> + <shape android:shape="rectangle" + android:tint="?android:attr/colorControlActivated"> + <size android:height="@dimen/seek_bar_height" /> + <solid android:color="@color/white_disabled" /> + <corners android:radius="@dimen/seek_bar_corner_radius" /> + </shape> + </item> + <item android:id="@android:id/progress" + android:gravity="center_vertical|fill_horizontal"> + <scale android:scaleWidth="100%"> + <shape android:shape="rectangle" + android:tint="?android:attr/colorControlActivated"> + <size android:height="@dimen/seek_bar_height" /> + <solid android:color="@android:color/white" /> + <corners android:radius="@dimen/seek_bar_corner_radius" /> + </shape> + </scale> + </item> +</layer-list> diff --git a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml index beedcbbe8c52..8281836eaf41 100644 --- a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml +++ b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml @@ -14,14 +14,14 @@ Copyright (C) 2017 The Android Open Source Project limitations under the License. --> <vector xmlns:android="http://schemas.android.com/apk/res/android" - android:width="28.0dp" - android:height="28.0dp" + android:width="24dp" + android:height="24dp" android:viewportWidth="24.0" android:viewportHeight="24.0"> <path android:pathData="m18.250000,12.000000a6.250000,6.250000 0.000000,1.000000 1.000000,-12.500000 0.000000,6.250000 6.250000,0.000000 1.000000,1.000000 12.500000,0.000000z" - android:fillColor="?android:attr/colorPrimary" /> + android:fillColor="@android:color/transparent" /> <path android:pathData="M20,8.69L20,5c0,-0.55 -0.45,-1 -1,-1h-3.69l-2.6,-2.6a0.996,0.996 0,0 0,-1.41 0L8.69,4L5,4c-0.55,0 -1,0.45 -1,1v3.69l-2.6,2.6a0.996,0.996 0,0 0,0 1.41L4,15.3L4,19c0,0.55 0.45,1 1,1h3.69l2.6,2.6c0.39,0.39 1.02,0.39 1.41,0l2.6,-2.6L19,20c0.55,0 1,-0.45 1,-1v-3.69l2.6,-2.6a0.996,0.996 0,0 0,0 -1.41L20,8.69zM12,18.08c-3.36,0 -6.08,-2.73 -6.08,-6.08S8.64,5.92 12,5.92s6.08,2.73 6.08,6.08 -2.72,6.08 -6.08,6.08zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z" - android:fillColor="?android:attr/colorControlNormal" /> + android:fillColor="?android:attr/colorControlActivated" /> </vector> diff --git a/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml b/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml new file mode 100644 index 000000000000..8d03ce77f139 --- /dev/null +++ b/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle"> + <solid android:color="@*android:color/material_grey_200" /> + <corners + android:bottomLeftRadius="@dimen/corner_size" + android:topLeftRadius="0dp" + android:bottomRightRadius="@dimen/corner_size" + android:topRightRadius="0dp" + /> +</shape> diff --git a/packages/SystemUI/res/layout/brightness_mirror.xml b/packages/SystemUI/res/layout/brightness_mirror.xml index d6e75074d79c..e3440b53d215 100644 --- a/packages/SystemUI/res/layout/brightness_mirror.xml +++ b/packages/SystemUI/res/layout/brightness_mirror.xml @@ -14,19 +14,19 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License --> -<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" +<FrameLayout + xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/brightness_mirror" android:layout_width="@dimen/qs_panel_width" - android:layout_height="wrap_content" + android:layout_height="@dimen/brightness_mirror_height" android:layout_gravity="@integer/notification_panel_layout_gravity" android:visibility="invisible"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@drawable/brightness_mirror_background" - android:elevation="2dp"> - <include layout="@layout/quick_settings_brightness_dialog" - android:layout_width="match_parent" - android:layout_height="wrap_content"/> + android:layout_marginLeft="@dimen/notification_side_paddings" + android:layout_marginRight="@dimen/notification_side_paddings" + android:background="@drawable/brightness_mirror_background"> + <include layout="@layout/quick_settings_brightness_dialog" /> </FrameLayout> </FrameLayout> diff --git a/packages/SystemUI/res/layout/output_chooser.xml b/packages/SystemUI/res/layout/output_chooser.xml deleted file mode 100644 index b9f7b152ecac..000000000000 --- a/packages/SystemUI/res/layout/output_chooser.xml +++ /dev/null @@ -1,70 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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. ---> -<!-- extends LinearLayout --> -<com.android.systemui.HardwareUiLayout - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_marginBottom="0dp" - android:clipToPadding="false" - android:theme="@style/qs_theme" - android:clipChildren="false"> - <com.android.systemui.volume.OutputChooserLayout - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:sysui="http://schemas.android.com/apk/res-auto" - android:id="@+id/output_chooser" - android:layout_width="@dimen/output_chooser_panel_width" - android:layout_height="@dimen/output_chooser_panel_width" - android:layout_gravity="center_vertical|end" - android:orientation="vertical" - android:translationZ="8dp" - android:padding="20dp" > - - <TextView - android:id="@+id/title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textDirection="locale" - android:textAppearance="@style/TextAppearance.QS.DetailHeader" - android:layout_marginBottom="20dp" /> - - <com.android.systemui.qs.AutoSizingList - android:id="@android:id/list" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:orientation="vertical" - sysui:itemHeight="@dimen/qs_detail_item_height" - style="@style/AutoSizingList"/> - - <LinearLayout - android:id="@android:id/empty" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:layout_gravity="center" - android:gravity="center" - android:orientation="vertical"> - - <TextView - android:id="@+id/empty_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textDirection="locale" - android:layout_marginTop="20dp" - android:textAppearance="@style/TextAppearance.QS.DetailEmpty"/> - </LinearLayout> - </com.android.systemui.volume.OutputChooserLayout> -</com.android.systemui.HardwareUiLayout> diff --git a/packages/SystemUI/res/layout/output_chooser_item.xml b/packages/SystemUI/res/layout/output_chooser_item.xml deleted file mode 100644 index c3ddbbe83dd7..000000000000 --- a/packages/SystemUI/res/layout/output_chooser_item.xml +++ /dev/null @@ -1,72 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - Copyright (C) 2017 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:layout_width="match_parent" - android:layout_height="wrap_content" - android:minHeight="@dimen/qs_detail_item_height" - android:background="@drawable/btn_borderless_rect" - android:clickable="true" - android:focusable="true" - android:gravity="center_vertical" - android:orientation="horizontal" > - - <ImageView - android:id="@android:id/icon" - android:layout_width="@dimen/qs_detail_item_icon_width" - android:layout_height="@dimen/qs_detail_item_icon_size" - android:layout_marginStart="@dimen/qs_detail_item_icon_marginStart" - android:layout_marginEnd="@dimen/qs_detail_item_icon_marginEnd" - android:background="?android:selectableItemBackgroundBorderless" - android:tint="?android:attr/textColorPrimary"/> - - <LinearLayout - android:layout_width="0dp" - android:layout_height="wrap_content" - android:layout_marginStart="12dp" - android:layout_weight="1" - android:orientation="vertical" > - - <TextView - android:id="@android:id/title" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textDirection="locale" - android:ellipsize="end" - android:textAppearance="@style/TextAppearance.QS.DetailItemPrimary" /> - - <TextView - android:id="@android:id/summary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:textDirection="locale" - android:layout_marginTop="2dp" - android:textAppearance="@style/TextAppearance.QS.DetailItemSecondary" /> - </LinearLayout> - - <ImageView - android:id="@android:id/icon2" - style="@style/QSBorderlessButton" - android:layout_width="48dp" - android:layout_height="48dp" - android:layout_marginStart="30dp" - android:clickable="true" - android:focusable="true" - android:scaleType="center" - android:contentDescription="@*android:string/media_route_controller_disconnect" - android:tint="?android:attr/textColorPrimary" /> - -</LinearLayout> diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml index 080f553e123e..2efae71103f5 100644 --- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml +++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml @@ -15,8 +15,9 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:systemui="http://schemas.android.com/apk/res-auto" - android:layout_height="48dp" + android:layout_height="wrap_content" android:layout_width="match_parent" + android:layout_gravity="center_vertical" android:paddingLeft="16dp" android:paddingRight="16dp" style="@style/BrightnessDialogContainer"> @@ -34,7 +35,7 @@ <com.android.systemui.settings.ToggleSliderView android:id="@+id/brightness_slider" android:layout_width="0dp" - android:layout_height="wrap_content" + android:layout_height="48dp" android:layout_gravity="center_vertical" android:layout_weight="1" android:contentDescription="@string/accessibility_brightness" diff --git a/packages/SystemUI/res/layout/quick_settings_header.xml b/packages/SystemUI/res/layout/quick_settings_header.xml deleted file mode 100644 index 43197c400139..000000000000 --- a/packages/SystemUI/res/layout/quick_settings_header.xml +++ /dev/null @@ -1,33 +0,0 @@ -<?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 - --> -<com.android.systemui.qs.QSTooltipView - xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="@dimen/qs_header_tooltip_height" - android:alpha="0" - android:gravity="center_horizontal|bottom" - android:visibility="invisible"> - - <TextView - android:id="@+id/header_text" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/quick_settings_header_onboarding_text" - android:textAppearance="@style/TextAppearance.QS.TileLabel" - android:textColor="?android:attr/colorAccent" /> - -</com.android.systemui.qs.QSTooltipView> diff --git a/packages/SystemUI/res/layout/quick_settings_header_info.xml b/packages/SystemUI/res/layout/quick_settings_header_info.xml new file mode 100644 index 000000000000..89d6e99aa4b7 --- /dev/null +++ b/packages/SystemUI/res/layout/quick_settings_header_info.xml @@ -0,0 +1,58 @@ +<?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 + --> +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/header_text_container" + android:layout_width="match_parent" + android:layout_height="@dimen/qs_header_tooltip_height" + android:layout_below="@id/quick_status_bar_system_icons" + android:layout_marginTop="12dp"> + + <TextView + android:id="@+id/long_press_tooltip" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal|bottom" + android:alpha="0" + android:text="@string/quick_settings_header_onboarding_text" + android:textAppearance="@style/TextAppearance.QS.TileLabel" + android:textColor="?android:attr/colorAccent" + android:visibility="invisible" /> + + <LinearLayout + android:id="@+id/next_alarm" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center_horizontal|bottom" + android:gravity="center_vertical" + android:visibility="invisible"> + + <ImageView + android:layout_width="@dimen/qs_header_alarm_icon_size" + android:layout_height="@dimen/qs_header_alarm_icon_size" + android:src="@drawable/stat_sys_alarm" + android:tint="?android:attr/textColorPrimary" /> + + <TextView + android:id="@+id/next_alarm_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/qs_header_alarm_text_margin_start" + android:textAppearance="@style/TextAppearance.QS.TileLabel" /> + + </LinearLayout> + +</FrameLayout> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index cc79d0d9b7dd..959247ee76e7 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -32,8 +32,13 @@ android:elevation="4dp" > <include layout="@layout/quick_status_bar_header_system_icons" /> + + <!-- Status icons within the panel itself (and not in the top-most status bar) --> <include layout="@layout/quick_qs_status_icons" /> + <!-- Layout containing tooltips, alarm text, etc. --> + <include layout="@layout/quick_settings_header_info" /> + <com.android.systemui.qs.QuickQSPanel android:id="@+id/quick_qs_panel" android:layout_width="match_parent" diff --git a/packages/SystemUI/res/layout/status_bar_toggle_slider.xml b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml index 062e6cb0334a..942f3dd03a8d 100644 --- a/packages/SystemUI/res/layout/status_bar_toggle_slider.xml +++ b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml @@ -16,10 +16,7 @@ --> <!-- android:background="@drawable/status_bar_closed_default_background" --> -<merge - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui" - > +<merge xmlns:android="http://schemas.android.com/apk/res/android"> <CheckBox android:id="@+id/toggle" android:layout_width="48dp" @@ -44,6 +41,7 @@ android:paddingTop="16dp" android:paddingBottom="16dp" android:thumb="@drawable/ic_brightness_thumb" + android:progressDrawable="@drawable/brightness_progress_drawable" android:splitTrack="false" /> <TextView diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 803659f9c7ae..b6d241ba3f96 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -23,79 +23,70 @@ <!-- right-aligned to be physically near volume button --> <LinearLayout android:id="@+id/volume_dialog" + android:minWidth="@dimen/volume_dialog_panel_width" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical|right" - android:minWidth="@dimen/volume_dialog_panel_width" android:background="@android:color/transparent" android:layout_margin="@dimen/volume_dialog_base_margin" android:orientation="vertical" android:clipChildren="false" > + <FrameLayout + android:id="@+id/ringer" + android:layout_width="@dimen/volume_dialog_ringer_size" + android:layout_height="@dimen/volume_dialog_ringer_size" + android:layout_marginBottom="@dimen/volume_dialog_spacer" + android:elevation="@dimen/volume_panel_elevation" + android:layout_gravity="right" + android:background="@drawable/rounded_bg_full"> + <com.android.keyguard.AlphaOptimizedImageButton + android:id="@+id/ringer_icon" + style="@style/VolumeButtons" + android:background="?android:selectableItemBackgroundBorderless" + android:layout_width="@dimen/volume_dialog_tap_target_size" + android:layout_height="@dimen/volume_dialog_tap_target_size" + android:tint="@color/accent_tint_color_selector" + android:layout_gravity="center" + android:soundEffectsEnabled="false" /> + + <include layout="@layout/volume_dnd_icon"/> + </FrameLayout> + <LinearLayout - android:id="@+id/volume_dialog_rows" + android:id="@+id/main" android:layout_width="wrap_content" + android:minWidth="@dimen/volume_dialog_panel_width" android:layout_height="wrap_content" + android:orientation="vertical" android:clipChildren="false" android:clipToPadding="false" android:background="@drawable/rounded_bg_full" - android:translationZ="@dimen/volume_panel_elevation" - android:orientation="horizontal" > - <!-- volume rows added and removed here! :-) --> - </LinearLayout> - - <FrameLayout - android:id="@+id/footer" - android:layout_width="@dimen/volume_dialog_panel_width" - android:layout_height="@dimen/volume_dialog_panel_width" - android:layout_marginTop="6dp" - android:layout_marginBottom="6dp" - android:layout_below="@id/volume_dialog_rows" - android:background="@drawable/rounded_bg_full"> - + android:elevation="@dimen/volume_panel_elevation" > <LinearLayout - android:id="@+id/footer_linear_layout" - android:layout_width="match_parent" - android:layout_height="match_parent" - android:clipChildren="false" - android:clipToPadding="false" + android:id="@+id/volume_dialog_rows" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:minWidth="@dimen/volume_dialog_panel_width" android:gravity="center" - android:layout_gravity="end" - android:translationZ="@dimen/volume_panel_elevation" - android:clickable="true" - android:orientation="vertical" > - - <TextView - android:id="@+id/ringer_title" - android:text="@string/ring_toggle_title" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:ellipsize="end" - android:maxLines="1" - android:layout_centerVertical="true" - android:textColor="?android:attr/colorControlNormal" - android:textAppearance="@style/TextAppearance.Volume.Header" /> - + android:orientation="horizontal" > + <!-- volume rows added and removed here! :-) --> + </LinearLayout> + <FrameLayout + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:background="@drawable/rounded_bg_bottom_background"> <com.android.keyguard.AlphaOptimizedImageButton - android:id="@+id/ringer_icon" - style="@style/VolumeButtons" + android:id="@+id/settings" + android:src="@drawable/ic_settings" + android:layout_width="@dimen/volume_dialog_tap_target_size" + android:layout_height="@dimen/volume_dialog_tap_target_size" + android:layout_gravity="center" android:background="?android:selectableItemBackgroundBorderless" - android:layout_width="@dimen/volume_dialog_panel_width" - android:layout_height="@dimen/volume_button_size" - android:tint="@color/accent_tint_color_selector" + android:tint="#8A000000" android:soundEffectsEnabled="false" /> + </FrameLayout> + </LinearLayout> - <TextView - android:id="@+id/ringer_status" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:ellipsize="end" - android:maxLines="1" - android:textColor="?android:attr/colorControlNormal" - android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" /> - </LinearLayout> - - <include layout="@layout/volume_dnd_icon"/> - </FrameLayout> </LinearLayout> </com.android.systemui.volume.VolumeUiLayout>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index fb9355ad061b..def6f6b5f701 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -18,78 +18,37 @@ android:tag="row" android:layout_height="wrap_content" android:layout_width="@dimen/volume_dialog_panel_width" - android:clipChildren="true" - android:clipToPadding="true" + android:clipChildren="false" + android:clipToPadding="false" android:theme="@style/qs_theme"> <LinearLayout - android:layout_height="match_parent" + android:layout_height="wrap_content" android:layout_width="match_parent" - android:layout_marginTop="10dp" - android:layout_marginBottom="10dp" + android:layout_marginTop="@dimen/volume_dialog_slider_margin_top" android:gravity="center" + android:layout_gravity="center" android:orientation="vertical" > - - <LinearLayout - android:orientation="vertical" + <TextView + android:id="@+id/volume_row_header" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="center" - android:padding="5dp"> - <TextView - android:id="@+id/volume_row_header" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:ellipsize="end" - android:maxLength="10" - android:maxLines="1" - android:textColor="?android:attr/colorControlNormal" - android:textAppearance="@style/TextAppearance.Volume.Header" /> - <LinearLayout - android:id="@+id/output_chooser" - android:orientation="vertical" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:minWidth="48dp" - android:minHeight="48dp" - android:paddingTop="10dp" - android:background="?android:selectableItemBackgroundBorderless" - android:gravity="center"> - <TextView - android:id="@+id/volume_row_connected_device" - android:visibility="gone" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:maxLength="10" - android:ellipsize="end" - android:maxLines="1" - android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" /> - <com.android.keyguard.AlphaOptimizedImageButton - android:id="@+id/output_chooser_button" - android:layout_width="24dp" - android:layout_height="24dp" - android:background="?android:selectableItemBackgroundBorderless" - android:contentDescription="@string/accessibility_output_chooser" - style="@style/VolumeButtons" - android:clickable="false" - android:layout_centerVertical="true" - android:src="@drawable/ic_swap" - android:soundEffectsEnabled="false"/> - </LinearLayout> - </LinearLayout> + android:ellipsize="end" + android:maxLength="10" + android:maxLines="1" + android:visibility="gone" + android:textColor="?android:attr/colorControlNormal" + android:textAppearance="@style/TextAppearance.Volume.Header" /> <FrameLayout android:id="@+id/volume_row_slider_frame" - android:padding="0dp" - android:layout_width="@dimen/volume_dialog_panel_width" + android:layout_width="match_parent" android:layoutDirection="rtl" - android:layout_height="@dimen/volume_dialog_panel_width"> + android:layout_height="@dimen/volume_dialog_slider_height"> <SeekBar android:id="@+id/volume_row_slider" android:clickable="true" - android:padding="0dp" - android:layout_margin="0dp" - android:layout_width="@dimen/volume_dialog_panel_width" - android:layout_height="@dimen/volume_dialog_panel_width" + android:layout_width="@dimen/volume_dialog_slider_height" + android:layout_height="match_parent" android:layoutDirection="rtl" android:layout_gravity="center" android:rotation="90" /> @@ -98,10 +57,10 @@ <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/volume_row_icon" style="@style/VolumeButtons" - android:padding="10dp" - android:layout_width="@dimen/volume_button_size" - android:layout_height="@dimen/volume_button_size" + android:layout_width="@dimen/volume_dialog_tap_target_size" + android:layout_height="@dimen/volume_dialog_tap_target_size" android:background="?android:selectableItemBackgroundBorderless" + android:tint="@color/accent_tint_color_selector" android:soundEffectsEnabled="false" /> </LinearLayout> diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index 9d090ba744c2..f37cf3eb7291 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"maak kamera oop"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Kies nuwe taakuitleg"</string> <string name="cancel" msgid="6442560571259935130">"Kanselleer"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Programikoon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Hulpboodskapgebied"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Nageregkas"</string> <string name="start_dreams" msgid="5640361424498338327">"Sluimerskerm"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Moenie Steur Nie"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Net prioriteit"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Net wekkers"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi af"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi is aan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen Wi-Fi-netwerke beskikbaar nie"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wekker"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Saai uit"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Saai tans uit"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Onbenoemde toestel"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is in veiligmodus gedeaktiveer."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vee alles uit"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trek hier om verdeelde skerm te gebruik"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swiep op om programme te wissel"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Verdeel horisontaal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verdeel vertikaal"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Verdeel gepasmaak"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Wissel uitvoertoestel"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skerm is vasgespeld"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Tuis om dit te ontspeld."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Oorsig om dit te ontspeld."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Tuis om dit te ontspeld."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Raak en hou die Terug- en Oorsig-knoppie om hierdie skerm te ontspeld"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Raak en hou die Terug- en Tuis-knoppie om hierdie skerm te ontspeld"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Het dit"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nee, dankie"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skerm is vasgespeld"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skerm is ontspeld"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Versteek <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Dit sal verskyn die volgende keer wanneer jy dit in instellings aanskakel."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Versteek"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om op vibreer te stel."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te demp."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volumekontroles word gewys. Swiep na bo om toe te maak."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumekontroles is versteek"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volumekontroles"</string> <string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string> <string name="output_calls_title" msgid="8717692905017206161">"Foonoproep-uitvoer"</string> <string name="output_none_found" msgid="5544982839808921091">"Geen toestelle gekry nie"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Knipbord"</item> <item msgid="5742013440802239414">"Sleutelkode"</item> - <item msgid="8802889973626281575">"Sleutelbordwisselaar"</item> - <item msgid="7095517796293767867">"Rotasievoorstel"</item> - <item msgid="8494159969042135235">"Geen"</item> + <item msgid="1951959982985094069">"Draaibevestiging, sleutelbordwisselaar"</item> + <item msgid="8175437057325747277">"Geen"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normaal"</item> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index cf1adf2d9a7d..4898e7885d81 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ካሜራ ክፈት"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string> <string name="cancel" msgid="6442560571259935130">"ይቅር"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"የመተግበሪያ አዶ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"የእገዛ መልዕክት አካባቢ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"የማወራረጃ ምግቦች መያዣ"</string> <string name="start_dreams" msgid="5640361424498338327">"የማያ ገጽ ማቆያ"</string> <string name="ethernet_label" msgid="7967563676324087464">"ኤተርኔት"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"አትረብሽ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ቅድሚያ የሚሰጠው ብቻ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ማንቂያዎች ብቻ"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ጠፍቷል"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ማንቂያ"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> በጥንቃቄ ሁነታ ውስጥ ታግዷል።"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ሁሉንም አጽዳ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"የተከፈለ ማያ ገጽን ለመጠቀም እዚህ ላይ ይጎትቱ"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"አግድም ክፈል"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ቁልቁል ክፈል"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"በብጁ ክፈል"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"የውጽዓት መሣሪያን ይቀይሩ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ማያ ገጽ ተሰክቷል"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና አጠቃላይ ዕይታ የሚለውን ይጫኑ እና ይያዙ።"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና መነሻ የሚለውን ይንኩ እና ይያዙ።"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል አጠቃላይ ዕይታ ተጭነው ይያዙ።"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል መነሻ የሚለውን ይንኩ እና ይያዙ።"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ይህን ማያ ገጽ ለመንቀል ተመለስ እና አጠቃላይ ዕይታ አዝራሮችን ይንኩ እና ይያዙ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ይህን ማያ ገጽ ለመንቀል ተመለስ እና መነሻ የሚለውን ይንኩ እና ይያዙ"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ገባኝ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"አይ፣ አመሰግናለሁ"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"ማያ ገጽ ተሰክቷል"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"ማያ ገጽ ተነቅሏል"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ይደበቅ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"በቅንብሮች ውስጥ በሚቀጥለው ጊዜ እንዲበራ በሚያደርጉበት ጊዜ ዳግመኛ ብቅ ይላል።"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ደብቅ"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ።"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ።"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"የ%s ድምጽ መቆጣጠሪያዎች ይታያሉ። ለማሰናበት ወደ ላይ ያንሸራትቱ።"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"የድምጽ መቆጣጠሪያዎች ተደብቀዋል"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s የድምፅ መቆጣጠሪያዎች"</string> <string name="output_title" msgid="5355078100792942802">"የሚዲያ ውጽዓት"</string> <string name="output_calls_title" msgid="8717692905017206161">"የስልክ ጥሪ ውፅዓት"</string> <string name="output_none_found" msgid="5544982839808921091">"ምንም መሣሪያዎች አልተገኙም"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"የቅንጥብ ሰሌዳ"</item> <item msgid="5742013440802239414">"የቁልፍ ኮድ"</item> - <item msgid="8802889973626281575">"የቁልፍ ሰሌዳ መቀየሪያ"</item> - <item msgid="7095517796293767867">"የማዞር አስተያየት ጥቆማ"</item> - <item msgid="8494159969042135235">"ምንም"</item> + <item msgid="1951959982985094069">"ማሽከርከር ያረጋግጡ፣ ቁልፍ ሰሌዳ መቀየሪያ"</item> + <item msgid="8175437057325747277">"ምንም የለም"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"መደበኛ"</item> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 1087b991f5a5..93ea258ac10f 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -107,12 +107,11 @@ <string name="camera_label" msgid="7261107956054836961">"فتح الكاميرا"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"تحديد تنسيق جديد للمهمة"</string> <string name="cancel" msgid="6442560571259935130">"إلغاء"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"رمز التطبيق"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"منطقة رسالة المساعدة"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"زر تكبير/تصغير للتوافق."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"استخدام التكبير/التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"تم توصيل البلوتوث."</string> @@ -283,6 +282,8 @@ <string name="dessert_case" msgid="1295161776223959221">"حالة الحلويات"</string> <string name="start_dreams" msgid="5640361424498338327">"شاشة التوقف"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"عدم الإزعاج"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"الأولوية فقط"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"التنبيهات فقط"</string> @@ -319,6 +320,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"إيقاف Wi-Fi"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"تم تشغيل Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"لا تتوفر أي شبكة Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"تنبيه"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"إرسال"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"جارٍ الإرسال"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"جهاز لا يحمل اسمًا"</string> @@ -335,9 +337,15 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"جارٍ الاتصال..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"النطاق"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطة اتصال"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"جارٍ تفعيل نقطة الاتصال…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="zero">%d جهاز</item> + <item quantity="two">جهازان (%d)</item> + <item quantity="few">%d أجهزة</item> + <item quantity="many">%d جهازًا</item> + <item quantity="other">%d جهاز</item> + <item quantity="one">جهاز واحد (%d)</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"الإشعارات"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"الفلاش"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"بيانات الجوّال"</string> @@ -347,10 +355,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> مستخدَمة"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"قيد <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"تحذير <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"الملف الشخصي للعمل"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"الإشعارات والتطبيقات غير مفعّلة"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"إضاءة ليلية"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"تفعيل عند غروب الشمس"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"حتى شروق الشمس"</string> @@ -368,8 +374,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"تم تعطيل <xliff:g id="APP">%s</xliff:g> في الوضع الآمن."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"مسح الكل"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"اسحب هنا لاستخدام وضع تقسيم الشاشة"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسيم أفقي"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسيم رأسي"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"تقسيم مخصص"</string> @@ -510,11 +514,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"إيقاف التشغيل الآن"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"توسيع"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"تصغير"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"تبديل جهاز الاستماع"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"تم تثبيت الشاشة"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"الشاشة الرئيسية\" لإزالة التثبيت."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"نظرة عامة\" لإزالة التثبيت."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"الشاشة الرئيسية\" لإزالة التثبيت."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"لإزالة تثبيت هذه الشاشة، يمكنك أن تلمس مع الاستمرار زرّي \"رجوع\" و\"نظرة عامة\"."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"لإزالة تثبيت هذه الشاشة، يمكنك أن تلمس مع الاستمرار زرّي \"رجوع\" و\"الشاشة الرئيسية\"."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"حسنًا"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"لا، شكرًا"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"تمّ تثبيت الشاشة."</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"تمَت إزالة تثبيت الشاشة."</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"هل تريد إخفاء <xliff:g id="TILE_LABEL">%1$s</xliff:g>؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"سيظهر مرة أخرى عند تمكينه في الإعدادات المرة التالية."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"إخفاء"</string> @@ -537,8 +548,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. انقر للتجاهل. قد يتم تجاهل خدمات إمكانية الوصول."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. انقر للتعيين على الاهتزاز."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. انقر لكتم الصوت."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"تم عرض %s عنصر تحكم في مستوى الصوت. يمكنك التمرير سريعًا لأعلى للتجاهل."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"تم إخفاء عناصر التحكم في مستوى الصوت"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s عنصر للتحكم في مستوى الصوت"</string> <string name="output_title" msgid="5355078100792942802">"إخراج الوسائط"</string> <string name="output_calls_title" msgid="8717692905017206161">"إخراج المكالمة الهاتفية"</string> <string name="output_none_found" msgid="5544982839808921091">"لم يتم العثور على أي أجهزة."</string> @@ -594,8 +604,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"باستخدام عناصر التحكم في إشعار التشغيل، يمكنك تعيين مستوى الأهمية من 0 إلى 5 لإشعارات التطبيق. \n\n"<b>"المستوى 5"</b>" \n- العرض أعلى قائمة الإشعارات \n- يسمح بمقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 4"</b>" \n- منع مقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 3"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n\n"<b>"المستوى 2"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات واهتزاز \n\n"<b>"المستوى 1"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات أو اهتزاز أبدًا \n- الإخفاء من شاشة التأمين وشريط الحالة \n- العرض أسفل قائمة الإشعارات \n\n"<b>"المستوى 0"</b>" \n- حظر جميع الإشعارات من التطبيق"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"الإشعارات"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"لن تتلقى هذه الإشعارات بعد الآن."</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"الاستمرار في تلقّي الإشعارات"</string> @@ -697,9 +706,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"الحافظة"</item> <item msgid="5742013440802239414">"رمز المفتاح"</item> - <item msgid="8802889973626281575">"مفتاح تبديل لوحة المفاتيح"</item> - <item msgid="7095517796293767867">"اقتراح حول أزرار التنقل"</item> - <item msgid="8494159969042135235">"بدون"</item> + <item msgid="1951959982985094069">"تأكيد التدوير، مفتاح تبديل لوحة المفاتيح"</item> + <item msgid="8175437057325747277">"بدون"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"عادي"</item> diff --git a/packages/SystemUI/res/values-as-land/strings.xml b/packages/SystemUI/res/values-as-land/strings.xml new file mode 100644 index 000000000000..70b0e1daccd3 --- /dev/null +++ b/packages/SystemUI/res/values-as-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="toast_rotation_locked" msgid="7609673011431556092">"স্ক্ৰীণখন এতিয়া লেণ্ডস্কেপ স্ক্ৰীণৰ দিশত লক কৰা অৱস্থাত আছে"</string> +</resources> diff --git a/packages/SystemUI/res/values-as/config.xml b/packages/SystemUI/res/values-as/config.xml new file mode 100644 index 000000000000..5309563e3986 --- /dev/null +++ b/packages/SystemUI/res/values-as/config.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2009, 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. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> +</resources> diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml new file mode 100644 index 000000000000..e2ac57409b50 --- /dev/null +++ b/packages/SystemUI/res/values-as/strings.xml @@ -0,0 +1,1202 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2009, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7164937344850004466">"ছিষ্টেম ইউআই"</string> + <string name="status_bar_clear_all_button" msgid="7774721344716731603">"মচক"</string> + <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"সূচীৰ পৰা আঁতৰাওক"</string> + <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"এপ্ সম্পৰ্কীয় তথ্য"</string> + <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপোনাৰ শেহতীয়া স্ক্ৰীণ ইয়াত প্ৰকট হ\'ব"</string> + <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"শেহতীয়া এপসমূহক আঁতৰাওক"</string> + <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> + <item quantity="one">%d খন স্ক্ৰীণ অৱলোকনত আছে</item> + <item quantity="other">%d খন স্ক্ৰীণ অৱলোকনত আছে</item> + </plurals> + <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো জাননী নাই"</string> + <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলিত"</string> + <string name="status_bar_latest_events_title" msgid="6594767438577593172">"জাননীসমূহ"</string> + <string name="battery_low_title" msgid="6456385927409742437">"বেটাৰি কম আছে"</string> + <!-- no translation found for battery_low_title_hybrid (6268991275887381595) --> + <skip /> + <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে"</string> + <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) --> + <skip /> + <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) --> + <skip /> + <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> + <skip /> + <string name="invalid_charger" msgid="4549105996740522523">"ইউএছবি চ্চার্জিং কৰিব পৰা নাযাব।\nআপোনাৰ ফ\'নৰ লগত দিয়া চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string> + <string name="invalid_charger_title" msgid="3515740382572798460">"ইউএছবি চ্চার্জিং সমৰ্থিত নহয়।"</string> + <string name="invalid_charger_text" msgid="5474997287953892710">"কেৱল যোগান ধৰা চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string> + <string name="battery_low_why" msgid="4553600287639198111">"ছেটিংসমূহ"</string> + <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> + <skip /> + <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"অন কৰক"</string> + <!-- no translation found for battery_saver_start_action (8187820911065797519) --> + <skip /> + <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ছেটিংসমূহ"</string> + <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ৱাই-ফাই"</string> + <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীণ"</string> + <string name="status_bar_settings_mute_label" msgid="554682549917429396">"মিউট"</string> + <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"স্বয়ং"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"জাননীসমূহ"</string> + <string name="bluetooth_tethered" msgid="7094101612161133267">"ব্লুটুথ টেডাৰিং কৰা হ\'ল"</string> + <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ইনপুট পদ্ধতি ছেট আপ কৰক"</string> + <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"বাস্তৱিক কীব\'ৰ্ড"</string> + <!-- no translation found for usb_device_permission_prompt (1825685909587559679) --> + <skip /> + <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) --> + <skip /> + <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) --> + <skip /> + <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) --> + <skip /> + <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ইনষ্টল হৈ থকা কোনো এপে ইউএছবি সহায়ক সামগ্ৰীটো চলাব নোৱাৰে। এই সহায়ক সামগ্ৰীৰ বিষয়ে <xliff:g id="URL">%1$s</xliff:g>ৰ জৰিয়তে অধিক জানক৷"</string> + <string name="title_usb_accessory" msgid="4966265263465181372">"ইউএছবিৰ সহায়ক সামগ্ৰী"</string> + <string name="label_view" msgid="6304565553218192990">"চাওক"</string> + <!-- no translation found for always_use_device (4015357883336738417) --> + <skip /> + <!-- no translation found for always_use_accessory (3257892669444535154) --> + <skip /> + <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_secondary_user_title (6353808721761220421) --> + <skip /> + <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> + <skip /> + <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string> + <string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string> + <!-- no translation found for global_action_screenshot (8329831278085426283) --> + <skip /> + <string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string> + <string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string> + <!-- no translation found for screenshot_saving_text (2545047868936087248) --> + <skip /> + <!-- no translation found for screenshot_saved_title (5637073968117370753) --> + <skip /> + <!-- no translation found for screenshot_saved_text (7574667448002050363) --> + <skip /> + <!-- no translation found for screenshot_failed_title (9096484883063264803) --> + <skip /> + <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) --> + <skip /> + <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) --> + <skip /> + <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) --> + <skip /> + <string name="usb_preference_title" msgid="6551050377388882787">"ইউএছবিৰে ফাইল স্থানান্তৰণৰ বিকল্পসমূহ"</string> + <string name="use_mtp_button_title" msgid="4333504413563023626">"মিডিয়া প্লেয়াৰ (এমটিপি) হিচাপে সংলগ্ন কৰক"</string> + <string name="use_ptp_button_title" msgid="7517127540301625751">"কেমেৰা (পিটিপি) হিচাপে সংলগ্ন কৰক"</string> + <string name="installer_cd_button_title" msgid="2312667578562201583">"Macৰ বাবে Android ফাইল স্থানান্তৰ এপ্ ইনষ্টল কৰক"</string> + <string name="accessibility_back" msgid="567011538994429120">"উভতি যাওক"</string> + <string name="accessibility_home" msgid="8217216074895377641">"গৃহ পৃষ্ঠাৰ বুটাম"</string> + <string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string> + <string name="accessibility_accessibility_button" msgid="7601252764577607915">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string> + <!-- no translation found for accessibility_rotate_button (7402949513740253006) --> + <skip /> + <string name="accessibility_recent" msgid="5208608566793607626">"অৱলোকন"</string> + <string name="accessibility_search_light" msgid="1103867596330271848">"সন্ধান কৰক"</string> + <string name="accessibility_camera_button" msgid="8064671582820358152">"কেমেৰা"</string> + <string name="accessibility_phone_button" msgid="6738112589538563574">"ফ\'ন"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> + <string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক কৰক"</string> + <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> + <string name="unlock_label" msgid="8779712358041029439">"আনলক কৰক"</string> + <string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> + <string name="camera_label" msgid="7261107956054836961">"কেমেৰা খোলক"</string> + <!-- no translation found for recents_caption_resize (3517056471774958200) --> + <skip /> + <string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <skip /> + <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"উপযোগিতা অনুসৰি জুম কৰা বুটাম।"</string> + <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"স্ক্ৰীণৰ আকাৰ ডাঙৰ কৰিবলৈ জুম কৰক।"</string> + <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযোগ হ\'ল।"</string> + <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ব্লুটুথ সংযোগ বিচ্ছিন্ন কৰা হ\'ল।"</string> + <string name="accessibility_no_battery" msgid="358343022352820946">"বেটাৰি শেষ"</string> + <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"বেটাৰিৰ এডাল দণ্ড।"</string> + <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"বেটাৰিৰ দুডাল দণ্ড।"</string> + <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"বেটাৰিৰ তিনিডাল দণ্ড।"</string> + <string name="accessibility_battery_full" msgid="8909122401720158582">"বেটাৰি পূৰাকৈ চ্চাৰ্জ হৈছে।"</string> + <string name="accessibility_no_phone" msgid="4894708937052611281">"ফ\'নত ছিগনেল নাই৷"</string> + <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ফ\'ন ছিগনেলৰ এডাল দণ্ড।"</string> + <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ফ\'ন ছিগনেলৰ দুডাল দণ্ড।"</string> + <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ফ\'নৰ ছিগনেলৰ তিনিডাল দণ্ড আছে।"</string> + <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ফ\'নৰ ছিগনেল পূৰা আছে৷"</string> + <string name="accessibility_no_data" msgid="4791966295096867555">"কোনো ডেটা নাই।"</string> + <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ডেটা ছিগনেলৰ এডাল দণ্ড।"</string> + <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ডেটা ছংনেলৰ তিনিডাল দণ্ড।"</string> + <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ডেটা ছিংগনেলত তিনিডাল দণ্ড আছে।"</string> + <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ডেটা ছিগনেল পূৰা আছে।"</string> + <string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string> + <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string> + <!-- no translation found for accessibility_cast_name (4026393061247081201) --> + <skip /> + <string name="accessibility_no_wimax" msgid="4329180129727630368">"কোনো WiMAX নাই।"</string> + <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXৰ এডাল দণ্ড৷"</string> + <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXৰ দুডাল দণ্ড আছে।"</string> + <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAXৰ তিনিডাল দণ্ড আছে।"</string> + <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAXৰ ছিগনেল পূৰা আছে৷"</string> + <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> + <skip /> + <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> + <skip /> + <string name="accessibility_no_signal" msgid="7064645320782585167">"কোনো ছিগনেল নাই।"</string> + <string name="accessibility_not_connected" msgid="6395326276213402883">"সংযোগ হৈ থকা নাই।"</string> + <string name="accessibility_zero_bars" msgid="3806060224467027887">"এডালো দণ্ড নাই।"</string> + <string name="accessibility_one_bar" msgid="1685730113192081895">"এডাল দণ্ড।"</string> + <string name="accessibility_two_bars" msgid="6437363648385206679">"দুডাল দণ্ড।"</string> + <string name="accessibility_three_bars" msgid="2648241415119396648">"তিনিডাল দণ্ড।"</string> + <string name="accessibility_signal_full" msgid="9122922886519676839">"সম্পূৰ্ণ ছিগনেল।"</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"অন।"</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"অফ।"</string> + <string name="accessibility_desc_connected" msgid="8366256693719499665">"সংযোগ কৰা হ’ল।"</string> + <string name="accessibility_desc_connecting" msgid="3812924520316280149">"সংযোগ কৰি থকা হৈছে।"</string> + <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"জিপিআৰএছ"</string> + <string name="accessibility_data_connection_1x" msgid="994133468120244018">"১ X"</string> + <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string> + <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string> + <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string> + <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string> + <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) --> + <skip /> + <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"এলটিই"</string> + <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) --> + <skip /> + <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string> + <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ৰ\'মিং"</string> + <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string> + <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ৱাই-ফাই"</string> + <string name="accessibility_no_sim" msgid="8274017118472455155">"ছিম নাই।"</string> + <!-- no translation found for accessibility_cell_data (5326139158682385073) --> + <skip /> + <!-- no translation found for accessibility_cell_data_on (5927098403452994422) --> + <skip /> + <!-- no translation found for accessibility_cell_data_off (443267573897409704) --> + <skip /> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টেডাৰিং।"</string> + <string name="accessibility_airplane_mode" msgid="834748999790763092">"এয়াৰপ্লেইন ম\'ড।"</string> + <!-- no translation found for accessibility_vpn_on (5993385083262856059) --> + <skip /> + <!-- no translation found for accessibility_no_sims (3957997018324995781) --> + <skip /> + <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) --> + <skip /> + <!-- no translation found for accessibility_battery_details (7645516654955025422) --> + <skip /> + <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string> + <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) --> + <skip /> + <string name="accessibility_settings_button" msgid="799583911231893380">"ছিষ্টেমৰ ছেটিংসমূহ৷"</string> + <string name="accessibility_notifications_button" msgid="4498000369779421892">"জাননীসমূহ।"</string> + <!-- no translation found for accessibility_overflow_action (5681882033274783311) --> + <skip /> + <string name="accessibility_remove_notification" msgid="3603099514902182350">"জাননী মচক৷"</string> + <string name="accessibility_gps_enabled" msgid="3511469499240123019">"জিপিএছ সক্ষম হ\'ল৷"</string> + <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"জিপিএছ বিচাৰি থকা হৈছে।"</string> + <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter সক্ষম কৰা হ\'ল৷"</string> + <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ৰিংগাৰ কম্পন অৱস্থাত আছে৷"</string> + <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ৰিংগাৰ নীৰৱ কৰা হৈছে৷"</string> + <!-- no translation found for accessibility_casting (6887382141726543668) --> + <skip /> + <!-- no translation found for accessibility_work_mode (702887484664647430) --> + <skip /> + <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ক আঁতৰাব।"</string> + <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> আঁতৰোৱা হৈছে৷"</string> + <!-- no translation found for accessibility_recents_all_items_dismissed (4464697366179168836) --> + <skip /> + <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) --> + <skip /> + <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰা হৈছে।"</string> + <string name="accessibility_notification_dismissed" msgid="854211387186306927">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string> + <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"জাননী পেনেল।"</string> + <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ক্ষিপ্ৰ ছেটিংসমূহ।"</string> + <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"বন্ধ স্ক্ৰীণ।"</string> + <string name="accessibility_desc_settings" msgid="3417884241751434521">"ছেটিংসমূহ"</string> + <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"অৱলোকন।"</string> + <string name="accessibility_desc_work_lock" msgid="4288774420752813383">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীণ"</string> + <!-- no translation found for accessibility_desc_close (7479755364962766729) --> + <skip /> + <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string> + <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ৱাই-ফাই অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ৱাই-ফাই অন কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ম\'বাইল <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string> + <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"বেটাৰি <xliff:g id="STATE">%s</xliff:g>।"</string> + <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"এয়াৰপ্লেইন ম\'ড অফ হৈ আছে৷"</string> + <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"এয়াৰপ্লেইন ম\'ড অন হৈ আছে৷"</string> + <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"এয়াৰপ্লেইন ম\'ড অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"এয়াৰপ্লেইন ম\'ড অন কৰা হ\'ল।"</string> + <!-- no translation found for accessibility_quick_settings_dnd_priority_on (1448402297221249355) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd_none_on (6882582132662613537) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd_alarms_on (9152834845587554157) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd_off (2371832603753738581) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd_changed_off (898107593453022935) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_dnd_changed_on (4483780856613561039) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) --> + <skip /> + <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ব্লুটুথ অফ হৈ আছে।"</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ব্লুটুথ অন হৈ আছে।"</string> + <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ব্লুটুথ সংযোগ কৰি থকা হৈছে।"</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ব্লুটুথ সংযোগ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ব্লুটুথ অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ব্লুটুথ অন কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"অৱস্থান সবিশেষ অফ হৈ আছে।"</string> + <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"অৱস্থান সবিশেষ অন হৈ আছে।"</string> + <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"অৱস্থান সবিশেষ অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"অৱস্থান সবিশেষ অন কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>ৰ বাবে এলাৰ্ম ছেট কৰা হৈছে।"</string> + <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"পেনেল বন্ধ কৰক।"</string> + <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"অধিক সময়।"</string> + <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"কম সময়।"</string> + <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ফ্লাশ্বলাইট অফ হৈ আছে।"</string> + <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> + <skip /> + <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ফ্লাশ্বলাইট অন হৈ আছে৷"</string> + <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ফ্লাশ্বলাইট অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ফ্লাশ্বলাইট অন কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"ৰং বিপৰীতকৰণ অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"ৰং বিপৰীতকৰণ অন কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ম\'বাইল হটস্পট অফ কৰা হ\'ল।"</string> + <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ম\'বাইল হটস্পট অন কৰা হ\'ল।"</string> + <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"স্ক্ৰীণ কাষ্টিং বন্ধ কৰা হ\'ল।"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> + <skip /> + <string name="accessibility_brightness" msgid="8003681285547803095">"ডিছপ্লেৰ উজ্জ্বলতা"</string> + <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"চ্চার্জ কৰি থকা হৈছে"</string> + <!-- no translation found for data_usage_disabled_dialog_3g_title (5281770593459841889) --> + <skip /> + <!-- no translation found for data_usage_disabled_dialog_4g_title (1601769736881078016) --> + <skip /> + <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) --> + <skip /> + <!-- no translation found for data_usage_disabled_dialog_title (3932437232199671967) --> + <skip /> + <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) --> + <skip /> + <!-- no translation found for data_usage_disabled_dialog_enable (1412395410306390593) --> + <skip /> + <string name="gps_notification_searching_text" msgid="8574247005642736060">"জিপিএছ সন্ধান কৰি থকা হৈছে"</string> + <string name="gps_notification_found_text" msgid="4619274244146446464">"জিপিএছএ অৱস্থান ছেট কৰিছে"</string> + <string name="accessibility_location_active" msgid="2427290146138169014">"অৱস্থানৰ অনুৰোধ সক্ৰিয় হৈ আছে"</string> + <string name="accessibility_clear_all" msgid="5235938559247164925">"সকলো জাননী মচক৷"</string> + <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) --> + <skip /> + <!-- no translation found for notification_group_overflow_description (4579313201268495404) --> + <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"জাননীৰ ছেটিংসমূহ"</string> + <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ছেটিংসমূহ"</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"আপোনাৰ ফ\'নৰ স্ক্ৰীণ স্বয়ংক্ৰিয়ভাৱে ঘূৰিব৷"</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"স্ক্ৰীণ লেণ্ডস্কেপ দিশত লক কৰা হ\'ল।"</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"স্ক্ৰীণ প\'ৰ্ট্ৰেইট দিশত লক কৰা হ\'ল।"</string> + <string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"আপোনাৰ ফ\'নৰ স্ক্ৰীণ এতিয়া স্বয়ংক্ৰিয়ভাৱে ঘূৰিব৷"</string> + <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"স্ক্ৰীণখন এতিয়া লেণ্ডস্কেইপ দিশত লক কৰা অৱস্থাত আছে।"</string> + <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"স্ক্ৰীণখন এতিয়া প\'ৰ্ট্ৰেইট দিশত লক কৰা অৱস্থাত আছে।"</string> + <string name="dessert_case" msgid="1295161776223959221">"মিষ্টান্ন ভাণ্ডাৰ"</string> + <!-- no translation found for start_dreams (5640361424498338327) --> + <skip /> + <string name="ethernet_label" msgid="7967563676324087464">"ইথাৰনেট"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> + <!-- no translation found for quick_settings_dnd_label (8735855737575028208) --> + <skip /> + <!-- no translation found for quick_settings_dnd_priority_label (483232950670692036) --> + <skip /> + <!-- no translation found for quick_settings_dnd_alarms_label (2559229444312445858) --> + <skip /> + <!-- no translation found for quick_settings_dnd_none_label (5025477807123029478) --> + <skip /> + <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ব্লুটুথ"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ব্লুটুথ (<xliff:g id="NUMBER">%d</xliff:g>টা ডিভাইচ)"</string> + <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ব্লুটুথ বন্ধ অৱস্থাত আছে"</string> + <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string> + <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) --> + <skip /> + <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string> + <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) --> + <skip /> + <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ঘূৰ্ণন লক কৰা হ\'ল"</string> + <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_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> + <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"জৰুৰীকালীন কল মাত্ৰ"</string> + <string name="quick_settings_settings_label" msgid="5326556592578065401">"ছেটিংসমূহ"</string> + <string name="quick_settings_time_label" msgid="4635969182239736408">"সময়"</string> + <string name="quick_settings_user_label" msgid="5238995632130897840">"মোক"</string> + <string name="quick_settings_user_title" msgid="4467690427642392403">"ব্যৱহাৰকাৰী"</string> + <string name="quick_settings_user_new_user" msgid="9030521362023479778">"নতুন ব্যৱহাৰকাৰী"</string> + <string name="quick_settings_wifi_label" msgid="9135344704899546041">"ৱাই-ফাই"</string> + <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"সংযোগ হৈ থকা নাই"</string> + <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"নেটৱৰ্ক নাই"</string> + <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ৱাই-ফাই অফ"</string> + <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) --> + <skip /> + <!-- no translation found for quick_settings_wifi_detail_empty_text (269990350383909226) --> + <skip /> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> + <!-- no translation found for quick_settings_cast_title (7709016546426454729) --> + <skip /> + <string name="quick_settings_casting" msgid="6601710681033353316">"কাষ্টিং"</string> + <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নাম নথকা ডিভাইচ"</string> + <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাষ্টৰ বাবে সাজু"</string> + <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"কোনো ডিভাইচ নাই"</string> + <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"উজ্জ্বলতা"</string> + <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"স্বয়ং"</string> + <string name="quick_settings_inversion_label" msgid="8790919884718619648">"ৰং ওলোটা কৰক"</string> + <string name="quick_settings_color_space_label" msgid="853443689745584770">"ৰং শুধৰণী কৰা ম\'ড"</string> + <string name="quick_settings_more_settings" msgid="326112621462813682">"অধিক ছেটিং"</string> + <string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন কৰা হ\'ল"</string> + <string name="quick_settings_connected" msgid="1722253542984847487">"সংযোগ কৰা হ’ল"</string> + <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> + <skip /> + <string name="quick_settings_connecting" msgid="47623027419264404">"সংযোগ কৰি থকা হৈছে..."</string> + <string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেডাৰ কৰি থকা হৈছে"</string> + <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string> + <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> + <skip /> + <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_notifications_label" msgid="4818156442169154523">"জাননীসমূহ"</string> + <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্লাশ্বলাইট"</string> + <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) --> + <skip /> + <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ডেটা ব্যৱহাৰ"</string> + <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"বাকী থকা ডেটা"</string> + <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"সর্ব্বোচ সীমা"</string> + <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যৱহৃত"</string> + <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সীমা"</string> + <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সকীয়নি"</string> + <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> + <skip /> + <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> + <skip /> + <!-- no translation found for quick_settings_night_display_label (3577098011487644395) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) --> + <skip /> + <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> + <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string> + <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string> + <!-- no translation found for recents_empty_message (808480104164008572) --> + <skip /> + <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) --> + <skip /> + <string name="recents_app_info_button_label" msgid="2890317189376000030">"এপ্লিকেশ্বনৰ তথ্য"</string> + <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্ৰীণ পিনিং"</string> + <string name="recents_search_bar_label" msgid="8074997400187836677">"সন্ধান কৰক"</string> + <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰিব পৰা নগ\'ল৷"</string> + <!-- no translation found for recents_launch_disabled_message (1624523193008871793) --> + <skip /> + <!-- no translation found for recents_stack_action_button_label (6593727103310426253) --> + <skip /> + <!-- no translation found for recents_drag_hint_message (2649739267073203985) --> + <skip /> + <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) --> + <skip /> + <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) --> + <skip /> + <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) --> + <skip /> + <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"স্ক্ৰীণখনক ওপৰফাললৈ ভাগ কৰক"</string> + <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"স্ক্ৰীণখনক বাওঁফাললৈ ভাগ কৰক"</string> + <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"স্ক্ৰীণখনক সোঁফাললৈ ভাগ কৰক"</string> + <string name="expanded_header_battery_charged" msgid="5945855970267657951">"চ্চার্জ হ\'ল"</string> + <string name="expanded_header_battery_charging" msgid="205623198487189724">"চ্চার্জ হৈ আছে"</string> + <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"বেটাৰিৰ চ্চাৰ্জ সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME">%s</xliff:g> বাকী"</string> + <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"চ্চার্জ কৰি থকা নাই"</string> + <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"নেটৱৰ্ক \nনিৰীক্ষণ কৰা হ\'ব পাৰে"</string> + <string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান কৰক"</string> + <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে ওপৰলৈ শ্লাইড কৰক।"</string> + <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে বাওঁফাললৈ শ্লাইড কৰক।"</string> + <!-- no translation found for zen_priority_introduction (1149025108714420281) --> + <skip /> + <!-- no translation found for zen_alarms_introduction (4934328096749380201) --> + <skip /> + <!-- no translation found for zen_priority_customize_button (7948043278226955063) --> + <skip /> + <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> + <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> + <string name="speed_bump_explanation" msgid="1288875699658819755">"কম জৰুৰী জাননীসমূহ তলত"</string> + <string name="notification_tap_again" msgid="7590196980943943842">"খুলিবলৈ পুনৰাই টিপক"</string> + <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string> + <string name="do_disclosure_generic" msgid="5615898451805157556">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string> + <!-- no translation found for do_disclosure_with_name (5640615509915445501) --> + <skip /> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> + <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) --> + <skip /> + <!-- no translation found for interruption_level_none (6000083681244492992) --> + <skip /> + <!-- no translation found for interruption_level_priority (6426766465363855505) --> + <skip /> + <!-- no translation found for interruption_level_alarms (5226306993448328896) --> + <skip /> + <!-- no translation found for interruption_level_none_twoline (3957581548190765889) --> + <skip /> + <!-- no translation found for interruption_level_priority_twoline (1564715335217164124) --> + <skip /> + <!-- no translation found for interruption_level_alarms_twoline (3266909566410106146) --> + <skip /> + <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"চ্চার্জ হৈ আছে (সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>সময় বাকী)"</string> + <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) --> + <skip /> + <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) --> + <skip /> + <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ব্যৱহাৰকাৰী সলনি কৰক"</string> + <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ব্যৱহাৰকাৰী সলনি কৰক, বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> + <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) --> + <skip /> + <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"প্ৰ\'ফাইল দেখুৱাওক"</string> + <string name="user_add_user" msgid="5110251524486079492">"ব্যৱহাৰকাৰী যোগ কৰক"</string> + <string name="user_new_user_name" msgid="426540612051178753">"নতুন ব্যৱহাৰকাৰী"</string> + <string name="guest_nickname" msgid="8059989128963789678">"অতিথি"</string> + <string name="guest_new_guest" msgid="600537543078847803">"অতিথি যোগ কৰক"</string> + <string name="guest_exit_guest" msgid="7187359342030096885">"অতিথি আঁতৰাওক"</string> + <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"অতিথি আঁতৰাবনে?"</string> + <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"এই ছেশ্বনৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।"</string> + <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"আঁতৰাওক"</string> + <string name="guest_wipe_session_title" msgid="6419439912885956132">"আপোনাক পুনৰাই স্বাগতম জনাইছোঁ!"</string> + <string name="guest_wipe_session_message" msgid="8476238178270112811">"আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?"</string> + <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"আকৌ আৰম্ভ কৰক"</string> + <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হয়, অব্যাহত ৰাখক"</string> + <!-- no translation found for guest_notification_title (1585278533840603063) --> + <skip /> + <!-- no translation found for guest_notification_text (335747957734796689) --> + <skip /> + <!-- no translation found for guest_notification_remove_action (8820670703892101990) --> + <skip /> + <!-- no translation found for user_logout_notification_title (1453960926437240727) --> + <skip /> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> + <skip /> + <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <skip /> + <string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যৱহাৰকাৰী যোগ কৰিবনে?"</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ স্থান ছেট আপ কৰা প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে নিজৰ লগতে আন ব্যৱহাৰকাৰীৰো এপ্ আপডেট কৰিব পাৰে।"</string> + <!-- no translation found for user_remove_user_title (4681256956076895559) --> + <skip /> + <!-- no translation found for user_remove_user_message (1453218013959498039) --> + <skip /> + <!-- no translation found for user_remove_user_remove (7479275741742178297) --> + <skip /> + <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> + <skip /> + <string name="battery_saver_notification_text" msgid="820318788126672692">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string> + <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> + <skip /> + <string name="media_projection_dialog_text" msgid="3071431025448218928">"আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা সকলো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> কেপশ্বাৰ কৰা আৰম্ভ কৰিব।"</string> + <string name="media_projection_remember_text" msgid="3103510882172746752">"পুনৰাই নেদেখুৱাব"</string> + <string name="clear_all_notifications_text" msgid="814192889771462828">"সকলো মচক"</string> + <string name="media_projection_action_text" msgid="8470872969457985954">"এতিয়াই আৰম্ভ কৰক"</string> + <string name="empty_shade_text" msgid="708135716272867002">"কোনো জাননী নাই"</string> + <string name="profile_owned_footer" msgid="8021888108553696069">"প্ৰ\'ফাইল নিৰীক্ষণ কৰা হ\'ব পাৰে"</string> + <string name="vpn_footer" msgid="2388611096129106812">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string> + <!-- no translation found for branded_vpn_footer (2168111859226496230) --> + <skip /> + <string name="quick_settings_disclosure_management_monitoring" msgid="6645176135063957394">"আপোনাৰ প্ৰতিষ্ঠানটোৱে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে।"</string> + <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) --> + <skip /> + <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string> + <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) --> + <skip /> + <string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"ডিভাইচটো ভিপিএনবোৰৰ সৈতে সংযুক্ত হৈ আছে"</string> + <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) --> + <skip /> + <!-- no translation found for monitoring_title_device_owned (1652495295941959815) --> + <skip /> + <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"প্ৰ\'ফাইল নিৰীক্ষণ"</string> + <string name="monitoring_title" msgid="169206259253048106">"নেটৱৰ্ক নিৰীক্ষণ"</string> + <string name="monitoring_subtitle_vpn" msgid="876537538087857300">"ভিপিএন"</string> + <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) --> + <skip /> + <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) --> + <skip /> + <string name="disable_vpn" msgid="4435534311510272506">"ভিপিএন অক্ষম কৰক"</string> + <string name="disconnect_vpn" msgid="1324915059568548655">"ভিপিএন সংযোগ বিচ্ছিন্ন কৰক"</string> + <string name="monitoring_button_view_policies" msgid="100913612638514424">"নীতিসমূহ চাওক"</string> + <!-- no translation found for monitoring_description_named_management (5281789135578986303) --> + <skip /> + <!-- no translation found for monitoring_description_management (4573721970278370790) --> + <skip /> + <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string> + <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) --> + <skip /> + <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰা হৈছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string> + <string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।"</string> + <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) --> + <skip /> + <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) --> + <skip /> + <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string> + <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) --> + <skip /> + <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) --> + <skip /> + <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) --> + <skip /> + <string name="monitoring_description_do_body" msgid="3639594537660975895">"আপোনাৰ প্ৰশাসকে আপোনাৰ ডিভাইচৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰিব।"</string> + <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) --> + <skip /> + <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) --> + <skip /> + <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) --> + <skip /> + <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string> + <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> + <skip /> + <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) --> + <skip /> + <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) --> + <skip /> + <string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।\n\nএই সম্পৰ্কে অধিক জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string> + <!-- no translation found for monitoring_description_vpn (4445150119515393526) --> + <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>য়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল পৰিচালনা কৰে।\n\nআপোনাৰ প্ৰশাসকে ইমেইল, এপসমূহ আৰু আপুনি চোৱা ৱেবছাইটকে ধৰি আপোনাৰ নেটৱৰ্কৰ সকলো কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে। \n\nঅধিক তথ্যৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।\n\nইয়াৰ উপৰি, আপুনি এটা ভিপিএনৰ সৈতে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ নেটৱৰ্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string> + <!-- no translation found for legacy_vpn_name (6604123105765737830) --> + <skip /> + <string name="monitoring_description_app" msgid="1828472472674709532">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string> + <!-- no translation found for monitoring_description_app_personal (484599052118316268) --> + <skip /> + <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) --> + <skip /> + <!-- no translation found for monitoring_description_app_work (4612997849787922906) --> + <skip /> + <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) --> + <skip /> + <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) --> + <skip /> + <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) --> + <skip /> + <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"আপুনি নিজে আনলক নকৰালৈকে ডিভাইচ লক হৈ থাকিব"</string> + <string name="hidden_notifications_title" msgid="7139628534207443290">"জাননী ক্ষিপ্ৰতাৰে লাভ কৰক"</string> + <string name="hidden_notifications_text" msgid="2326409389088668981">"আপুনি আনলক কৰাৰ পূৰ্বে তেওঁলোকক চাওক"</string> + <string name="hidden_notifications_cancel" msgid="3690709735122344913">"নালাগে, ধন্যবাদ"</string> + <string name="hidden_notifications_setup" msgid="41079514801976810">"ছেট আপ কৰক"</string> + <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <!-- no translation found for volume_zen_end_now (6930243045593601084) --> + <skip /> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> + <string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্ৰীণ পিন কৰা হ\'ল"</string> + <string name="screen_pinning_description" msgid="8909878447196419623">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'পিছলৈ যাওক\' আৰু \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> + <string name="screen_pinning_description_accessible" msgid="426190689254018656">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> + <string name="screen_pinning_positive" msgid="3783985798366751226">"বুজি পালোঁ"</string> + <string name="screen_pinning_negative" msgid="3741602308343880268">"নালাগে, ধন্যবাদ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> + <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string> + <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string> + <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকুৱাওক"</string> + <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) --> + <skip /> + <!-- no translation found for stream_voice_call (4410002696470423714) --> + <skip /> + <!-- no translation found for stream_system (7493299064422163147) --> + <skip /> + <string name="stream_ring" msgid="8213049469184048338">"ৰিং"</string> + <string name="stream_music" msgid="9086982948697544342">"মিডিয়া"</string> + <!-- no translation found for stream_alarm (5209444229227197703) --> + <skip /> + <string name="stream_notification" msgid="2563720670905665031">"জাননী"</string> + <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ব্লুটুথ"</string> + <string name="stream_dtmf" msgid="2447177903892477915">"ডুৱেল মাল্টি ট\'ন ফ্ৰিকুৱেন্সী"</string> + <string name="stream_accessibility" msgid="301136219144385106">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string> + <!-- no translation found for ring_toggle_title (3281244519428819576) --> + <skip /> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> + <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) --> + <skip /> + <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) --> + <skip /> + <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) --> + <skip /> + <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। কম্পন অৱস্থাত ছেট কৰিবলৈ টিপক।"</string> + <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। মিউট কৰিবলৈ টিপক।"</string> + <!-- no translation found for volume_dialog_title (7272969888820035876) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> + <!-- no translation found for output_title (5355078100792942802) --> + <skip /> + <!-- no translation found for output_calls_title (8717692905017206161) --> + <skip /> + <!-- no translation found for output_none_found (5544982839808921091) --> + <skip /> + <!-- no translation found for output_none_found_service_off (8631969668659757069) --> + <skip /> + <!-- no translation found for output_service_bt (6224213415445509542) --> + <skip /> + <!-- no translation found for output_service_wifi (3749735218931825054) --> + <skip /> + <!-- no translation found for output_service_bt_wifi (4486837869988770896) --> + <skip /> + <!-- no translation found for system_ui_tuner (708224127392452018) --> + <skip /> + <!-- no translation found for show_battery_percentage (5444136600512968798) --> + <skip /> + <!-- no translation found for show_battery_percentage_summary (3215025775576786037) --> + <skip /> + <!-- no translation found for quick_settings (10042998191725428) --> + <skip /> + <!-- no translation found for status_bar (4877645476959324760) --> + <skip /> + <!-- no translation found for overview (4018602013895926956) --> + <skip /> + <string name="demo_mode" msgid="2532177350215638026">"ছিষ্টেমৰ UI প্ৰদৰ্শন ম\'ড"</string> + <!-- no translation found for enable_demo_mode (4844205668718636518) --> + <skip /> + <!-- no translation found for show_demo_mode (2018336697782464029) --> + <skip /> + <!-- no translation found for status_bar_ethernet (5044290963549500128) --> + <skip /> + <!-- no translation found for status_bar_alarm (8536256753575881818) --> + <skip /> + <!-- no translation found for status_bar_work (6022553324802866373) --> + <skip /> + <!-- no translation found for status_bar_airplane (7057575501472249002) --> + <skip /> + <!-- no translation found for add_tile (2995389510240786221) --> + <skip /> + <!-- no translation found for broadcast_tile (3894036511763289383) --> + <skip /> + <!-- no translation found for zen_alarm_warning_indef (3482966345578319605) --> + <skip /> + <!-- no translation found for zen_alarm_warning (444533119582244293) --> + <skip /> + <!-- no translation found for alarm_template (3980063409350522735) --> + <skip /> + <!-- no translation found for alarm_template_far (4242179982586714810) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_detail (2579369091672902101) --> + <skip /> + <!-- no translation found for accessibility_status_bar_hotspot (4099381329956402865) --> + <skip /> + <!-- no translation found for accessibility_managed_profile (6613641363112584120) --> + <skip /> + <!-- no translation found for tuner_warning_title (7094689930793031682) --> + <skip /> + <!-- no translation found for tuner_warning (8730648121973575701) --> + <skip /> + <!-- no translation found for tuner_persistent_warning (8597333795565621795) --> + <skip /> + <!-- no translation found for got_it (2239653834387972602) --> + <skip /> + <!-- no translation found for tuner_toast (603429811084428439) --> + <skip /> + <!-- no translation found for remove_from_settings (8389591916603406378) --> + <skip /> + <!-- no translation found for remove_from_settings_prompt (6069085993355887748) --> + <skip /> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> + <!-- no translation found for clock_seconds (7689554147579179507) --> + <skip /> + <!-- no translation found for clock_seconds_desc (6282693067130470675) --> + <skip /> + <!-- no translation found for qs_rearrange (8060918697551068765) --> + <skip /> + <!-- no translation found for show_brightness (6613930842805942519) --> + <skip /> + <!-- no translation found for experimental (6198182315536726162) --> + <skip /> + <!-- no translation found for enable_bluetooth_title (5027037706500635269) --> + <skip /> + <!-- no translation found for enable_bluetooth_message (9106595990708985385) --> + <skip /> + <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) --> + <skip /> + <!-- no translation found for show_silently (6841966539811264192) --> + <skip /> + <!-- no translation found for block (2734508760962682611) --> + <skip /> + <!-- no translation found for do_not_silence (6878060322594892441) --> + <skip /> + <!-- no translation found for do_not_silence_block (4070647971382232311) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings (3207312268609236827) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) --> + <skip /> + <!-- no translation found for power_notification_controls_description (4372459941671353358) --> + <skip /> + <string name="notification_header_default_channel" msgid="7506845022070889909">"জাননীসমূহ"</string> + <!-- no translation found for notification_channel_disabled (344536703863700565) --> + <skip /> + <!-- no translation found for inline_blocking_helper (3055064577771478591) --> + <skip /> + <!-- no translation found for inline_keep_showing (8945102997083836858) --> + <skip /> + <!-- no translation found for inline_stop_button (4172980096860941033) --> + <skip /> + <!-- no translation found for inline_keep_button (6665940297019018232) --> + <skip /> + <!-- no translation found for inline_keep_showing_app (1723113469580031041) --> + <skip /> + <!-- no translation found for notification_unblockable_desc (1037434112919403708) --> + <skip /> + <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) --> + <skip /> + <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) --> + <skip /> + <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) --> + <skip /> + <!-- no translation found for notification_more_settings (816306283396553571) --> + <skip /> + <!-- no translation found for notification_app_settings (420348114670768449) --> + <skip /> + <!-- no translation found for notification_done (5279426047273930175) --> + <skip /> + <!-- no translation found for inline_undo (558916737624706010) --> + <skip /> + <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string> + <string name="notification_menu_gear_description" msgid="2204480013726775108">"জাননীৰ নিয়ন্ত্ৰণসমূহ"</string> + <string name="notification_menu_snooze_description" msgid="3653669438131034525">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string> + <string name="snooze_undo" msgid="6074877317002985129">"আনডু কৰক"</string> + <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ বাবে স্নুজ কৰক"</string> + <!-- no translation found for snoozeHourOptions (2124335842674413030) --> + <!-- no translation found for snoozeMinuteOptions (4127251700591510196) --> + <!-- no translation found for battery_panel_title (7944156115535366613) --> + <skip /> + <!-- no translation found for battery_detail_charging_summary (1279095653533044008) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (6285872470260795421) --> + <skip /> + <!-- no translation found for battery_detail_switch_summary (9049111149407626804) --> + <skip /> + <!-- no translation found for keyboard_key_button_template (6230056639734377300) --> + <skip /> + <!-- no translation found for keyboard_key_home (2243500072071305073) --> + <skip /> + <!-- no translation found for keyboard_key_back (2337450286042721351) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) --> + <skip /> + <!-- no translation found for keyboard_key_tab (3871485650463164476) --> + <skip /> + <!-- no translation found for keyboard_key_space (2499861316311153293) --> + <skip /> + <!-- no translation found for keyboard_key_enter (5739632123216118137) --> + <skip /> + <!-- no translation found for keyboard_key_backspace (1559580097512385854) --> + <skip /> + <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) --> + <skip /> + <!-- no translation found for keyboard_key_media_stop (2859963958595908962) --> + <skip /> + <!-- no translation found for keyboard_key_media_next (1894394911630345607) --> + <skip /> + <!-- no translation found for keyboard_key_media_previous (4256072387192967261) --> + <skip /> + <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) --> + <skip /> + <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) --> + <skip /> + <!-- no translation found for keyboard_key_page_up (5654098530106845603) --> + <skip /> + <!-- no translation found for keyboard_key_page_down (8720502083731906136) --> + <skip /> + <!-- no translation found for keyboard_key_forward_del (1391451334716490176) --> + <skip /> + <!-- no translation found for keyboard_key_move_home (2765693292069487486) --> + <skip /> + <!-- no translation found for keyboard_key_move_end (5901174332047975247) --> + <skip /> + <!-- no translation found for keyboard_key_insert (8530501581636082614) --> + <skip /> + <!-- no translation found for keyboard_key_num_lock (5052537581246772117) --> + <skip /> + <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) --> + <skip /> + <!-- no translation found for tuner_full_zen_title (4540823317772234308) --> + <skip /> + <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) --> + <skip /> + <!-- no translation found for volume_dnd_silent (4363882330723050727) --> + <skip /> + <!-- no translation found for volume_up_silent (7141255269783588286) --> + <skip /> + <!-- no translation found for battery (7498329822413202973) --> + <skip /> + <!-- no translation found for clock (7416090374234785905) --> + <skip /> + <!-- no translation found for headset (4534219457597457353) --> + <skip /> + <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) --> + <skip /> + <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) --> + <skip /> + <!-- no translation found for data_saver (5037565123367048522) --> + <skip /> + <!-- no translation found for accessibility_data_saver_on (8454111686783887148) --> + <skip /> + <!-- no translation found for accessibility_data_saver_off (8841582529453005337) --> + <skip /> + <!-- no translation found for switch_bar_on (1142437840752794229) --> + <skip /> + <!-- no translation found for switch_bar_off (8803270596930432874) --> + <skip /> + <!-- no translation found for nav_bar (1993221402773877607) --> + <skip /> + <string name="nav_bar_layout" msgid="3664072994198772020">"লেআউট"</string> + <string name="left_nav_bar_button_type" msgid="8555981238887546528">"বাওঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string> + <string name="right_nav_bar_button_type" msgid="2481056627065649656">"সোঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string> + <string name="nav_bar_default" msgid="8587114043070993007">"ডিফ\'ল্ট"</string> + <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) --> + <string-array name="nav_bar_layouts"> + <item msgid="8077901629964902399">"সাধাৰণ"</item> + <item msgid="8256205964297588988">"ঘন"</item> + <item msgid="8719936228094005878">"বাওঁফালে হালি যোৱা"</item> + <item msgid="586019486955594690">"সোঁফালে হালি যোৱা"</item> + </string-array> + <string name="menu_ime" msgid="4998010205321292416">"কীব\'ৰ্ড সলনি কৰাৰ সুবিধা"</string> + <!-- no translation found for save (2311877285724540644) --> + <skip /> + <string name="reset" msgid="2448168080964209908">"ৰিছেট কৰক"</string> + <!-- no translation found for adjust_button_width (6138616087197632947) --> + <skip /> + <!-- no translation found for clipboard (1313879395099896312) --> + <skip /> + <!-- no translation found for accessibility_key (5701989859305675896) --> + <skip /> + <string name="left_keycode" msgid="2010948862498918135">"বাওঁ কীক\'ড"</string> + <string name="right_keycode" msgid="708447961000848163">"সোঁ কীক\'ড"</string> + <string name="left_icon" msgid="3096287125959387541">"বাওঁ আইকন"</string> + <string name="right_icon" msgid="3952104823293824311">"সোঁ আইকন"</string> + <!-- no translation found for drag_to_add_tiles (7058945779098711293) --> + <skip /> + <!-- no translation found for drag_to_remove_tiles (3361212377437088062) --> + <skip /> + <!-- no translation found for qs_edit (2232596095725105230) --> + <skip /> + <!-- no translation found for tuner_time (6572217313285536011) --> + <skip /> + <!-- no translation found for clock_options:0 (5965318737560463480) --> + <!-- no translation found for clock_options:1 (1427801730816895300) --> + <!-- no translation found for clock_options:2 (3830170141562534721) --> + <!-- no translation found for battery_options:0 (3160236755818672034) --> + <!-- no translation found for battery_options:1 (2139628951880142927) --> + <!-- no translation found for battery_options:2 (3327323682209964956) --> + <!-- no translation found for other (4060683095962566764) --> + <skip /> + <!-- no translation found for accessibility_divider (5903423481953635044) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) --> + <skip /> + <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) --> + <skip /> + <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) --> + <skip /> + <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) --> + <skip /> + <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) --> + <skip /> + <!-- no translation found for dock_forced_resizable (5914261505436217520) --> + <skip /> + <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) --> + <skip /> + <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) --> + <skip /> + <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) --> + <skip /> + <string name="tuner_lock_screen" msgid="5755818559638850294">"লক স্ক্ৰীণ"</string> + <!-- no translation found for pip_phone_expand (5889780005575693909) --> + <skip /> + <string name="pip_phone_minimize" msgid="1079119422589131792">"সৰু কৰক"</string> + <string name="pip_phone_close" msgid="8416647892889710330">"বন্ধ কৰক"</string> + <!-- no translation found for pip_phone_settings (8080777499521528521) --> + <skip /> + <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) --> + <skip /> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> + <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> চিত্ৰৰ ভিতৰৰ চিত্ৰত আছে"</string> + <!-- no translation found for pip_notification_message (5619512781514343311) --> + <skip /> + <!-- no translation found for pip_play (1417176722760265888) --> + <skip /> + <!-- no translation found for pip_pause (8881063404466476571) --> + <skip /> + <!-- no translation found for pip_skip_to_next (1948440006726306284) --> + <skip /> + <!-- no translation found for pip_skip_to_prev (1955311326688637914) --> + <skip /> + <!-- no translation found for thermal_shutdown_title (4458304833443861111) --> + <skip /> + <!-- no translation found for thermal_shutdown_message (9006456746902370523) --> + <skip /> + <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) --> + <skip /> + <string name="high_temp_title" msgid="4589508026407318374">"ফ\'নটো গৰম হ\'বলৈ ধৰিছে"</string> + <string name="high_temp_notif_message" msgid="5642466103153429279">"ফ\'নটো ঠাণ্ডা হৈ থকা সময়ত কিছুমান সুবিধা উপলব্ধ নহ\'ব"</string> + <string name="high_temp_dialog_message" msgid="6840700639374113553">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string> + <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"বাওঁ শ্বৰ্টকাট"</string> + <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"সোঁ শ্বৰ্টকাট"</string> + <string name="lockscreen_unlock_left" msgid="2043092136246951985">"বাওঁ শ্বৰ্টকাটটোৱেও আনলক কৰিব"</string> + <string name="lockscreen_unlock_right" msgid="1529992940510318775">"সোঁ শ্বৰ্টকাটটোৱেও আনলক কৰিব"</string> + <string name="lockscreen_none" msgid="4783896034844841821">"একো বাছনি কৰা হোৱা নাই"</string> + <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g>ক লঞ্চ কৰক"</string> + <string name="tuner_other_apps" msgid="4726596850501162493">"অন্যান্য এপসমূহ"</string> + <string name="tuner_circle" msgid="2340998864056901350">"পৰিচিত মানুহৰ গোট"</string> + <string name="tuner_plus" msgid="6792960658533229675">"যোগ চিহ্ন"</string> + <string name="tuner_minus" msgid="4806116839519226809">"বিয়োগ চিহ্ন"</string> + <string name="tuner_left" msgid="8404287986475034806">"বাওঁ"</string> + <string name="tuner_right" msgid="6222734772467850156">"সোঁ"</string> + <string name="tuner_menu" msgid="191640047241552081">"মেনু"</string> + <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> এপ্"</string> + <string name="notification_channel_alerts" msgid="4496839309318519037">"সতৰ্কবাণীসমূহ"</string> + <!-- no translation found for notification_channel_battery (5786118169182888462) --> + <skip /> + <string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্ৰীণশ্বটসমূহ"</string> + <string name="notification_channel_general" msgid="4525309436693914482">"সাধাৰণ বার্তাসমূহ"</string> + <string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়াগাৰ"</string> + <string name="instant_apps" msgid="6647570248119804907">"তাৎক্ষণিক এপসমূহ"</string> + <string name="instant_apps_message" msgid="8116608994995104836">"তাৎক্ষণিক এপসমূহক ইনষ্টল কৰাৰ প্ৰয়োজন নাই।"</string> + <!-- no translation found for app_info (6856026610594615344) --> + <skip /> + <!-- no translation found for go_to_web (2650669128861626071) --> + <skip /> + <string name="mobile_data" msgid="7094582042819250762">"ম\'বাইল ডেটা"</string> + <!-- no translation found for wifi_is_off (1838559392210456893) --> + <skip /> + <!-- no translation found for bt_is_off (2640685272289706392) --> + <skip /> + <!-- no translation found for dnd_is_off (6167780215212497572) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) --> + <skip /> + <!-- no translation found for qs_dnd_until (3469471136280079874) --> + <skip /> + <!-- no translation found for qs_dnd_keep (1825009164681928736) --> + <skip /> + <!-- no translation found for qs_dnd_replace (8019520786644276623) --> + <skip /> + <!-- no translation found for running_foreground_services_title (381024150898615683) --> + <skip /> + <!-- no translation found for running_foreground_services_msg (6326247670075574355) --> + <skip /> + <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ম’বাইল ডেটা অফ কৰিবনে?"</string> + <!-- no translation found for touch_filtered_warning (8671693809204767551) --> + <skip /> + <!-- no translation found for slice_permission_title (7465009437851044444) --> + <skip /> + <!-- no translation found for slice_permission_text_1 (3514586565609596523) --> + <skip /> + <!-- no translation found for slice_permission_text_2 (3146758297471143723) --> + <skip /> + <!-- no translation found for slice_permission_checkbox (7986504458640562900) --> + <skip /> + <!-- no translation found for slice_permission_allow (2340244901366722709) --> + <skip /> + <!-- no translation found for slice_permission_deny (7683681514008048807) --> + <skip /> +</resources> diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index e00a2dd8d515..6d086ae8e8e6 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"kemaranı açın"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni tapşırıq sxemi seçin"</string> <string name="cancel" msgid="6442560571259935130">"Ləğv et"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Tətbiq ikonası"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı bölməsi"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Desert Qabı"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekran qoruyucu"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Narahat etməyin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnız prioritet"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnız alarmlar"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Siqnal"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayım"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> güvənli rejimdə deaktiv edildi."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hamısını silin"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölmək üçün bura sürüşdürün"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Üfüqi Böl"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Şaquli Böl"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Fərdi Böl"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Çıxış cihazına keçin"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrana sancaq taxıldı"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Əsas səhifə düyməsinə basıb saxlayın."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Bu ekrandan sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Bu ekrandan sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım!"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Yox, çox sağ olun"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran sancılıb"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Sancaq ekrandan götürülüb"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlədilsin?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlarda onu aktivləşdirəcəyiniz vaxta qədər o, yenidən görünəcək."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizlədin"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Vibrasiyanı ayarlamaq üçün klikləyin."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Səssiz etmək üçün klikləyin."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s həcm nəzarəti göstərilir. Bitirmək üçün yuxarı çəkin."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Həcm nəzarət gizlədilib"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s səs nəzarətləri"</string> <string name="output_title" msgid="5355078100792942802">"Media çıxışı"</string> <string name="output_calls_title" msgid="8717692905017206161">"Zəng girişi"</string> <string name="output_none_found" msgid="5544982839808921091">"Heç bir cihaz tapılmadı"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Mübadilə buferi"</item> <item msgid="5742013440802239414">"Açar kodu"</item> - <item msgid="8802889973626281575">"Klaviatura dəyişdirici"</item> - <item msgid="7095517796293767867">"Naviqasiya təklifləri"</item> - <item msgid="8494159969042135235">"Yoxdur"</item> + <item msgid="1951959982985094069">"Çevirin, klaviatura dəyişdirici"</item> + <item msgid="8175437057325747277">"Heç bir"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 9c188ff5c721..6e6fcaf567f1 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -104,12 +104,11 @@ <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Izaberi novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast poruke za pomoć"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme Zum kompatibilnosti."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje sa manjeg na veći ekran."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth je priključen."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina sa poslasticama"</string> <string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string> <string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne uznemiravaj"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetni prekidi"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi je isključen"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je uključen"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Prebacivanje"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string> @@ -329,9 +331,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Povezuje se..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Povezivanje"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Uključuje se..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d uređaj</item> + <item quantity="few">%d uređaja</item> + <item quantity="other">%d uređaja</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obaveštenja"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampa"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilni podaci"</string> @@ -341,10 +346,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Iskoristili ste <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje za <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil za Work"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Obaveštenja i aplikacije su isključeni"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noćno svetlo"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se po zalasku sunca"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string> @@ -362,8 +365,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je onemogućena u bezbednom režimu."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Prevucite ovde da biste koristili razdeljeni ekran"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podeli horizontalno"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podeli vertikalno"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođeno deljenje"</string> @@ -504,11 +505,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi odmah"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promenite izlazni uređaj"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je zakačen"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Pregled da biste ga otkačili."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Početna da biste ga otkačili."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Pregled da biste ga otkačili."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Početna da biste ga otkačili."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Pregled"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Početna"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Važi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran je zakačen"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran je otkačen"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li da sakrijete <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ovo će se ponovo pojaviti kada ga sledeći put budete uključili u podešavanjima."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string> @@ -531,8 +539,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste podesili na vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrole za jačinu zvuka (%s) su prikazane. Prevucite nagore da biste ih odbacili."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole za jačinu zvuka su sakrivene"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole za jačinu zvuka za %s"</string> <string name="output_title" msgid="5355078100792942802">"Izlaz medija"</string> <string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonski poziv"</string> <string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string> @@ -588,8 +595,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Pomoću naprednih kontrola za obaveštenja možete da podesite nivo važnosti od 0. do 5. za obaveštenja aplikacije. \n\n"<b>"5. nivo"</b>" \n– Prikazuju se u vrhu liste obaveštenja \n- Dozvoli prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"4. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"3. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n\n"<b>"2. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n\n"<b>"1. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n– Sakrij na zaključanom ekranu i statusnoj traci \n– Prikazuju se u dnu liste obaveštenja \n\n"<b>"0. nivo"</b>" \n– Blokiraj sva obaveštenja iz aplikacije"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Obaveštenja"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Više nećete videti ova obaveštenja"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi da prikazuješ"</string> @@ -685,9 +691,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Memorija"</item> <item msgid="5742013440802239414">"Kôd tastera"</item> - <item msgid="8802889973626281575">"Prebacivač za tastaturu"</item> - <item msgid="7095517796293767867">"Predlog za rotaciju"</item> - <item msgid="8494159969042135235">"Ništa"</item> + <item msgid="1951959982985094069">"Potvrda rotiranja, prebacivač za tastaturu"</item> + <item msgid="8175437057325747277">"Ništa"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normalni"</item> diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 6115de36a428..248cd09fbcc1 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -105,12 +105,11 @@ <string name="camera_label" msgid="7261107956054836961">"адкрыць камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберыце новы макет заданняў"</string> <string name="cancel" msgid="6442560571259935130">"Скасаваць"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок праграмы"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Вобласць даведачнага паведамлення"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка сумяшчальнасці маштаба."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Маштабаванне малых элементаў для большага экрана."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-сувязь."</string> @@ -281,6 +280,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Вітрына з дэсертамі"</string> <string name="start_dreams" msgid="5640361424498338327">"Экранная застаўка"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбаваць"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Толькі прыярытэтныя"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Толькі будзільнікі"</string> @@ -317,6 +318,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi адключаны"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi уключаны"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма даступнай сеткі Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будзільнік"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляцыя"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Ідзе перадача"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Прылада без назвы"</string> @@ -333,9 +335,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Падлучэнне..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Мадэм"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Кропка доступу"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Уключэнне…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d прылада</item> + <item quantity="few">%d прылады</item> + <item quantity="many">%d прылад</item> + <item quantity="other">%d прылады</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Апавяшчэнні"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Ліхтарык"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мабільная перадача даных"</string> @@ -345,10 +351,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Выкарыстана <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ліміт <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Папярэджанне: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Працоўны профіль"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Апавяшчэнні і праграмы выключаныя"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Начная падсветка"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Уключаць увечары"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Да ўсходу сонца"</string> @@ -366,8 +370,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> адключана ў бяспечным рэжыме."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ачысціць усё"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перацягніце сюды, каб перайсці ў рэжым падзеленага экрана"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Падзяліць гарызантальна"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Падзяліць вертыкальна"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Падзяліць іншым чынам"</string> @@ -508,11 +510,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Адключыць"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Разгарнуць"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Згарнуць"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Змяніць прыладу аўдыявыхаду"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран замацаваны"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\"."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопку \"Агляд\"."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопку \"Галоўны экран\"."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Каб адмацаваць гэты экран, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Каб адмацаваць гэты экран, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Зразумела"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Не, дзякуй"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Экран замацаваны"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран адмацаваны"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Схаваць <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Гэта паведамленне з\'явіцца зноў у наступны раз, калі вы ўключыце яго ў наладах."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Схаваць"</string> @@ -535,8 +544,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дакраніцеся, каб уключыць вібрацыю."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дакраніцеся, каб адключыць гук"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Паказваецца наступная колькасць рэгулятараў гучнасці: %s. Правядзіце пальцам уверх, каб закрыць іх."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Рэгулятары гучнасці схаваны"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Рэгулятар гучнасці %s"</string> <string name="output_title" msgid="5355078100792942802">"Вывад мультымедыя"</string> <string name="output_calls_title" msgid="8717692905017206161">"Прылада вываду тэлефонных выклікаў"</string> <string name="output_none_found" msgid="5544982839808921091">"Прылады не знойдзены"</string> @@ -592,8 +600,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"З дапамогай пашыранага кіравання апавяшчэннямі вы можаце задаваць узровень важнасці апавяшчэнняў праграмы ад 0 да 5. \n\n"<b>"Узровень 5"</b>" \n- Паказваць уверсе спіса апавяшчэнняў \n- Дазваляць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 4"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 3"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n\n"<b>"Узровень 2"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n\n"<b>"Узровень 1"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n- Хаваць з экрана блакіроўкі і панэлі стану \n- Паказваць унізе спіса апавяшчэнняў \n\n"<b>"Узровень 0"</b>" \n- Блакіраваць усе апавяшчэнні ад праграмы"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Апавяшчэнні"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Вы больш не будзеце бачыць гэтыя апавяшчэнні"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Працягваць паказваць"</string> @@ -691,9 +698,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Буфер абмену"</item> <item msgid="5742013440802239414">"Код клавішы"</item> - <item msgid="8802889973626281575">"Пераключальнік клавіятуры"</item> - <item msgid="7095517796293767867">"Паварот"</item> - <item msgid="8494159969042135235">"Няма"</item> + <item msgid="1951959982985094069">"Пацвердзіць паварот, пераключыць раскладку"</item> + <item msgid="8175437057325747277">"Няма"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Звычайная"</item> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index 2a5ee20aa8b1..5468afaf1348 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"отваряне на камерата"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Избиране на ново оформление за задачите"</string> <string name="cancel" msgid="6442560571259935130">"Отказ"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона на приложението"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Област за помощно съобщение"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Бутон за промяна на мащаба с цел съвместимост."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Промяна на мащаба на екрана от по-малък до по-голям."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth е включен."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Витрина с десерти"</string> <string name="start_dreams" msgid="5640361424498338327">"Скрийнсейвър"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не безпокойте"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само с приоритет"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само будилници"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi е изключен"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Функцията за Wi-Fi е включена"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма налични Wi-Fi мрежи"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будилник"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Предаване"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Предава се"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Устройство без име"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Установява се връзка..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетъринг"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка за достъп"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Включва се..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d устройства</item> + <item quantity="one">%d устройство</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Известия"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Фенерче"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилни данни"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Използвано: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничение от <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупреждение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Служебен потребителски профил"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Известията и приложенията са изключени"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Нощно осветление"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ще се вкл. по залез"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрев"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложението <xliff:g id="APP">%s</xliff:g> е деактивирано в безопасния режим."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Изчистване на всичко"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Преместете тук с плъзгане, за да използвате режим за разделен екран"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хоризонтално разделяне"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Вертикално разделяне"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Персонализирано разделяне"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Изключване сега"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Разгъване"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Свиване"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Превключване на устройството за възпроизвеждане на звук"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екранът е фиксиран"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и този за общ преглед."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и „Начало“."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за общ преглед."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона „Начало“."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"За да освободите този екран, докоснете и задръжте бутона за връщане назад и този за общ преглед"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"За да освободите този екран, докоснете и задръжте бутона за връщане назад и „Начало“"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Разбрах"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Не, благодаря"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Екранът е фиксиран"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Екранът е освободен"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Да се скрие ли „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бързите настройки ще се покажат отново следващия път, когато ги включите от „Настройки“."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скриване"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Докоснете, за да зададете вибриране."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Докоснете, за да заглушите звука."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показани са контролите за силата на звука на %s. Прекарайте пръст нагоре, за да ги скриете."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контролите за силата на звука са скрити"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Контроли за силата на звука – %s"</string> <string name="output_title" msgid="5355078100792942802">"Изходяща мултимедия"</string> <string name="output_calls_title" msgid="8717692905017206161">"Изходящи телефонни обаждания"</string> <string name="output_none_found" msgid="5544982839808921091">"Няма намерени устройства"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"С помощта на контролите за известията можете да зададете ниво на важност от 0 до 5 за известията от дадено приложение. \n\n"<b>"Ниво 5"</b>" \n– Показване най-горе в списъка с известия. \n– Разрешаване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 4"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 3"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n\n"<b>"Ниво 2"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n\n"<b>"Ниво 1"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n– Скриване от заключения екран и лентата на състоянието. \n– Показване най-долу в списъка с известия. \n\n"<b>"Ниво 0"</b>" \n– Блокиране на всички известия от приложението."</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Известия"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Вече няма да виждате тези известия"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Да продължат да се показват"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Буферна памет"</item> <item msgid="5742013440802239414">"Клавишен код"</item> - <item msgid="8802889973626281575">"Превключвател на клавиатурата"</item> - <item msgid="7095517796293767867">"Предложение за завъртане"</item> - <item msgid="8494159969042135235">"Без"</item> + <item msgid="1951959982985094069">"Потвърждаване на завъртането, превключвател за клавиатурата"</item> + <item msgid="8175437057325747277">"Няма"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Нормално"</item> diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index eb08f5094db9..76b0c3f3d597 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string> <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"অ্যাপ্লিকেশনের আইকন"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"সহায়তার মেসেজ দেখানোর জায়গা"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ডেজার্ট কেস"</string> <string name="start_dreams" msgid="5640361424498338327">"স্ক্রিন সেভার"</string> <string name="ethernet_label" msgid="7967563676324087464">"ইথারনেট"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"বিরক্ত করবেন না"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"শুধুমাত্র অ্যালার্মগুলি"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ওয়াই-ফাই বন্ধ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"অ্যালার্ম"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"কাস্ট করুন"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"নিরাপদ মোডে <xliff:g id="APP">%s</xliff:g> অক্ষম করা হয়েছে৷"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"সবকিছু সাফ করুন"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভক্ত স্ক্রীন ব্যবহার করতে এখানে টেনে আনুন"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"অনুভূমিক স্প্লিট"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উল্লম্ব স্প্লিট"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"কাস্টম স্প্লিট করুন"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"এখনই বন্ধ করুন"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"বড় করুন"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"সঙ্কুচিত করুন"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"অন্য আউটপুট ডিভাইস বেছে নিন"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্রিন পিন করা হয়েছে"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ফিরুন এবং ওভারভিউ স্পর্শ করে ধরে থাকুন।"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"এর ফলে আপনি এটি আনপিন না করা পর্যন্ত এটি দেখানো হতে থাকবে। আনপিন করতে \"ফিরে যান\" এবং \"হোম\" বোতামদুটি ট্যাপ করে ধরে রাখুন।"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ওভারভিউ স্পর্শ করে ধরে থাকুন৷"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"এর ফলে আপনি এটি আনপিন না করা পর্যন্ত এটি দেখানো হতে থাকবে। আনপিন করতে \"হোম\" বোতামটি ট্যাপ করে ধরে রাখুন।"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"এই স্ক্রিনটি আনপিন করতে \"ফিরে যান\" এবং \"এক নজরে\" বোতামদুটি ট্যাপ করে ধরে রাখুন"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"এই স্ক্রিনটি আনপিন করতে \"ফিরে যান\" এবং \"হোম\" বোতামদুটি ট্যাপ করে ধরে রাখুন"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"বুঝেছি"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"না থাক"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"স্ক্রিন পিন করা হয়েছে"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"স্ক্রিন আনপিন করা হয়েছে"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকাবেন?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপনি পরের বার সেটিংস-এ এটি চালু করলে এটি উপস্থিত হবে"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকান"</string> @@ -541,8 +536,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। নিঃশব্দ করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ভাইব্রেট করতে ট্যাপ করুন।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। নিঃশব্দ করতে ট্যাপ করুন।"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ভলিউম নিয়ন্ত্রণগুলি দেখানো হয়েছে৷ খারিজ করতে উপরের দিকে সোয়াইপ করুন৷"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ভলিউম নিয়ন্ত্রণগুলি লুকানো রয়েছে"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ভলিউম নিয়ন্ত্রণ"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"মিডিয়া আউটপুট"</string> <string name="output_calls_title" msgid="8717692905017206161">"ফোন কল আউটপুট"</string> <string name="output_none_found" msgid="5544982839808921091">"কোনও ডিভাইস খুঁজে পাওয়া যায়নি"</string> @@ -692,9 +692,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ক্লিপবোর্ড"</item> <item msgid="5742013440802239414">"কীকোড"</item> - <item msgid="8802889973626281575">"কিবোর্ড স্যুইচার"</item> - <item msgid="7095517796293767867">"ঘুরিয়ে দেখার বিষয়ে প্রস্তাবনা"</item> - <item msgid="8494159969042135235">"কোনওটিই নয়"</item> + <item msgid="1951959982985094069">"ঘোরানো নিশ্চিত করুন, কীবোর্ডের ভাষা বদলানোর সুবিধা"</item> + <item msgid="8175437057325747277">"কোনো কিছুই নয়"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"সাধারণ"</item> diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index 676ecd0fe3a4..5d63af8e8910 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -104,6 +104,8 @@ <string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Otkaži"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Prostor za poruku za pomoć"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Slika sa desertima"</string> <string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> @@ -310,8 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi isključen"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nema dostupnih Wi-Fi mreža"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string> @@ -362,7 +365,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> je onemogućena u sigurnom načinu rada."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje za korištenje podijeljenog ekrana"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prevucite prema gore za promjenu aplikacije"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podjela po horizontali"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podjela po vertikali"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođena podjela"</string> @@ -503,25 +505,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi sada"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promijenite izlazni uređaj"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je prikačen"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da otkačite ekran, dodirnite i držite dugme Nazad i Početna."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da okačite ekran, dodirnite ili držite dugme Početna."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Dodirnite i držite dugmad Nazad i Pregled da otkačite ekran"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Dodirnite i držite dugmad Nazad i Početna da otkačite ekran."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Razumijem"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran je zakačen"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran je otkačen"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojavit će se sljedeći put kada opciju uključite u postavkama."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string> @@ -546,8 +541,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da isključite zvuk. Zvukovi usluga pristupačnosti mogu biti isključeni."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da postavite vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da isključite zvuk."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazane kontrole jačine zvuka za: %s. Prevucite prema gore za odbacivanje."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole jačine zvuka sakrivene"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće za %s"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Izlaz za medijske fajlove"</string> <string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonske pozive"</string> <string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string> @@ -699,9 +699,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Međumemorija"</item> <item msgid="5742013440802239414">"Kôd tipke"</item> - <item msgid="8802889973626281575">"Prebacivač tastatura"</item> - <item msgid="7095517796293767867">"Prijedlog rotacije"</item> - <item msgid="8494159969042135235">"Nema"</item> + <item msgid="1951959982985094069">"Potvrda rotiranjem, prebacivanje tastature"</item> + <item msgid="8175437057325747277">"Ništa"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normalna"</item> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 4eff30d6527e..a716a4b4b3af 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"obre la càmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el disseny de la tasca nova"</string> <string name="cancel" msgid="6442560571259935130">"Cancel·la"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona d\'aplicació"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Àrea de missatge d\'ajuda"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Capsa de postres"</string> <string name="start_dreams" msgid="5640361424498338327">"Estalvi de pantalla"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestis"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Només amb prioritat"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Només alarmes"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desconnectada"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"La Wi-Fi està activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hi ha cap xarxa Wi-Fi disponible"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emet"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"En mode segur, l\'aplicació <xliff:g id="APP">%s</xliff:g> està desactivada."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Esborra-ho tot"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrossega-ho aquí per utilitzar la pantalla dividida"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Llisca cap amunt per canviar d\'aplicació"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisió horitzontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisió vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisió personalitzada"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desactiva ara"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Amplia"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Replega"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Canvia el dispositiu de sortida"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"La pantalla està fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes els botons Enrere i Aplicacions recents."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premuts els botons Enrere i Inici."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premut el botó Aplicacions recents."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premut el botó d\'inici."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Aplicacions recents"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Inici"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"D\'acord"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, gràcies"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"S\'ha fitxat la pantalla"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"S\'ha deixat de fixar la pantalla"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vols amagar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tornarà a mostrar-se la propera vegada que l\'activis a la configuració."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Amaga"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca per activar la vibració."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca per silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Es mostren %s controls de volum. Llisca cap amunt per ignorar-ho."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Els controls de volum estan amagats"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controls de volum %s"</string> <string name="output_title" msgid="5355078100792942802">"Sortida de contingut multimèdia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Sortida de trucades"</string> <string name="output_none_found" msgid="5544982839808921091">"No s\'ha trobat cap dispositiu"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Porta-retalls"</item> <item msgid="5742013440802239414">"Codi de tecla"</item> - <item msgid="8802889973626281575">"Commutador del teclat"</item> - <item msgid="7095517796293767867">"Suggeriment de rotació"</item> - <item msgid="8494159969042135235">"Cap"</item> + <item msgid="1951959982985094069">"Confirma el gir de la pantalla, canvia de teclat"</item> + <item msgid="8175437057325747277">"Cap"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index faa1f1f5e083..75043bce2da3 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -105,6 +105,8 @@ <string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string> <string name="cancel" msgid="6442560571259935130">"Zrušit"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikace"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast pro zprávu nápovědy"</string> @@ -278,6 +280,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Pult se sladkostmi"</string> <string name="start_dreams" msgid="5640361424498338327">"Spořič obrazovky"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušit"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Pouze prioritní"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Pouze budíky"</string> @@ -314,8 +318,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi vypnuta"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Budík"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Odeslat"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string> @@ -367,7 +370,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikace <xliff:g id="APP">%s</xliff:g> je v nouzovém režimu zakázána."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazat vše"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Rozdělenou obrazovku můžete použít přetažením zde"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Přejetím nahoru přepnete aplikace"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vodorovné rozdělení"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikální rozdělení"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Vlastní rozdělení"</string> @@ -511,21 +513,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Přepnout zařízení pro výstup"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je připnuta"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítek Zpět a Plocha."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Přehled."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítka Plocha."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Chcete-li tuto obrazovku uvolnit, podržte tlačítka Zpět a Přehled"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Chcete-li tuto obrazovku uvolnit, podržte tlačítka Zpět a Plocha"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Rozumím"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, děkuji"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Obrazovka připnuta"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Obrazovka uvolněna"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skrýt <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tato položka se znovu zobrazí, až ji v nastavení znovu zapnete."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrýt"</string> @@ -548,8 +544,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrace."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovládací prvky hlasitosti aplikace %s jsou zobrazeny. Zavřete je přejetím prstem."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládací prvky hlasitosti jsou skryty"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Ovládací prvky hlasitosti %s"</string> <string name="output_title" msgid="5355078100792942802">"Výstup médií"</string> <string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonního hovoru"</string> <string name="output_none_found" msgid="5544982839808921091">"Nebyla nalezena žádná zařízení"</string> @@ -703,9 +698,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Schránka"</item> <item msgid="5742013440802239414">"Klávesa"</item> - <item msgid="8802889973626281575">"Přepínač klávesnice"</item> - <item msgid="7095517796293767867">"Doporučené otočení"</item> - <item msgid="8494159969042135235">"Žádné"</item> + <item msgid="1951959982985094069">"Potvrzení otočení, přepínač na klávesnici"</item> + <item msgid="8175437057325747277">"Žádné"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normální"</item> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 9ebd49245a76..32ddcd500897 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"åbn kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vælg nyt opgavelayout"</string> <string name="cancel" msgid="6442560571259935130">"Annuller"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appens ikon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område med hjælpemeddelelse"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertcase"</string> <string name="start_dreams" msgid="5640361424498338327">"Pauseskærm"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Forstyr ikke"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kun prioritet"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kun alarmer"</string> @@ -532,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryk for at aktivere vibration."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryk for at slå lyden fra."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lydstyrkeknapperne for %s er synlige. Stryg op for at lukke."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lydstyrkeknapperne er skjult"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s lydstyrkeknapper"</string> <string name="output_title" msgid="5355078100792942802">"Medieafspilning"</string> <string name="output_calls_title" msgid="8717692905017206161">"Udgang til telefonopkald"</string> <string name="output_none_found" msgid="5544982839808921091">"Der blev ikke fundet nogen enheder"</string> @@ -683,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Udklipsholder"</item> <item msgid="5742013440802239414">"Tastekode"</item> - <item msgid="8802889973626281575">"Tastaturskifter"</item> - <item msgid="7095517796293767867">"Rotationsforslag"</item> - <item msgid="8494159969042135235">"Ingen"</item> + <item msgid="1951959982985094069">"Rotationsbekræftelse, tastaturskifter"</item> + <item msgid="8175437057325747277">"Ingen"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index dd258e107e87..882b2783843a 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"Kamera öffnen"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Neues Aufgabenlayout auswählen"</string> <string name="cancel" msgid="6442560571259935130">"Abbrechen"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"App-Symbol"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Bereich für die Hilfemeldung"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Schaltfläche für Kompatibilitätszoom"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom auf einen größeren Bildschirm"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Mit Bluetooth verbunden"</string> @@ -279,6 +278,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertbehälter"</string> <string name="start_dreams" msgid="5640361424498338327">"Bildschirmschoner"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nicht stören"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Nur wichtige Unterbrechungen"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Nur Wecker"</string> @@ -315,6 +316,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WLAN aus"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN an"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Keine WLANs verfügbar"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wecker"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Streamen"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Wird übertragen"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unbenanntes Gerät"</string> @@ -331,9 +333,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Wird aktiviert…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d Geräte</item> + <item quantity="one">%d Gerät</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Benachrichtigungen"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taschenlampe"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile Daten"</string> @@ -343,10 +347,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> verwendet"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> Datenlimit"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Warnung für <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Arbeitsprofil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Benachrichtigungen und Apps deaktiviert"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nachtlicht"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"An bei Sonnenuntergang"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Bis Sonnenaufgang"</string> @@ -364,8 +366,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ist im abgesicherten Modus deaktiviert."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alle schließen"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Hierher ziehen, um den Bildschirm zu teilen"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Geteilte Schaltfläche – horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Geteilte Schaltfläche – vertikal"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Geteilte Schaltfläche – benutzerdefiniert"</string> @@ -506,11 +506,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Jetzt deaktivieren"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Maximieren"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Minimieren"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ausgabegerät wechseln"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Bildschirm ist fixiert"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Startbildschirm\"."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Um die Fixierung für diesen Bildschirm aufzuheben, berühre und halte \"Zurück\" und \"Übersicht\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Um die Fixierung für diesen Bildschirm aufzuheben, berühre und halte \"Zurück\" und \"Startbildschirm\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nein danke"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Bildschirm fixiert"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Fixierung für Bildschirm aufgehoben"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ausblenden"</string> @@ -533,8 +540,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Zum Aktivieren der Vibration tippen."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Zum Stummschalten tippen."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lautstärkeregler von %s werden angezeigt. Zum Schließen nach oben wischen."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lautstärkeregler ausgeblendet"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Lautstärkeregler von %s"</string> <string name="output_title" msgid="5355078100792942802">"Medienausgabe"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefonanrufausgabe"</string> <string name="output_none_found" msgid="5544982839808921091">"Keine Geräte gefunden"</string> @@ -590,8 +596,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Mit den erweiterten Benachrichtigungseinstellungen kannst du für App-Benachrichtigungen eine Wichtigkeitsstufe von 0 bis 5 festlegen. \n\n"<b>"Stufe 5"</b>" \n- Auf der Benachrichtigungsleiste ganz oben anzeigen \n- Vollbildunterbrechung zulassen \n- Immer kurz einblenden \n\n"<b>"Stufe 4"</b>" \n- Keine Vollbildunterbrechung \n- Immer kurz einblenden \n\n"<b>"Stufe 3"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n\n"<b>"Stufe 2"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n\n"<b>"Stufe 1"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n- Auf Sperrbildschirm und Statusleiste verbergen \n- Auf der Benachrichtigungsleiste ganz unten anzeigen \n\n"<b>"Stufe 0"</b>" \n- Alle Benachrichtigungen der App sperren"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Benachrichtigungen"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Du erhältst diese Benachrichtigungen nicht mehr"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Weiterhin anzeigen"</string> @@ -685,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Zwischenablage"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Tastaturwechsler"</item> - <item msgid="7095517796293767867">"Drehvorschlag"</item> - <item msgid="8494159969042135235">"Keine"</item> + <item msgid="1951959982985094069">"Drehen bestätigen, Tastaturwechsler"</item> + <item msgid="8175437057325747277">"Keine"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Mittig"</item> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 8c3052132dba..9c3a013437f3 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"άνοιγμα φωτογραφικής μηχανής"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Επιλέξτε τη νέα διάταξη εργασίας"</string> <string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Εικονίδιο εφαρμογής"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Περιοχή μηνυμάτων βοήθειας"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Κουμπί εστίασης συμβατότητας."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ζουμ από μικρότερη σε μεγαλύτερη οθόνη."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Το Bluetooth είναι συνδεδεμένο."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Επιδόρπιο"</string> <string name="start_dreams" msgid="5640361424498338327">"Προφύλαξη οθόνης"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Μην ενοχλείτε"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Μόνο προτεραιότητας"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Μόνο ειδοποιήσεις"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ανενεργό"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Ενεργό Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Δεν υπάρχουν διαθέσιμα δίκτυα Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ξυπνητήρι"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Μετάδοση"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Μετάδοση"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ανώνυμη συσκευή"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ενεργοποίηση…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d συσκευές</item> + <item quantity="one">%d συσκευή</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ειδοποιήσεις"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Φακός"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Δεδομένα κινητής τηλεφωνίας"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Χρησιμοποιούνται <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Όριο <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Προειδοποίηση για <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Προφίλ εργασίας"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Οι ειδοποιήσεις και οι εφαρμογές είναι απενεργοποιημένες"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Νυχτερινός φωτισμός"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Κατά τη δύση"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Μέχρι την ανατολή"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> έχει απενεργοποιηθεί στην ασφαλή λειτουργία."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Διαγραφή όλων"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Σύρετε εδώ για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Οριζόντιος διαχωρισμός"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Κάθετος διαχωρισμός"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Προσαρμοσμένος διαχωρισμός"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Απενεργοποίηση τώρα"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Ανάπτυξη"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Σύμπτυξη"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Εναλλαγή συσκευής εξόδου"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Η οθόνη καρφιτσώθηκε"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Επιστροφή\" και \"Επισκόπηση\" για ξεκαρφίτσωμα."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Με αυτόν τον τρόπο, παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Πίσω\" και \"Αρχική οθόνη\" για ξεκαρφίτσωμα."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα την \"Επισκόπηση\" για ξεκαρφίτσωμα."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Με αυτόν τον τρόπο, παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα το στοιχείο \"Αρχική οθόνη\" για ξεκαρφίτσωμα."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Επισκόπηση\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Αρχική οθόνη\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Το κατάλαβα"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Όχι"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Η οθόνη καρφιτσώθηκε"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Η οθόνη ξεκαρφιτσώθηκε"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Απόκρυψη <xliff:g id="TILE_LABEL">%1$s</xliff:g>;"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Θα εμφανιστεί ξανά την επόμενη φορά που θα το ενεργοποιήσετε στις ρυθμίσεις."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Απόκρυψη"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Πατήστε για να ενεργοποιήσετε τη δόνηση."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Πατήστε για σίγαση."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Εμφανίζονται τα στοιχεία ελέγχου έντασης %s. Σύρετε για παράβλεψη."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Έγινε απόκρυψη των στοιχείων ελέγχου έντασης"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s στοιχεία ελέγχου έντασης ήχου"</string> <string name="output_title" msgid="5355078100792942802">"Έξοδος μέσων"</string> <string name="output_calls_title" msgid="8717692905017206161">"Έξοδος τηλεφωνικής κλήσης"</string> <string name="output_none_found" msgid="5544982839808921091">"Δεν βρέθηκαν συσκευές"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Με τα στοιχεία ελέγχου ειδοποίησης ισχύος, μπορείτε να ορίσετε ένα επίπεδο βαρύτητας από 0 έως 5 για τις ειδοποιήσεις μιας εφαρμογής. \n\n"<b>"Επίπεδο 5"</b>" \n- Εμφάνιση στην κορυφή της λίστας ειδοποιήσεων \n- Να επιτρέπεται η διακοπή πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 4"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 3"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n\n"<b>"Επίπεδο 2"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n\n"<b>"Επίπεδο 1"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n- Απόκρυψη από την οθόνη κλειδώματος και τη γραμμή κατάστασης \n- Εμφάνιση στο κάτω μέρος της λίστας ειδοποιήσεων \n\n"<b>"Επίπεδο 0"</b>" \n- Αποκλεισμός όλων των ειδοποιήσεων από την εφαρμογή"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Ειδοποιήσεις"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Δεν θα βλέπετε πλέον αυτές τις ειδοποιήσεις"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Συνέχιση εμφάνισης"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Πρόχειρο"</item> <item msgid="5742013440802239414">"Κωδικός-πλήκτρο"</item> - <item msgid="8802889973626281575">"Εναλλαγή πληκτρολογίων"</item> - <item msgid="7095517796293767867">"Πρόταση περιστροφής"</item> - <item msgid="8494159969042135235">"Κανένα"</item> + <item msgid="1951959982985094069">"Επιβεβαίωση περιστροφής, εναλλαγή πληκτρολογίου"</item> + <item msgid="8175437057325747277">"Κανένα"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Κανονική"</item> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 3e9e3a2349e3..df2a74e1785b 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -540,8 +534,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Media output"</string> <string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string> <string name="output_none_found" msgid="5544982839808921091">"No devices found"</string> @@ -691,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Rotation suggestion"</item> - <item msgid="8494159969042135235">"None"</item> + <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item> + <item msgid="8175437057325747277">"None"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index e5f4ecedc679..4c05e9606f36 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -540,8 +534,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Media output"</string> <string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string> <string name="output_none_found" msgid="5544982839808921091">"No devices found"</string> @@ -691,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Rotation suggestion"</item> - <item msgid="8494159969042135235">"None"</item> + <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item> + <item msgid="8175437057325747277">"None"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 3e9e3a2349e3..df2a74e1785b 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -540,8 +534,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Media output"</string> <string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string> <string name="output_none_found" msgid="5544982839808921091">"No devices found"</string> @@ -691,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Rotation suggestion"</item> - <item msgid="8494159969042135235">"None"</item> + <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item> + <item msgid="8175437057325747277">"None"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 3e9e3a2349e3..df2a74e1785b 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -540,8 +534,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Media output"</string> <string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string> <string name="output_none_found" msgid="5544982839808921091">"No devices found"</string> @@ -691,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Rotation suggestion"</item> - <item msgid="8494159969042135235">"None"</item> + <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item> + <item msgid="8175437057325747277">"None"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml index 35cef208cb30..fc3482ff8583 100644 --- a/packages/SystemUI/res/values-en-rXC/strings.xml +++ b/packages/SystemUI/res/values-en-rXC/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"open camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string> <string name="cancel" msgid="6442560571259935130">"Cancel"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No thanks"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string> @@ -540,8 +534,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string> <string name="output_title" msgid="5355078100792942802">"Media output"</string> <string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string> <string name="output_none_found" msgid="5544982839808921091">"No devices found"</string> @@ -691,9 +684,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Rotation suggestion"</item> - <item msgid="8494159969042135235">"None"</item> + <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item> + <item msgid="8175437057325747277">"None"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index d02ce1cd6e68..f98ed6b9d5ad 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el nuevo diseño de la tarea."</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícono de la aplicación"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensajes de ayuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string> <string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioridad"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desactivada"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay redes Wi-Fi disponibles"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmitiendo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string> @@ -329,9 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activando…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositivos</item> + <item quantity="one">%d dispositivo</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Datos móviles"</string> @@ -341,10 +345,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Utilizados: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de trabajo"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Las notificaciones y las apps están desactivadas"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz nocturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string> @@ -362,8 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> está inhabilitada en modo seguro."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para usar la pantalla dividida"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string> @@ -504,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desactivar ahora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Contraer"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambiar dispositivo de salida"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fija"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones Atrás y Recientes."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones de inicio y Atrás."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón Recientes."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón de inicio."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Para dejar de fijar esta pantalla, mantén presionados los botones Atrás y Recientes"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para dejar de fijar esta pantalla, mantén presionados los botones de inicio y Atrás"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendido"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, gracias"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Pantalla fija"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Pantalla no fija"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que se active en la configuración."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -531,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Presiona para establecer el modo vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Presiona para silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Se muestran los controles de volumen de %s. Desliza el dedo para descartar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string> <string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Salida de llamada telefónica"</string> <string name="output_none_found" msgid="5544982839808921091">"No se encontraron dispositivos"</string> @@ -588,8 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Con los controles de activación de notificaciones, puedes establecer un nivel de importancia para las notificaciones de una app. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones. \n- Permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 4"</b>" \n- No permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 3"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n\n"<b>"Nivel 2"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n\n"<b>"Nivel 1"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n- Ocultar de la pantalla bloqueada y la barra de estado. \n- Mostrar al final de la lista de notificaciones. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la app."</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Ya no verás estas notificaciones"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Seguir viendo"</string> @@ -683,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Portapapeles"</item> <item msgid="5742013440802239414">"Clave de código"</item> - <item msgid="8802889973626281575">"Cambio de teclado"</item> - <item msgid="7095517796293767867">"Sugerencia de rotación"</item> - <item msgid="8494159969042135235">"Ninguno"</item> + <item msgid="1951959982985094069">"Confirmar rotación, cambiar de teclado"</item> + <item msgid="8175437057325747277">"Ninguno"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 2a409a51574e..3b9a49f97dbc 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -32,7 +32,7 @@ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string> <string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string> - <string name="battery_low_title" msgid="6456385927409742437">"Nivel de batería bajo"</string> + <string name="battery_low_title" msgid="6456385927409742437">"Batería baja"</string> <string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca batería. Activa la función Ahorro de batería"</string> <string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de batería"</string> <string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">%s</xliff:g>)"</string> @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar diseño de tarea nueva"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icono de aplicación"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensaje de ayuda"</string> @@ -274,6 +275,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string> <string name="start_dreams" msgid="5640361424498338327">"Salvapantallas"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Mantén pulsados los iconos para ver más opciones"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioritarias"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string> @@ -310,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desactivado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay ninguna red Wi-Fi disponible"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Enviar"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Enviando"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string> @@ -361,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para utilizar la pantalla dividida"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Desliza el dedo hacia arriba para cambiar de aplicación"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string> @@ -505,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambiar dispositivo de salida"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fijada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás y Aplicaciones recientes."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás e Inicio."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Aplicaciones recientes."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Inicio."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Mantén pulsado el botón Atrás y el de aplicaciones recientes para dejar de fijar esta pantalla"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Mantén pulsado el botón Atrás y el de Inicio para dejar de fijar esta pantalla"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendido"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, gracias"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Pantalla fijada"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"La pantalla ya no está fija"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que actives esta opción en Ajustes."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -542,8 +536,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para activar la vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volumen mostrados. Desliza el dedo hacia arriba para rechazar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Salida de llamadas"</string> <string name="output_none_found" msgid="5544982839808921091">"No se ha podido encontrar ningún dispositivo"</string> @@ -693,9 +692,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Portapapeles"</item> <item msgid="5742013440802239414">"Código de teclado"</item> - <item msgid="8802889973626281575">"Cambio de teclado"</item> - <item msgid="7095517796293767867">"Sugerencia de rotación"</item> - <item msgid="8494159969042135235">"Ninguna"</item> + <item msgid="1951959982985094069">"Confirmar rotación, cambiar de teclado"</item> + <item msgid="8175437057325747277">"Ninguno"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index eac4814c8c55..914104664a56 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"ava kaamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Uue toimingu paigutuse valimine"</string> <string name="cancel" msgid="6442560571259935130">"Tühista"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Rakenduse ikoon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Abisõnumi ala"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Sobivussuumi nupp."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Suumi suuremale ekraanile vähem."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth on ühendatud."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Maiustusekorv"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekraanisäästja"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mitte segada"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Ainult prioriteetsed"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ainult äratused"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WiFi-ühendus on väljas"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi on sees"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"WiFi-võrke pole saadaval"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Hoiatus"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Ülekandmine"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Osatäitjad"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimeta seade"</string> @@ -329,9 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Ühenduse loomine ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jagamine"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Kuumkoht"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Sisselülitamine …"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d seadet</item> + <item quantity="one">%d seade</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Märguanded"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taskulamp"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiilne andmeside"</string> @@ -341,10 +345,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> on kasutatud"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hoiatus"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Tööprofiil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Märguanded ja rakendused on välja lülitatud"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Öövalgus"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Sissel. päikeselooj."</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuni päikesetõusuni"</string> @@ -362,8 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Rakendus <xliff:g id="APP">%s</xliff:g> on turvarežiimis keelatud."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kustuta kõik"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Jagatud ekraani kasutamiseks lohistage siia"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horisontaalne poolitamine"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikaalne poolitamine"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Kohandatud poolitamine"</string> @@ -504,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Lülita kohe välja"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Laiendamine"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ahendamine"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Väljundseadme vahetamine"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekraan on kinnitatud"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Ülevaade."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Avaekraan."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Selge"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Tänan, ei"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekraanikuva on kinnitatud"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekraanikuva on vabastatud"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Kas peita <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"See kuvatakse uuesti järgmisel korral, kui selle seadetes sisse lülitate."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Peida"</string> @@ -531,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Puudutage vibreerimise määramiseks."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Puudutage vaigistamiseks."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s helitugevuse juhtnuppu on kuvatud. Loobumiseks pühkige üles."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Helitugevuse juhtnupud on peidetud"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Helitugevuse juhtnupud: %s"</string> <string name="output_title" msgid="5355078100792942802">"Meediaväljund"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefonikõne väljund"</string> <string name="output_none_found" msgid="5544982839808921091">"Seadmeid ei leitud"</string> @@ -588,8 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Toite märguannete juhtnuppudega saate määrata rakenduse märguannete tähtsuse taseme vahemikus 0–5. \n\n"<b>"5. tase"</b>" \n- Kuva märguannete loendi ülaosas\n- Luba täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"4. tase"</b>" \n- Keela täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"3. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n\n"<b>"2. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n\n"<b>"1. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n- Peida lukustuskuval ja olekuribal \n- Kuva märguannete loendi allosas \n\n"<b>"Tase 0"</b>" \n- Blokeeri kõik rakenduse märguanded"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Märguanded"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Te ei näe enam neid märguandeid"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Jätka kuvamist"</string> @@ -683,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Lõikelaud"</item> <item msgid="5742013440802239414">"Võtmekood"</item> - <item msgid="8802889973626281575">"Klaviatuuri vahetaja"</item> - <item msgid="7095517796293767867">"Pööramise soovitus"</item> - <item msgid="8494159969042135235">"Puudub"</item> + <item msgid="1951959982985094069">"Pööramise kinnitamine, klaviatuuri vahetaja"</item> + <item msgid="8175437057325747277">"Mitte ükski"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Tavaline"</item> diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 9b52656d04a5..0d4789e0ea2b 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ireki kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Hautatu zereginen diseinua"</string> <string name="cancel" msgid="6442560571259935130">"Utzi"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Aplikazioaren ikonoa"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Laguntza-mezuaren eremua"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Postreen kutxa"</string> <string name="start_dreams" msgid="5640361424498338327">"Pantaila-babeslea"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ez molestatu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Lehentasunezkoak soilik"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmak soilik"</string> @@ -534,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Sakatu hau dardara ezartzeko."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sakatu hau audioa desaktibatzeko."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Bolumena kontrolatzeko %s aukera daude ikusgai. Pasatu hatza gora baztertzeko."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ezkutatuta daude bolumena kontrolatzeko aukerak"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s gailuaren bolumena kontrolatzeko aukerak"</string> <string name="output_title" msgid="5355078100792942802">"Multimedia-irteera"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefono-deiaren irteera"</string> <string name="output_none_found" msgid="5544982839808921091">"Ez da aurkitu gailurik"</string> @@ -685,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Arbela"</item> <item msgid="5742013440802239414">"Tekla-kodea"</item> - <item msgid="8802889973626281575">"Teklatu-aldatzailea"</item> - <item msgid="7095517796293767867">"Biratzeko iradokizuna"</item> - <item msgid="8494159969042135235">"Bat ere ez"</item> + <item msgid="1951959982985094069">"Biratu berresteko, teklatu-aldatzailea"</item> + <item msgid="8175437057325747277">"Bat ere ez"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normala"</item> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index a5543d394d31..9dcdf68b259e 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"باز کردن دوربین"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرحبندی جدید کار"</string> <string name="cancel" msgid="6442560571259935130">"لغو"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"نماد برنامه"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"بخش پیام راهنما"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"دکمه بزرگنمایی سازگار."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"بزرگنمایی از صفحههای کوچک تا بزرگ."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"بلوتوث متصل است."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ویترین دسر"</string> <string name="start_dreams" msgid="5640361424498338327">"محافظ صفحه"</string> <string name="ethernet_label" msgid="7967563676324087464">"اترنت"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"مزاحم نشوید"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"فقط اولویتدار"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"فقط هشدارها"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi خاموش است"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi روشن"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"هیچ شبکه Wi-Fi موجود نیست"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"هشدار"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"فرستادن"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"در حال فرستادن"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"دستگاه بدون نام"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"در حال اتصال..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"اتصال به اینترنت با تلفن همراه"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"درحال روشن کردن…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d دستگاه</item> + <item quantity="other">%d دستگاه</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"اعلانها"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"چراغ قوه"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"داده تلفن همراه"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استفاده شده"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> محدودیت"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"هشدار <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"نمایه کاری"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"اعلانها و برنامهها خاموش است"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"نور شب"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"غروب روشن میشود"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"تا طلوع"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> در حالت ایمن غیرفعال است."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"پاک کردن همه"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"برای استفاده از تقسیم صفحه، به اینجا بکشید"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسیم افقی"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسیم عمودی"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"سفارشی کردن تقسیم"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"اکنون خاموش کنید"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"بزرگ کردن"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"کوچک کردن"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"تغییر دستگاه خروجی"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"صفحه نمایش پین شد"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «نمای کلی» را لمس کنید و نگهدارید."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «نمای کلی» را لمس کنید و نگهدارید."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «صفحه اصلی» را لمس کنید و نگهدارید."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"برای برداشتن پین این صفحه، دکمههای «برگشت» و «نمای کلی» را لمس کنید و نگهدارید"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"برای برداشتن پین این صفحه، دکمههای «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"متوجه شدم"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"نه متشکرم"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"صفحه پین شد"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"پین صفحه برداشته شد"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> مخفی شود؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"دفعه بعد که آن را روشن کنید، در تنظیمات نشان داده میشود."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"پنهان کردن"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای بیصدا کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. برای تنظیم روی لرزش، ضربه بزنید."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. برای بیصدا کردن ضربه بزنید."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"کنترلهای میزان صدای %s نشان داده شدند. برای نپذیرفتن انگشتتان را تند بکشید."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"کنترلهای صدا پنهان هستند"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s کنترلهای میزان صدا"</string> <string name="output_title" msgid="5355078100792942802">"خروجی رسانه"</string> <string name="output_calls_title" msgid="8717692905017206161">"خروجی تماس تلفنی"</string> <string name="output_none_found" msgid="5544982839808921091">"دستگاهی پیدا نشد"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"با کنترلهای قدرتمند اعلان میتوانید سطح اهمیت اعلانهای هر برنامه را از ۰ تا ۵ تعیین کنید. \n\n"<b>"سطح ۵"</b>" \n- در صدر فهرست اعلانها نشان داده میشود \n- وقفه برای نمایش تمامصفحه مجاز است \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۴"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۳"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n\n"<b>"سطح ۲"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا و لرزش ایجاد نمیکند \n\n"<b>"سطح ۱"</b>" \n- نمایش تمام صفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا یا لرزش ایجاد نمیکند \n- در قفل صفحه و نوار وضعیت پنهان است \n- در پایین فهرست اعلانها نشان داده میشود \n\n"<b>"سطح ۰"</b>" \n- همه اعلانهای این برنامه مسدود است"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"اعلانها"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"دیگر این اعلانها را نخواهید دید"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"بریدهدان"</item> <item msgid="5742013440802239414">"کد کلید"</item> - <item msgid="8802889973626281575">"تغییردهنده صفحهکلید"</item> - <item msgid="7095517796293767867">"پیشنهاد چرخش"</item> - <item msgid="8494159969042135235">"هیچکدام"</item> + <item msgid="1951959982985094069">"تأیید چرخش، تغییردهنده صفحهکلید"</item> + <item msgid="8175437057325747277">"هیچکدام"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"معمولی"</item> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index e7fcb43e0ab2..7daf74db9cc6 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"avaa kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Valitse uusi tehtävien asettelu"</string> <string name="cancel" msgid="6442560571259935130">"Peruuta"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Sovelluskuvake"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Ohjeviestialue"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Jälkiruokavitriini"</string> <string name="start_dreams" msgid="5640361424498338327">"Näytönsäästäjä"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Älä häiritse"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vain tärkeät"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vain herätykset"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi-yhteys pois käytöstä"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi on käytössä"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ei Wi-Fi-verkkoja käytettävissä"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Hälytys"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Suoratoisto"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Lähetetään"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimetön laite"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> on poistettu käytöstä vikasietotilassa."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tyhjennä kaikki"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Jaa näyttö vetämällä tähän."</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Vaihda sovellusta pyyhkäisemällä ylös"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vaakasuuntainen jako"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pystysuuntainen jako"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Muokattu jako"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Vaihda toistolaitetta"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Näyttö on kiinnitetty"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Aloitusnäyttö."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Viimeisimmät."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Aloitusnäyttö."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Irrota näyttö koskettamalla pitkään Takaisin- ja Viimeisimmät-painikkeita"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Irrota näyttö koskettamalla pitkään Takaisin- ja Aloitusnäyttö-painikkeita"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Selvä"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ei kiitos"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Näyttö kiinnitetty"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Näyttö irrotettu"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Piilotetaanko <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Se tulee takaisin näkyviin, kun seuraavan kerran otat sen käyttöön asetuksissa."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Piilota"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Siirry värinätilaan napauttamalla."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Mykistä napauttamalla."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Äänenvoimakkuuden säätimiä on näkyvissä (%s). Hylkää pyyhkäisemällä ylös."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Äänenvoimakkuuden säätimet piilotettiin."</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Äänenvoimakkuuden säädin: %s"</string> <string name="output_title" msgid="5355078100792942802">"Median äänentoisto"</string> <string name="output_calls_title" msgid="8717692905017206161">"Puhelun äänentoisto"</string> <string name="output_none_found" msgid="5544982839808921091">"Laitteita ei löytynyt"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Leikepöytä"</item> <item msgid="5742013440802239414">"Näppäinkoodi"</item> - <item msgid="8802889973626281575">"Näppäimistövalitsin"</item> - <item msgid="7095517796293767867">"Kiertoehdotus"</item> - <item msgid="8494159969042135235">"Ei mitään"</item> + <item msgid="1951959982985094069">"Vahvista kiertäminen, vaihda näppäimistöä"</item> + <item msgid="8175437057325747277">"Ei mitään"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normaali"</item> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index fe8f6d55193a..7ceb7ee18043 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string> <string name="cancel" msgid="6442560571259935130">"Annuler"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône de l\'application"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string> <string name="start_dreams" msgid="5640361424498338327">"Écran de veille"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires seulement"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes seulement"</string> @@ -534,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Touchez pour activer les vibrations."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Touchez pour couper le son."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Les commandes de volume sont masquées"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume de %s"</string> <string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Sortie d\'appel téléphonique"</string> <string name="output_none_found" msgid="5544982839808921091">"Aucun appareil trouvé"</string> @@ -685,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Presse-papiers"</item> <item msgid="5742013440802239414">"Code de touche"</item> - <item msgid="8802889973626281575">"Sélecteur de clavier"</item> - <item msgid="7095517796293767867">"Suggestion de rotation"</item> - <item msgid="8494159969042135235">"Aucun"</item> + <item msgid="1951959982985094069">"Confirmation de rotation, changeur de clavier"</item> + <item msgid="8175437057325747277">"Aucun"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normale"</item> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index cc8bcbab4e15..1c0b8c0029e7 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -88,6 +88,7 @@ <string name="accessibility_home" msgid="8217216074895377641">"Accueil"</string> <string name="accessibility_menu" msgid="316839303324695949">"Menu"</string> <string name="accessibility_accessibility_button" msgid="7601252764577607915">"Accessibilité"</string> + <string name="accessibility_rotate_button" msgid="7402949513740253006">"Faire pivoter l\'écran"</string> <string name="accessibility_recent" msgid="5208608566793607626">"Aperçu"</string> <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string> @@ -102,6 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"ouvrir l\'appareil photo"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau plan de tâche"</string> <string name="cancel" msgid="6442560571259935130">"Annuler"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône d\'application"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string> @@ -180,7 +186,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> - <string name="accessibility_work_mode" msgid="2478631941714607225">"Mode Travail"</string> + <!-- no translation found for accessibility_work_mode (702887484664647430) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string> @@ -269,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string> <string name="start_dreams" msgid="5640361424498338327">"Économiseur d\'écran"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires uniquement"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string> @@ -277,6 +286,10 @@ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth désactivé"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Aucun appareil associé disponible."</string> + <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batterie"</string> + <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> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string> <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Rotation automatique de l\'écran"</string> @@ -301,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi disponible"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Caster"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string> @@ -317,6 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès"</string> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activation..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d appareil</item> + <item quantity="other">%d appareils</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampe de poche"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Données mobiles"</string> @@ -326,8 +345,13 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilisés"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> au maximum"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Mode Travail"</string> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil professionnel"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notifications et les applications sont désactivées"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éclairage nocturne"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activé au crépuscule"</string> + <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activé à <xliff:g id="TIME">%s</xliff:g>"</string> + <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string> @@ -480,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Désactiver"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Développer"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Réduire"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Changer de périphérique de sortie"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Écran épinglé"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons Retour et Aperçu."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\"."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton Aperçu."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton \"Accueil\"."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons \"Retour\" et \"Aperçu\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Non, merci"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Écran épinglé"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Épinglage d\'écran annulé"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g> ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Masquer"</string> @@ -507,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Appuyez pour mettre en mode vibreur."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Appuyez pour ignorer."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Commandes de volume masquées"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume %s"</string> <string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Sortie de l\'appel téléphonique"</string> <string name="output_none_found" msgid="5544982839808921091">"Aucun appareil détecté"</string> @@ -564,6 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Grâce aux commandes de gestion des notifications, vous pouvez définir le niveau d\'importance (compris entre 0 et 5) des notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher en haut de la liste des notifications \n- Autoriser l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 4"</b>" \n- Empêcher l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 3"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n\n"<b>"Niveau 2"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n\n"<b>"Niveau 1"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n- Masquer les notifications dans l\'écran de verrouillage et la barre d\'état \n- Afficher au bas de la liste des notifications \n\n"<b>"Niveau 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Vous ne recevrez plus ces notifications"</string> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Continuer d\'afficher les notifications"</string> @@ -657,7 +688,7 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Presse-papiers"</item> <item msgid="5742013440802239414">"Code de touche"</item> - <item msgid="8802889973626281575">"Sélecteur clavier"</item> + <item msgid="1951959982985094069">"Confirmer la rotation, commutateur de clavier"</item> <item msgid="8175437057325747277">"Aucun"</item> </string-array> <string-array name="nav_bar_layouts"> @@ -782,4 +813,10 @@ <string name="running_foreground_services_msg" msgid="6326247670075574355">"Appuyer pour obtenir des informations sur l\'utilisation de la batterie et des données"</string> <string name="data_usage_disable_mobile" msgid="5116269981510015864">"Désactiver les données mobiles ?"</string> <string name="touch_filtered_warning" msgid="8671693809204767551">"L\'application Paramètres ne peut pas valider votre réponse, car une application masque la demande d\'autorisation."</string> + <string name="slice_permission_title" msgid="7465009437851044444">"Autoriser <xliff:g id="APP_0">%1$s</xliff:g> à afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g> ?"</string> + <string name="slice_permission_text_1" msgid="3514586565609596523">"- Accès aux informations de <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="slice_permission_text_2" msgid="3146758297471143723">"- Capacité d\'action dans <xliff:g id="APP">%1$s</xliff:g>"</string> + <string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des éléments de n\'importe quelle application"</string> + <string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string> + <string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string> </resources> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 8f049cd7b0db..6d927ea189cb 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar novo deseño de tarefas"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona de aplicación"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensaxes de axuda"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidade"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilidade co tamaño da pantalla."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Caixa de sobremesa"</string> <string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non molestar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Só alarmas"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi desactivada"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi activada"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Non hai redes wifi dispoñibles"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emisión"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Emitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sen nome"</string> @@ -329,9 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Conexión compartida"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona wifi"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activando…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d dispositivos</item> + <item quantity="one">%d dispositivo</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificacións"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Datos móbiles"</string> @@ -341,10 +345,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> usados"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de traballo"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"As notificacións e as aplicacións están desactivadas"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz nocturna"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activación ao solpor"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ata o amencer"</string> @@ -362,8 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"A aplicación <xliff:g id="APP">%s</xliff:g> está desactivada no modo seguro"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastrar aquí para usar a pantalla dividida"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dividir en horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dividir en vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dividir de xeito personalizado"</string> @@ -504,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Desactivar agora"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Ampliar"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Contraer"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambia ao dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A pantalla está fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás e Visión xeral."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás e Inicio."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Visión xeral."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Inicio."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Para soltar a pantalla, mantén premidos os botóns Volver e Visión xeral"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para soltar a pantalla, mantén premidos os botóns Atrás e Inicio"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"De acordo"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Non, grazas"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Fixouse a pantalla"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Soltouse a pantalla"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Queres ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá aparecer a próxima vez que se active na configuración."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -531,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para establecer a vibración."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Estanse mostrando os controis de volume de %s. Pasa o dedo cara a arriba para ignoralos."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ocultáronse os controis de volume"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controis de volume de %s"</string> <string name="output_title" msgid="5355078100792942802">"Saída multimedia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Saída de chamadas telefónicas"</string> <string name="output_none_found" msgid="5544982839808921091">"Non se atopou ningún dispositivo"</string> @@ -588,8 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Cos controis de notificacións mellorados, podes asignarlles un nivel de importancia comprendido entre 0 e 5 ás notificacións dunha aplicación determinada. \n\n"<b>"Nivel 5"</b>" \n- Mostrar na parte superior da lista de notificacións. \n- Permitir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 4"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 3"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n\n"<b>"Nivel 2"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n\n"<b>"Nivel 1"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n- Ocultar na pantalla de bloqueo e na barra de estado. \n- Mostrar na parte inferior da lista de notificacións. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas as notificacións da aplicación."</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notificacións"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Deixarás de ver estas notificacións"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando notificacións"</string> @@ -683,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Portapapeis"</item> <item msgid="5742013440802239414">"Código de teclas"</item> - <item msgid="8802889973626281575">"Conmutador do teclado"</item> - <item msgid="7095517796293767867">"Suxestión de rotación"</item> - <item msgid="8494159969042135235">"Ningún tipo"</item> + <item msgid="1951959982985094069">"Confirmación de xiro, conmutador de teclados"</item> + <item msgid="8175437057325747277">"Ningún"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index 7c530cd80723..8b2ec60ba005 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string> <string name="cancel" msgid="6442560571259935130">"રદ કરો"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ઍપ્લિકેશનનું આઇકન"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"સહાય સંદેશનું ક્ષેત્ર"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ડેઝર્ટ કેસ"</string> <string name="start_dreams" msgid="5640361424498338327">"સ્ક્રીન સેવર"</string> <string name="ethernet_label" msgid="7967563676324087464">"ઇથરનેટ"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ખલેલ પાડશો નહીં"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ફક્ત પ્રાધાન્યતા"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ફક્ત એલાર્મ્સ"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"વાઇ-ફાઇ બંધ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"વાઇ-ફાઇ ચાલુ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"કોઈ વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ નથી"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"અલાર્મ"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"કાસ્ટ કરો"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"કાસ્ટ કરી રહ્યાં છે"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"અનામાંકિત ઉપકરણ"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"સુરક્ષિત મોડમાં <xliff:g id="APP">%s</xliff:g> અક્ષમ કરેલ છે."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"બધું સાફ કરો"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરવા માટે અહીં ખેંચો"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"આડું વિભક્ત કરો"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ઊભું વિભક્ત કરો"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"કસ્ટમ વિભક્ત કરો"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"હમણાં બંધ કરો"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"વિસ્તૃત કરો"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"સંકુચિત કરો"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"આઉટપુટ ઉપકરણ સ્વિચ કરો"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"સ્ક્રીન પિન કરેલ છે"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને ઝલકને સ્પર્શ કરી રાખો."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને હોમને સ્પર્શ કરી રાખો."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે ઝલકને સ્પર્શ કરી રાખો."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે હોમને સ્પર્શ કરી રાખો."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને ઝલક બટનને સ્પર્શ કરી રાખો"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને હોમ બટનને સ્પર્શ કરી રાખો"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"સમજાઈ ગયું"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ના, આભાર"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"સ્ક્રીન પિન કરી"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"સ્ક્રીન અનપિન કરી"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ને છુપાવીએ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"તે સેટિંગ્સમાં તમે તેને ચાલુ કરશો ત્યારે આગલી વખતે ફરીથી દેખાશે."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"છુપાવો"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. કંપન પર સેટ કરવા માટે ટૅપ કરો."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s વૉલ્યૂમ નિયંત્રણ બતાવ્યાં. છોડી દેવા માટે સ્વાઇપ કરો."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"વૉલ્યૂમ નિયંત્રણ છુપાવ્યાં"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s વૉલ્યૂમ નિયંત્રણો"</string> <string name="output_title" msgid="5355078100792942802">"મીડિયાનું આઉટપુટ"</string> <string name="output_calls_title" msgid="8717692905017206161">"ફોન કૉલનો આઉટપુટ"</string> <string name="output_none_found" msgid="5544982839808921091">"કોઈ ઉપકરણો મળ્યા નથી"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ક્લિપબોર્ડ"</item> <item msgid="5742013440802239414">"કીકોડ"</item> - <item msgid="8802889973626281575">"કીબોર્ડ સ્વિચર"</item> - <item msgid="7095517796293767867">"રોટેશન માટે સૂચન"</item> - <item msgid="8494159969042135235">"કોઈ નહીં"</item> + <item msgid="1951959982985094069">"ફેરવવાની પુષ્ટિ, કીબોર્ડ સ્વિચર"</item> + <item msgid="8175437057325747277">"કોઈ નહીં"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"સામાન્ય"</item> diff --git a/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml b/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml deleted file mode 100644 index f6dbc3de2738..000000000000 --- a/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> - -<resources> - <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction> - <fraction name="keyguard_clock_y_fraction_min">24%</fraction> -</resources>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml b/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml deleted file mode 100644 index b2231a6160a9..000000000000 --- a/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> -<resources> - <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow - card. --> - <integer name="keyguard_max_notification_count">4</integer> -</resources> - diff --git a/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml b/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml deleted file mode 100644 index 905e9e3adb62..000000000000 --- a/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> - -<resources> - <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction> - <fraction name="keyguard_clock_y_fraction_min">19.8%</fraction> -</resources>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-h650dp/config.xml b/packages/SystemUI/res/values-h650dp/config.xml deleted file mode 100644 index ee641b4b6edd..000000000000 --- a/packages/SystemUI/res/values-h650dp/config.xml +++ /dev/null @@ -1,24 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> - -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> - -<resources> - <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow - card. --> - <integer name="keyguard_max_notification_count">5</integer> -</resources> - diff --git a/packages/SystemUI/res/values-h650dp/dimens.xml b/packages/SystemUI/res/values-h650dp/dimens.xml index 3811f678e330..8a0095304978 100644 --- a/packages/SystemUI/res/values-h650dp/dimens.xml +++ b/packages/SystemUI/res/values-h650dp/dimens.xml @@ -16,7 +16,4 @@ <resources> <dimen name="keyguard_clock_notifications_margin">32dp</dimen> - - <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction> - <fraction name="keyguard_clock_y_fraction_min">18.5%</fraction> </resources>
\ No newline at end of file diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 379d1abc4b49..5a4bfe037aa3 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"कैमरा खोलें"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करें"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ऐप्लिकेशन आइकॉन"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"सहायता का मैसेज दिखाने की जगह"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"मिठाई का डिब्बा"</string> <string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेवर"</string> <string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"परेशान ना करें"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"सिर्फ़ प्राथमिकता"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"सिर्फ़ अलार्म"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाई-फ़ाई बंद"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाई-फ़ाई चालू है"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"कोई भी वाई-फ़ाई नेटवर्क उपलब्ध नहीं है"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करें"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"कास्टिंग"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"अनाम डिवाइस"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> को सुरक्षित-मोड में बंद किया गया."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"स्क्रीन के दो हिस्से में बंट जाने, स्पिल्ट स्क्रीन, का इस्तेमाल करने के लिए यहां खींचें और छोडें"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अपने मुताबिक बांटें"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार करें"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"छोटा करें"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट डिवाइस बदलें"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन कर दी गई है"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'खास जानकारी\' को दबाकर रखें."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम बटन को दबाकर रखें."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"इस स्क्रीन को अनपिन करने के लिए, खास जानकारी और वापस जाएं वाले बटन को दबाकर रखें"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"इस स्क्रीन को अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ठीक है"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"नहीं, रहने दें"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रीन पिन की गई"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रीन अनपिन की गई"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> को छिपाएं?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"जब आप उसे अगली बार सेटिंग में चालू करेंगे तो वह फिर से दिखाई देगी."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"छिपाएं"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. म्यूट करने के लिए टैप करें."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s वॉल्यूम नियंत्रण दिखाए गए हैं. खारिज करने के लिए स्वाइप करें."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"वॉल्यूम नियंत्रण छिपे हुए हैं"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s की आवाज़ कम या ज़्यादा करने की सुविधा"</string> <string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string> <string name="output_calls_title" msgid="8717692905017206161">"फ़ोन कॉल का आउटपुट"</string> <string name="output_none_found" msgid="5544982839808921091">"कोई डिवाइस नहीं मिला"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"क्लिपबोर्ड"</item> <item msgid="5742013440802239414">"कुंजी कोड"</item> - <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item> - <item msgid="7095517796293767867">"घुमाने के सुझाव"</item> - <item msgid="8494159969042135235">"कोई नहीं"</item> + <item msgid="1951959982985094069">"घुमाए जाने की पुष्टि करें, कीबोर्ड की भाषा बदलने की सुविधा"</item> + <item msgid="8175437057325747277">"कोई नहीं"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"सामान्य"</item> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index e8096f52726a..dda1b40089a5 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -104,12 +104,11 @@ <string name="camera_label" msgid="7261107956054836961">"otvaranje fotoaparata"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi izgled zadataka"</string> <string name="cancel" msgid="6442560571259935130">"Odustani"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Područje poruke za pomoć"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb za kompatibilnost zumiranja."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje manjeg zaslona na veći."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth povezan."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Izlog za slastice"</string> <string name="start_dreams" msgid="5640361424498338327">"Čuvar zaslona"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi isključen"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Emitiranje"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Uređaj bez naziva"</string> @@ -329,9 +331,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Povezivanje..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Dijeljenje veze"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Žarišna točka"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Uključivanje..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d uređaj</item> + <item quantity="few">%d uređaja</item> + <item quantity="other">%d uređaja</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obavijesti"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svjetiljka"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilni podaci"</string> @@ -341,10 +346,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> iskorišteno"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Radni profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Isključene su obavijesti i aplikacije"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noćno svjetlo"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string> @@ -362,8 +365,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> onemogućena je u sigurnom načinu."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši sve"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje da biste upotrebljavali podijeljeni zaslon"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podijeli vodoravno"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podijeli okomito"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podijeli prilagođeno"</string> @@ -504,11 +505,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Odmah isključi"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširivanje"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sažimanje"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promijenite izlazni uređaj"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je prikvačen"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumbe Natrag i Početna i zadržite pritisak da biste ga otkvačili."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Pregled da biste ga otkvačili."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumb Početna i zadržite pritisak da biste ga otkvačili."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Da biste otkvačili ovaj zaslon, dodirnite gumbe Natrag i Pregled i zadržite pritisak"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Da biste otkvačili ovaj zaslon, dodirnite gumbe Natrag i Početna i zadržite pritisak"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Shvaćam"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Zaslon je pričvršćen"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Zaslon je otkvačen"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti pločicu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ponovo će se pojaviti kada je sljedeći put uključite u postavkama."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string> @@ -531,8 +539,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste postavili na vibraciju."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kontrole glasnoće prikazane. Kliznite prstom prema gore da biste ih odbacili."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole glasnoće skrivene"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće – %s"</string> <string name="output_title" msgid="5355078100792942802">"Medijski izlaz"</string> <string name="output_calls_title" msgid="8717692905017206161">"Izlaz telefonskih poziva"</string> <string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string> @@ -588,8 +595,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Napredne kontrole obavijesti omogućuju vam da postavite razinu važnosti za obavijesti aplikacije od 0 do 5. \n\n"<b>"Razina 5"</b>" \n– prikaži na vrhu popisa obavijesti \n– dopusti prekide prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 4"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 3"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled\n\n"<b>"Razina 2"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n\n"<b>"Razina 1"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n– ne prikazuj na zaključanom zaslonu i traci statusa \n– prikaži na dnu popisa obavijesti \n\n"<b>"Razina 0"</b>" \n– blokiraj sve obavijesti aplikacije"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Obavijesti"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Te vam se obavijesti više neće prikazivati"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivati"</string> @@ -685,9 +691,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Međuspremnik"</item> <item msgid="5742013440802239414">"Kôd tipke"</item> - <item msgid="8802889973626281575">"Izmjena tipkovnice"</item> - <item msgid="7095517796293767867">"Predložena rotacija"</item> - <item msgid="8494159969042135235">"Ništa"</item> + <item msgid="1951959982985094069">"Potvrda zakretanja, Izmjena tipkovnice"</item> + <item msgid="8175437057325747277">"Ništa"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Uobičajen"</item> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index fa173d6b4a33..7c8579859eff 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"kamera megnyitása"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Új feladatelrendezés kiválasztása"</string> <string name="cancel" msgid="6442560571259935130">"Mégse"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Alkalmazás ikonja"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Súgószöveg területe"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kompatibilitási zoom gomb."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kicsinyítsen a nagyobb képernyőhöz."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth csatlakoztatva."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Képernyővédő"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne zavarjanak"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Csak prioritásos"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Csak ébresztések"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi kikapcsolva"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi bekapcsolva"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nincs elérhető Wi-Fi-hálózat"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ébresztő"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Tartalomátküldés"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Átküldés"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Név nélküli eszköz"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Csatlakozás…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Megosztás"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Bekapcsolás…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d eszköz</item> + <item quantity="one">%d eszköz</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Értesítések"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zseblámpa"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiladatok"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> felhasználva"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> korlát"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Figyelem! <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Munkaprofil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Az értesítések és az alkalmazások ki vannak kapcsolva"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éjszakai fény"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Be: naplemente"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Napfelkeltéig"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"A(z) <xliff:g id="APP">%s</xliff:g> csökkentett módban ki van kapcsolva."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Összes törlése"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Húzza ide az osztott képernyő használatához"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Osztott vízszintes"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Osztott függőleges"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Osztott egyéni"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Kikapcsolás most"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Kibontás"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Összecsukás"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Váltás másik kimeneti eszközre"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A képernyő rögzítve van"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és a Kezdőképernyő elemet."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva az Áttekintés lehetőséget."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Kezdőképernyő elemet."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés gombot"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és a Kezdőképernyő gombot"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Értem"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nem, köszönöm"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Képernyő rögzítve"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Képernyő rögzítése feloldva"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Elrejti ezt: <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Újból megjelenik majd, amikor ismét engedélyezi a beállítások között."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Elrejtés"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Koppintson a rezgés beállításához."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Koppintson a némításhoz."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"A(z) %s hangvezérlői megjelenítve. Az elvetéshez húzza felfelé az ujját."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Hangvezérlők elrejtve"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s hangerőszabályzók"</string> <string name="output_title" msgid="5355078100792942802">"Médiakimenet"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefonhívás-kimenet"</string> <string name="output_none_found" msgid="5544982839808921091">"Nem találhatók eszközök"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Az értesítési beállítások révén 0-tól 5-ig állíthatja be a fontossági szintet az alkalmazás értesítéseinél. \n\n"<b>"5. szint"</b>" \n– Megjelenítés az értesítési lista tetején \n– Teljes képernyő megszakításának engedélyezése \n– Mindig felugrik \n\n"<b>"4. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Mindig felugrik \n\n"<b>"3. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n\n"<b>"2. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés és rezgés \n\n"<b>"1. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés vagy rezgés \n– Elrejtés a lezárási képernyőről és az állapotsávról \n– Megjelenítés az értesítési lista alján \n\n"<b>"0. szint"</b>" \n– Az alkalmazás összes értesítésének letiltása"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Értesítések"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Többé nem jelennek meg ezek az értesítések"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Megjelenítés továbbra is"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Vágólap"</item> <item msgid="5742013440802239414">"Billentyűkód"</item> - <item msgid="8802889973626281575">"Billentyűzetváltó"</item> - <item msgid="7095517796293767867">"Forgatási javaslat"</item> - <item msgid="8494159969042135235">"Nincs"</item> + <item msgid="1951959982985094069">"Forgatás megerősítése, billentyűzetváltó"</item> + <item msgid="8175437057325747277">"Nincs"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normál"</item> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 5dc1dfae6619..478749ab6072 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"բացել ֆոտոխցիկը"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Ընտրել առաջադրանքի նոր դասավորություն"</string> <string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Հավելվածի պատկերակ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Օգնության հաղորդագրության դաշտ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Էկրանապահ"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չանհանգստացնել"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string> @@ -532,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s։ Հպեք՝ թրթռոցը միացնելու համար։"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s։ Հպեք՝ ձայնը անջատելու համար։"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ձայնի ուժգնության կառավարները ցուցադրված են: Մատը սահեցրեք վերև՝ փակելու համար:"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ձայնի ուժգնության կառավարները թաքցված են"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Ձայնի ուժգնության կառավարներ` %s"</string> <string name="output_title" msgid="5355078100792942802">"Մեդիա արտածում"</string> <string name="output_calls_title" msgid="8717692905017206161">"Հեռախոսազանգի հնչեցում"</string> <string name="output_none_found" msgid="5544982839808921091">"Սարքեր չեն գտնվել"</string> @@ -683,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Սեղմատախտակ"</item> <item msgid="5742013440802239414">"Ստեղնային կոդ"</item> - <item msgid="8802889973626281575">"Ստեղնաշարի փոխարկիչ"</item> - <item msgid="7095517796293767867">"Պտույտ"</item> - <item msgid="8494159969042135235">"Ոչ մեկը"</item> + <item msgid="1951959982985094069">"Հաստատել պտտումը, ստեղնաշարի փոխարկիչ"</item> + <item msgid="8175437057325747277">"Չկան"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Սովորական"</item> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 7ed623428973..7ea5ce4e17e3 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"buka kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih tata letak tugas baru"</string> <string name="cancel" msgid="6442560571259935130">"Batal"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikon aplikasi"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Area pesan bantuan"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tombol perbesar/perkecil kompatibilitas."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Perbesar dari layar kecil ke besar."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tersambung."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Hanya untuk prioritas"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Hanya alarm"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Mati"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktif"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tidak ada jaringan Wi-Fi yang tersedia"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Melakukan transmisi"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Perangkat tanpa nama"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Mengaktifkan..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d perangkat</item> + <item quantity="one">%d perangkat</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifikasi"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampu senter"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data seluler"</string> @@ -358,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dinonaktifkan dalam mode aman."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hapus semua"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Tarik ke sini untuk menggunakan layar terpisah"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Geser ke atas untuk beralih aplikasi"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Pisahkan Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pisahkan Vertikal"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pisahkan Khusus"</string> @@ -499,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Nonaktifkan sekarang"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Luaskan"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ciutkan"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ganti perangkat keluaran"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Layar dipasangi pin"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Ringkasan untuk melepas pin."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Beranda untuk melepas pin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Ringkasan untuk melepas pin."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Beranda untuk melepas pin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Ringkasan"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Beranda"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Mengerti"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Lain kali"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Layar dipasangi pin"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Layar dilepas pinnya"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ini akan muncul kembali saat Anda mengaktifkannya dalam setelan."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string> @@ -526,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap untuk menyetel agar bergetar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap untuk menonaktifkan."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrol volume %s ditampilkan. Geser ke atas untuk menutup."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrol volume disembunyikan"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s kontrol volume"</string> <string name="output_title" msgid="5355078100792942802">"Keluaran media"</string> <string name="output_calls_title" msgid="8717692905017206161">"Keluaran panggilan telepon"</string> <string name="output_none_found" msgid="5544982839808921091">"Perangkat tidak ditemukan"</string> @@ -583,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kontrol notifikasi daya, Anda dapt menyetel level kepentingan notifikasi aplikasi dari 0 sampai 5. \n\n"<b>"Level 5"</b>" \n- Muncul di atas daftar notifikasi \n- Izinkan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 4"</b>" \n- Jangan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 3"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n\n"<b>"Level 2"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara dan getaran \n\n"<b>"Level 1"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara atau getaran \n- Sembunyikan dari layar kunci dan bilah status \n- Muncul di bawah daftar notifikasi \n\n"<b>"Level 0"</b>" \n- Blokir semua notifikasi dari aplikasi"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Notifikasi"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Anda tidak akan melihat notifikasi ini lagi"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Terus tampilkan"</string> @@ -678,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Papan klip"</item> <item msgid="5742013440802239414">"Kode tombol"</item> - <item msgid="8802889973626281575">"Pengalih keyboard"</item> - <item msgid="7095517796293767867">"Saran rotasi"</item> - <item msgid="8494159969042135235">"Tak Ada"</item> + <item msgid="1951959982985094069">"Pengalih keyboard, konfirmasi putar"</item> + <item msgid="8175437057325747277">"Tidak ada"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Biasa"</item> diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index 1e0cd63b89ec..c98c85833dee 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"opna myndavél"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Velja nýtt útlit verkefna"</string> <string name="cancel" msgid="6442560571259935130">"Hætta við"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Forritstákn"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Svæði hjálparskilaboða"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Hnappur fyrir samhæfisaðdrátt."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aðlaga forrit fyrir lítinn skjá að stærri skjá."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tengt."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Eftirréttaborð"</string> <string name="start_dreams" msgid="5640361424498338327">"Skjávari"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ónáðið ekki"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Aðeins forgangur"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Aðeins vekjarar"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Slökkt á Wi-Fi"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kveikt á Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Engin Wi-Fi net í boði"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Vekjari"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Útsending"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Sendir út"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ónefnt tæki"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Tengist..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tjóðrun"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Heitur reitur"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Kveikir..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d tæki</item> + <item quantity="other">%d tæki</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Tilkynningar"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Vasaljós"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Farsímagögn"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> notuð"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hámark"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> viðvörun"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Vinnusnið"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Slökkt er á tilkynningum og forritum"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Næturljós"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kveikt við sólsetur"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til sólarupprásar"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Slökkt er á <xliff:g id="APP">%s</xliff:g> í öruggri stillingu."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hreinsa allt"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dragðu hingað til að skipta skjánum"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Lárétt skipting"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Lóðrétt skipting"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Sérsniðin skipting"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Slökkva núna"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Stækka"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Minnka"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Skipta um úttakstæki"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skjárinn er festur"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ og „Yfirlit“ til að losa."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Þetta heldur þessu opnu þangað til það er losað. Haltu inni bakkhnappinum og heimahnappinum til að losa."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Yfirlit“ til að losa."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Þetta heldur þessu opnu þangað til það er losað. Haltu heimahnappinum inni til að losa."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Til að losa þessa skjámynd skaltu halda inni bakkhnappinum og yfirlitshnappinum"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Til að losa þessa skjámynd skaltu halda inni bakkhnappinum og heimahnappinum"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ég skil"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nei, takk"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skjámynd fest"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skjámynd losuð"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fela <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Þetta birtist aftur næst þegar þú kveikir á því í stillingunum."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fela"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ýttu til að stilla á titring."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ýttu til að þagga."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s stýringar fyrir hljóðstyrk sýnilegar. Strjúktu upp til að hunsa."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Stýringar fyrir hljóðstyrk faldar"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s stýringar á hljóstyrk"</string> <string name="output_title" msgid="5355078100792942802">"Margmiðlunarúttak"</string> <string name="output_calls_title" msgid="8717692905017206161">"Úttak símtals"</string> <string name="output_none_found" msgid="5544982839808921091">"Engin tæki fundust"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Með orkutilkynningastýringum geturðu stillt mikilvægi frá 0 upp í 5 fyrir tilkynningar forrita. \n\n"<b>"Stig 5"</b>" \n- Sýna efst á tilkynningalista \n- Leyfa truflun þegar birt er á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 4"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 3"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n\n"<b>"Stig 2"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n\n"<b>"Stig 1"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n- Fela á lásskjá og stöðustiku \n- Sýna neðst á tilkynningalista \n\n"<b>"Stig 0"</b>" \n- Setja allar tilkynningar frá forriti á bannlista"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Tilkynningar"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Þú munt ekki sjá þessar tilkynningar aftur"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Sýna áfram"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Klippiborð"</item> <item msgid="5742013440802239414">"Lykilkóði"</item> - <item msgid="8802889973626281575">"Lyklaborðsval"</item> - <item msgid="7095517796293767867">"Tillaga um snúning"</item> - <item msgid="8494159969042135235">"Ekkert"</item> + <item msgid="1951959982985094069">"Snúa til að staðfesta, lyklaborðsval"</item> + <item msgid="8175437057325747277">"Ekkert"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Venjulegt"</item> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 89e9cc185761..28f327f3b6f7 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"apri fotocamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Seleziona un nuovo layout per le attività"</string> <string name="cancel" msgid="6442560571259935130">"Annulla"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona dell\'applicazione"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Area dei messaggi di assistenza"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vetrina di dolci"</string> <string name="start_dreams" msgid="5640361424498338327">"Screensaver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non disturbare"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo con priorità"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo sveglie"</string> @@ -310,8 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi disattivato"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi attivo"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nessuna rete Wi-Fi disponibile"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Sveglia"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Trasmetti"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"In trasmissione"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo senza nome"</string> @@ -361,7 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"L\'app <xliff:g id="APP">%s</xliff:g> è stata disattivata in modalità provvisoria."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Cancella tutto"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trascina qui per utilizzare la modalità Schermo diviso"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Scorri verso l\'alto per passare ad altre app"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisione in orizzontale"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisione in verticale"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisione personalizzata"</string> @@ -505,21 +507,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambia dispositivo di uscita"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"La schermata è fissata"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Indietro e Panoramica."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Indietro e Home."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Panoramica."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Home."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Per disattivare il blocco su schermo, tocca e tieni premuti i pulsanti Indietro e Panoramica"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Per disattivare il blocco su schermo, tocca e tieni premuti i pulsanti Indietro e Home"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"No, grazie"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Blocco su schermo attivato"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Blocco su schermo disattivato"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Nascondere <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Verranno visualizzate di nuovo quando le riattiverai nelle impostazioni."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Nascondi"</string> @@ -542,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tocca per attivare la vibrazione."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tocca per disattivare l\'audio."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s comandi del volume mostrati. Fai scorrere verso l\'alto per ignorare."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comandi del volume nascosti"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controlli del volume %s"</string> <string name="output_title" msgid="5355078100792942802">"Uscita contenuti multimediali"</string> <string name="output_calls_title" msgid="8717692905017206161">"Uscita telefonate"</string> <string name="output_none_found" msgid="5544982839808921091">"Nessun dispositivo trovato"</string> @@ -693,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Appunti"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Selettore tastiera"</item> - <item msgid="7095517796293767867">"Suggerimento per la rotazione"</item> - <item msgid="8494159969042135235">"Nessuno"</item> + <item msgid="1951959982985094069">"Conferma rotazione, selettore tastiera"</item> + <item msgid="8175437057325747277">"Nessuno"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normale"</item> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index b6a153e210d8..9aae67f64b66 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -105,12 +105,10 @@ <string name="camera_label" msgid="7261107956054836961">"פתח את המצלמה"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"בחר פריסה חדשה להצגת משימות"</string> <string name="cancel" msgid="6442560571259935130">"ביטול"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"סמל אפליקציה"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"אזור הודעת עזרה"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"לחצן מרחק מתצוגה של תאימות."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"שנה מרחק מתצוגה של מסך קטן לגדול יותר."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth מחובר."</string> @@ -279,6 +277,7 @@ <string name="dessert_case" msgid="1295161776223959221">"מזנון קינוחים"</string> <string name="start_dreams" msgid="5640361424498338327">"שומר מסך"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"יש להקיש על הסמלים ולהחזיק אותם להצגת אפשרויות נוספות"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"נא לא להפריע"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"עדיפות בלבד"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"התראות בלבד"</string> @@ -315,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi כבוי"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi פועל"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"אין רשתות Wi-Fi זמינות"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"התראה"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"מעביר"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"מכשיר ללא שם"</string> @@ -331,9 +331,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"מתחבר..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"שיתוף אינטרנט בין ניידים"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"נקודה לשיתוף אינטרנט"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"מפעיל..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="two">%d מכשירים</item> + <item quantity="many">%d מכשירים</item> + <item quantity="other">%d מכשירים</item> + <item quantity="one">מכשיר אחד</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"הודעות"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"פנס"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"חבילת גלישה"</string> @@ -343,10 +347,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> בשימוש"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"הגבלה של <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"אזהרה - <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"פרופיל עבודה"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"הודעות ואפליקציות מושבתות"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"תאורת לילה"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"מופעל בשקיעה"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"עד הזריחה"</string> @@ -364,8 +366,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> מושבת במצב בטוח."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"נקה הכל"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"גרור לכאן כדי להשתמש במסך מפוצל"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"פיצול אופקי"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"פיצול אנכי"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"פיצול מותאם אישית"</string> @@ -506,11 +506,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"כבה עכשיו"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"הרחב"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"כווץ"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"החלפת מכשיר פלט"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"המסך מוצמד"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"נשאר בתצוגה עד לביטול ההצמדה. גע בלחצנים \'הקודם\' ו\'סקירה\' והחזק כדי לבטל את ההצמדה."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\' כדי לבטל את ההצמדה."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"נשאר בתצוגה עד לביטול ההצמדה. גע בלחצן \'סקירה\' והחזק כדי לבטל את ההצמדה."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצן \'דף הבית\' כדי לבטל את ההצמדה."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"כדי לבטל את ההצמדה של מסך זה, יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'סקירה\'"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"כדי לבטל את ההצמדה של מסך זה, יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\'"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"הבנתי"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"לא, תודה"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"המסך מוצמד"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"הצמדת המסך בוטלה"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"להסתיר<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"הסתר"</string> @@ -533,8 +540,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. הקש כדי להעביר למצב רטט."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. הקש כדי להשתיק."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s פקדי עוצמת הקול גלויים. החלק כלפי מעלה כדי לסגור."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"פקדי עוצמת הקול מוסתרים"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"בקרי עוצמת שמע של %s"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"פלט מדיה"</string> <string name="output_calls_title" msgid="8717692905017206161">"פלט שיחת טלפון"</string> <string name="output_none_found" msgid="5544982839808921091">"לא נמצאו מכשירים"</string> @@ -590,8 +602,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"בעזרת פקדים של הודעות הפעלה, תוכל להגדיר רמת חשיבות מ-0 עד 5 להודעות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצג בראש רשימת ההודעות \n- אפשר הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מנע הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n- הסתר ממסך הנעילה ומשורת הסטטוס \n- הצג בתחתית רשימת ההודעות \n\n"<b>"רמה 0"</b>" \n- חסום את כל ההודעות מהאפליקציה"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"הודעות"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ההודעות האלה לא יוצגו לך יותר"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"כן, המשיכו"</string> @@ -689,9 +700,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"לוח"</item> <item msgid="5742013440802239414">"קוד מפתח"</item> - <item msgid="8802889973626281575">"מחליף מקלדת"</item> - <item msgid="7095517796293767867">"הצעת סיבוב"</item> - <item msgid="8494159969042135235">"אף אחת"</item> + <item msgid="1951959982985094069">"סיבוב לאישור, החלפת מקלדת"</item> + <item msgid="8175437057325747277">"ללא"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"רגילה"</item> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 983c014aaace..b422f95aa09d 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -88,6 +88,7 @@ <string name="accessibility_home" msgid="8217216074895377641">"ホーム"</string> <string name="accessibility_menu" msgid="316839303324695949">"メニュー"</string> <string name="accessibility_accessibility_button" msgid="7601252764577607915">"ユーザー補助機能"</string> + <string name="accessibility_rotate_button" msgid="7402949513740253006">"画面を回転します"</string> <string name="accessibility_recent" msgid="5208608566793607626">"最近"</string> <string name="accessibility_search_light" msgid="1103867596330271848">"検索"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"カメラ"</string> @@ -102,6 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"カメラを起動"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"新しいタスクレイアウトの選択"</string> <string name="cancel" msgid="6442560571259935130">"キャンセル"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"アプリのアイコン"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ヘルプ メッセージ領域"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"互換ズームボタン。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"小さい画面から大きい画面に拡大。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetoothに接続済み。"</string> @@ -180,7 +186,8 @@ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"マナーモード着信。"</string> <!-- no translation found for accessibility_casting (6887382141726543668) --> <skip /> - <string name="accessibility_work_mode" msgid="2478631941714607225">"Work モード"</string> + <!-- no translation found for accessibility_work_mode (702887484664647430) --> + <skip /> <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>を削除します。"</string> <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>は削除されました。"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近のアプリケーションをすべて消去しました。"</string> @@ -269,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"デザートケース"</string> <string name="start_dreams" msgid="5640361424498338327">"スクリーン セーバー"</string> <string name="ethernet_label" msgid="7967563676324087464">"イーサネット"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"マナーモード"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"優先する通知のみ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"アラームのみ"</string> @@ -277,6 +286,10 @@ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth(端末数<xliff:g id="NUMBER">%d</xliff:g>)"</string> <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth OFF"</string> <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ペア設定されたデバイスがありません"</string> + <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string> + <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> <string name="quick_settings_brightness_label" msgid="6968372297018755815">"画面の明るさ"</string> <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動回転"</string> <string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"画面を自動回転します"</string> @@ -301,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi OFF"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi: ON"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fiネットワークを利用できません"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"アラーム"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"キャスト"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"キャストしています"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"名前のないデバイス"</string> @@ -317,6 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"接続しています..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"テザリング"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"アクセスポイント"</string> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ON にしています…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d 台の端末</item> + <item quantity="one">%d 台の端末</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ライト"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"モバイルデータ"</string> @@ -326,8 +345,13 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g>使用中"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"警告: 上限は<xliff:g id="DATA_LIMIT">%s</xliff:g>です"</string> - <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Work モード"</string> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"仕事用プロファイル"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知とアプリは OFF です"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"読書灯"</string> + <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"日の入りに ON"</string> + <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"日の出まで"</string> + <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string> + <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> まで"</string> <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string> <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string> <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string> @@ -480,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"OFF にする"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"折りたたむ"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"出力デバイスを選択"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"画面が固定されました"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [最近] を同時に押し続けると固定が解除されます。"</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [ホーム] を同時に押し続けると固定が解除されます。"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"固定を解除するまで画面が常に表示されるようになります。[最近] を押し続けると固定が解除されます。"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"固定を解除するまで画面が常に表示されるようになります。[ホーム] を押し続けると固定が解除されます。"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"この画面の固定を解除するには [戻る] ボタンと [最近] ボタンを押し続けます"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"この画面の固定を解除するには [戻る] ボタンと [ホーム] ボタンを押し続けます"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"はい"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"いいえ"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"画面を固定しました"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"画面の固定を解除しました"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>を非表示にしますか?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"次回、設定でONにすると再表示されます。"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"非表示"</string> @@ -507,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。タップしてミュートします。ユーザー補助機能サービスがミュートされる場合があります。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。タップしてバイブレーションに設定します。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。タップしてミュートします。"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s の音量調節が表示されています。閉じるには、上にスワイプします。"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"音量調節を非表示にしました"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s の音量調節"</string> <string name="output_title" msgid="5355078100792942802">"メディア出力"</string> <string name="output_calls_title" msgid="8717692905017206161">"通話の出力"</string> <string name="output_none_found" msgid="5544982839808921091">"デバイスが見つかりません"</string> @@ -564,6 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"電源通知管理では、アプリの通知の重要度をレベル 0~5 で設定できます。\n\n"<b>"レベル 5"</b>" \n- 通知リストの一番上に表示する \n- 全画面表示を許可する \n- 常にポップアップする \n\n"<b>"レベル 4"</b>" \n- 全画面表示しない \n- 常にポップアップする \n\n"<b>"レベル 3"</b>" \n- 全画面表示しない \n- ポップアップしない \n\n"<b>"レベル 2"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n\n"<b>"レベル 1"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n- ロック画面やステータスバーに表示しない \n- 通知リストの一番下に表示する \n\n"<b>"レベル 0"</b>" \n- アプリからのすべての通知をブロックする"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"今後、この通知は表示されません"</string> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"今後も表示する"</string> @@ -657,7 +688,7 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"クリップボード"</item> <item msgid="5742013440802239414">"キーコード"</item> - <item msgid="8802889973626281575">"キーボードを切り替え"</item> + <item msgid="1951959982985094069">"回転して確認、キーボードの切り替え"</item> <item msgid="8175437057325747277">"なし"</item> </string-array> <string-array name="nav_bar_layouts"> @@ -782,4 +813,10 @@ <string name="running_foreground_services_msg" msgid="6326247670075574355">"タップして電池やデータの使用量を確認"</string> <string name="data_usage_disable_mobile" msgid="5116269981510015864">"モバイルデータを OFF にしますか?"</string> <string name="touch_filtered_warning" msgid="8671693809204767551">"アプリが許可リクエストを隠しているため、設定側でユーザーの応答を確認できません。"</string> + <string name="slice_permission_title" msgid="7465009437851044444">"「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示を「<xliff:g id="APP_0">%1$s</xliff:g>」に許可しますか?"</string> + <string name="slice_permission_text_1" msgid="3514586565609596523">"- 「<xliff:g id="APP">%1$s</xliff:g>」からの情報の読み取り"</string> + <string name="slice_permission_text_2" msgid="3146758297471143723">"- 「<xliff:g id="APP">%1$s</xliff:g>」内部での操作"</string> + <string name="slice_permission_checkbox" msgid="7986504458640562900">"すべてのアプリのスライスを表示することを「<xliff:g id="APP">%1$s</xliff:g>」に許可する"</string> + <string name="slice_permission_allow" msgid="2340244901366722709">"許可"</string> + <string name="slice_permission_deny" msgid="7683681514008048807">"拒否"</string> </resources> diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 3a7fc501bbbd..258f21fb2640 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"კამერის გახსნა"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ახალი ამოცანის განლაგების არჩევა"</string> <string name="cancel" msgid="6442560571259935130">"გაუქმება"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"აპლიკაციის ხატულა"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"დახმარების შეტყობინების არეალი"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"თავსებადი მასშტაბირების ღილაკი."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"შეცვალეთ პატარა ეკრანი უფრო დიდით."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth დაკავშირებულია."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"სადესერტო ყუთი"</string> <string name="start_dreams" msgid="5640361424498338327">"ეკრანმზოგი"</string> <string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"არ შემაწუხოთ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"მხოლოდ პრიორიტეტული"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"მხოლოდ გაფრთხილებები"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi გამორთულია"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ჩართულია"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ქსელები მიუწვდომელია"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"მაღვიძარა"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ტრანსლირება"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"გადაიცემა"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"უსახელო მოწყობილობა"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"დაკავშირება..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ტეტერინგი"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"მიმდინარეობს ჩართვა..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d მოწყობილობა</item> + <item quantity="one">%d მოწყობილობა</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"შეტყობინებები"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ფანარი"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"მობილური ინტერნეტი"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"გამოყენებულია: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ლიმიტი: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> გაფრთხილება"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"სამსახურის პროფილი"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"შეტყობინებები და აპები გამორთულია"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"ღამის განათება"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ჩაირთოს მზის ჩასვლისას"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"მზის ამოსვლამდე"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> გათიშულია უსაფრთხო რეჟიმში."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ყველას გასუფთავება"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ეკრანის გასაყოფად, ჩავლებით გადმოიტანეთ აქ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ჰორიზონტალური გაყოფა"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ვერტიკალური გაყოფა"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ინდივიდუალური გაყობა"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ახლავე გამორთვა"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"გავრცობა"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ჩაკეცვა"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"გამოტანის მოწყობილობის გადართვა"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ეკრანი ჩამაგრებულია"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან და მიმოხილვა“-ს."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან მთავარ გვერდზე“-ს."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მიმოხილვა“-ს."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მთავარ გვერდს“."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მიმოხილვა“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მთავარი გვერდი“"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"გასაგებია"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"არა, გმადლობთ"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"ეკრანი ჩამაგრებულია"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"ეკრანის ჩამაგრება მოხსნილია"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"დაიმალოს <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ის კვლავ გამოჩნდება, როდესაც პარამეტრებში ჩართავთ"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"დამალვა"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. შეეხეთ დასადუმებლად."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s-ის ხმის მართვის საშუალებები დამალულია. დასახურად, გადაფურცლეთ ზემოთ."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ხმის მართვის საშუალებები დამალულია"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s-ის ხმის მართვის საშუალებები"</string> <string name="output_title" msgid="5355078100792942802">"მედია გამომავალი"</string> <string name="output_calls_title" msgid="8717692905017206161">"სატელეფონო ზარის გამომავალი სიგნალი"</string> <string name="output_none_found" msgid="5544982839808921091">"მოწყობილობები ვერ მოიძებნა"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"შეტყობინებების მართვის საშუალებების მეშვეობით, შეგიძლიათ განსაზღვროთ აპის შეტყობინებების მნიშვნელობის დონე 0-დან 5-მდე დიაპაზონში. \n\n"<b>"დონე 5"</b>" \n— შეტყობინებათა სიის თავში ჩვენება \n— სრულეკრანიანი რეჟიმის შეფერხების დაშვება \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 4"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 3"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n\n"<b>"დონე 2"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n\n"<b>"დონე 1"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n— ჩაკეტილი ეკრანიდან და სტატუსის ზოლიდან დამალვა \n— შეტყობინებათა სიის ბოლოში ჩვენება \n\n"<b>"დონე 0"</b>" \n— აპის ყველა შეტყობინების დაბლოკვა"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"შეტყობინებები"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"ამ შეტყობინებებს აღარ დაინახავთ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"ჩვენების გაგრძელება"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"გაცვლის ბუფერი"</item> <item msgid="5742013440802239414">"კლავიშის კოდი"</item> - <item msgid="8802889973626281575">"კლავიატურის გადამრთველი"</item> - <item msgid="7095517796293767867">"შეტრიალების შეთავაზება"</item> - <item msgid="8494159969042135235">"არც ერთი"</item> + <item msgid="1951959982985094069">"შეტრიალების დადასტურება, კლავიატურის გადამრთველი"</item> + <item msgid="8175437057325747277">"არცერთი"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ჩვეულებრივი"</item> diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 15d109cd6ba1..718a138c632e 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"камераны ашу"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңа тапсырма пішімін таңдау"</string> <string name="cancel" msgid="6442560571259935130">"Бас тарту"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Қолданба белгішесі"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Анықтама хабары аумағы"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Үйлесімділік ұлғайту түймесі."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Үлкендеу экранда кішірейту."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth қосылған."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Десерт жағдайы"</string> <string name="start_dreams" msgid="5640361424498338327">"Экранды сақтау режимі"</string> <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Мазаламау"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Маңыздылары ғана"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Тек дабылдар"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi өшірулі"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi қосулы"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Қолжетімді Wi-Fi желілері жоқ"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Дабыл"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Трансляциялануда"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Атаусыз құрылғы"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Қосылуда…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хот-спот"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Қосылуда…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d құрылғы</item> + <item quantity="one">%d құрылғы</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Хабарландырулар"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Қалта шам"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобильдік деректер"</string> @@ -358,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> қауіпсіз режимде өшіріледі."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Барлығын тазалау"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Бөлінген экранды пайдалану үшін осында сүйреңіз"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Қолданбаларға ауысу үшін жоғары сырғытыңыз"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Бөлінген көлденең"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Бөлінген тік"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Бөлінген теңшелетін"</string> @@ -499,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Қазір өшіру"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Жаю"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жию"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Шығыс құрылғыны ауыстыру"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран түйрелді"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Шолу\" түймелерін басып тұрыңыз."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Кері\" түймесін басып тұрыңыз."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Негізгі бет\" түймесін түртіп, ұстап тұрыңыз."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Бұл экранды босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Бұл экранды босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Түсіндім"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Жоқ, рақмет"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Экран бекітілді"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран босатылды"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жасыру керек пе?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ол сіз оны параметрлерде келесі қосқанда қайта пайда болады."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жасыру"</string> @@ -526,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Діріл режимін орнату үшін түртіңіз."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дыбысын өшіру үшін түртіңіз."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s дыбысты басқару элементтері көрсетулі. Сырғыту арқылы жабыңыз."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Дыбысты басқару элементтері жасырын"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Дыбысты басқару элементтері: %s"</string> <string name="output_title" msgid="5355078100792942802">"Meдиа шығысы"</string> <string name="output_calls_title" msgid="8717692905017206161">"Телефон қоңырау шығысы"</string> <string name="output_none_found" msgid="5544982839808921091">"Ешқандай құрылғы табылмады"</string> @@ -583,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Қуат хабарландыруының басқару элементтерімен қолданбаның хабарландырулары үшін 0-ден бастап 5-ке дейін маңыздылық деңгейін орнатуға болады. \n\n"<b>"5-деңгей"</b>" \n- Хабарландыру тізімінің ең басында көрсету \n- Толық экранға ашылуын рұқсат ету \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"4-деңгей"</b>" \n- Толық экранға шығармау \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"3-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n\n"<b>"2-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс және діріл шығармау \n\n"<b>"1-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс немесе діріл шығармау \n- Құлыпталған экраннан және күйін көрсету жолағынан жасыру \n- Хабарландыру тізімінің ең астында көрсету \n\n"<b>"0-деңгей"</b>" \n- Қолданбадағы барлық хабарландыруларға тыйым салу"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Хабарландырулар"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Хабарландырулар бұдан былай көрсетілмейді"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Көрсету"</string> @@ -678,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Буфер"</item> <item msgid="5742013440802239414">"Перне коды"</item> - <item msgid="8802889973626281575">"Пернетақта ауыстырғышы"</item> - <item msgid="7095517796293767867">"Бұру ұсынысы"</item> - <item msgid="8494159969042135235">"Ешқайсысы"</item> + <item msgid="1951959982985094069">"Айналдыруды растау, пернетақта ауыстырғыш"</item> + <item msgid="8175437057325747277">"Ешқандай"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Орташа"</item> diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 77fc13730eec..e2cffc4a2326 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"បើកម៉ាស៊ីនថត"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ជ្រើសប្លង់ភារកិច្ចថ្មី"</string> <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"រូបតំណាងកម្មវិធី"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"តំបន់សារជំនួយ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ប៊ូតុងពង្រីកត្រូវគ្នា។"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ពង្រីក/បង្រួមអេក្រង់ពីទៅធំ"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"បានតភ្ជាប់ប៊្លូធូស។"</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ករណី Dessert"</string> <string name="start_dreams" msgid="5640361424498338327">"ធាតុរក្សាអេក្រង់"</string> <string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិត"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"កុំរំខាន"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"អាទិភាពប៉ុណ្ណោះ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"វ៉ាយហ្វាយបានបិទ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi បានបើក"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"គ្មានបណ្តាញ Wi-Fi ទេ"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ម៉ោងរោទ៍"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ភ្ជាប់"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ការចាត់ថ្នាក់"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ឧបករណ៍ដែលមិនមានឈ្មោះ"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"កំពុងតភ្ជាប់..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ការភ្ជាប់"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ហតស្ប៉ត"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"កំពុងបើក..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">ឧបករណ៍ %d</item> + <item quantity="one">ឧបករណ៍ %d</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ការជូនដំណឹង"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ពិល"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ទិន្នន័យទូរសព្ទចល័ត"</string> @@ -358,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ត្រូវបានបិទដំណើរការក្នុងរបៀបសុវត្ថិភាព"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"សម្អាតទាំងអស់"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"អូសនៅទីនេះដើម្បីប្រើអេក្រង់បំបែក"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"អូសឡើងលើដើម្បីប្តូរកម្មវិធី"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"បំបែកផ្តេក"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"បំបែកបញ្ឈរ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"បំបែកផ្ទាល់ខ្លួន"</string> @@ -499,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"បិទឥឡូវនេះ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ពង្រីក"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"បង្រួម"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ប្ដូរឧបករណ៍បញ្ចេញសំឡេង"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"អេក្រង់ត្រូវបានភ្ជាប់"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ដើម្បីដកការដៅអេក្រង់នេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឱ្យជាប់"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ដើម្បីដកការដៅអេក្រង់នេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"យល់ហើយ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ទេ អរគុណ"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"បានដៅអេក្រង់"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"បានដកការដៅអេក្រង់"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"លាក់ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"វានឹងបង្ហាញពេលក្រោយ ពេលដែលអ្នកបើកក្នុងការកំណត់។"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"លាក់"</string> @@ -526,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s ។ ចុចដើម្បីកំណត់ឲ្យញ័រ។"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s ។ ចុចដើម្បីបិទសំឡេង។"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"អង្គគ្រប់គ្រងកម្រិតសំឡេង %s បានបង្ហាញ។ អូសឡើងលើដើម្បីបដិសេធ។"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"អង្គគ្រប់គ្រងកម្រិតសំឡេងបានលាក់"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s របារបញ្ជាកម្រិតសំឡេង"</string> <string name="output_title" msgid="5355078100792942802">"លទ្ធផលមេឌៀ"</string> <string name="output_calls_title" msgid="8717692905017206161">"លទ្ធផលនៃការហៅទូរសព្ទ"</string> <string name="output_none_found" msgid="5544982839808921091">"រកមិនឃើញឧបករណ៍ទេ"</string> @@ -583,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ជាមួយអង្គគ្រប់គ្រងការជូនដំណឹងថាមពល អ្នកអាចកំណត់កម្រិតសំខាន់ពី 0 ទៅ 5 សម្រាប់ការជូនដំណឹងរបស់កម្មវិធី។ \n\n"<b>"កម្រិត 5"</b>" \n- បង្ហាញនៅផ្នែកខាងលើបញ្ជីជូនដំណឹង \n- អនុញ្ញាតការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 4"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 3"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 2"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n\n"<b>"កម្រិត 1"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n- លាក់ពីអេក្រង់ចាក់សោ និងរបារស្ថានភាព \n- បង្ហាញនៅផ្នែកខាងក្រោមបញ្ជីជូនដំណឹង \n\n"<b>"កម្រិត 0"</b>" \n- រារាំងការជូនដំណឹងទាំងអស់ពីកម្មវិធី"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"ការជូនដំណឹង"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"អ្នកនឹងមិនឃើញការជូនដំណឹងទាំងនេះទៀតទេ"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"បន្តបង្ហាញ"</string> @@ -675,13 +683,7 @@ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"ប្រភេទប៊ូតុងខាងឆ្វេងបន្ថែម"</string> <string name="right_nav_bar_button_type" msgid="2481056627065649656">"ប្រភេទប៊ូតុងខាងស្តាំបន្ថែម"</string> <string name="nav_bar_default" msgid="8587114043070993007">"(លំនាំដើម)"</string> - <string-array name="nav_bar_buttons"> - <item msgid="1545641631806817203">"អង្គចងចាំ"</item> - <item msgid="5742013440802239414">"លេខកូដគ្រាប់ចុច"</item> - <item msgid="8802889973626281575">"កម្មវិធីប្តូរក្តារចុច"</item> - <item msgid="7095517796293767867">"ការណែនាំការបង្វិល"</item> - <item msgid="8494159969042135235">"គ្មាន"</item> - </string-array> + <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) --> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ធម្មតា"</item> <item msgid="8256205964297588988">"តូច"</item> diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index 4b638f57d99c..427c07dc6289 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ಡೆಸರ್ಟ್ ಕೇಸ್"</string> <string name="start_dreams" msgid="5640361424498338327">"ಸ್ಕ್ರೀನ್ ಸೇವರ್"</string> <string name="ethernet_label" msgid="7967563676324087464">"ಇಥರ್ನೆಟ್"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ಆದ್ಯತೆ ಮಾತ್ರ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ವೈ-ಫೈ ಆಫ್"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ಯಾವುದೇ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ಅಲಾರಮ್"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ಬಿತ್ತರಿಸುವಿಕೆ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ವಿಭಜಿತ ಪರದೆಯನ್ನು ಬಳಸಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ಈಗ ಆಫ್ ಮಾಡಿ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ವಿಸ್ತರಿಸು"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ಸಂಕುಚಿಸು"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ಔಟ್ಪುಟ್ ಸಾಧನವನ್ನು ಬದಲಿಸಿ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿಹಿಡಿಯಿರಿ."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಸಮಗ್ರ ನೋಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಮುಖಪುಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಒತ್ತಿಹಿಡಿಯಿರಿ"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ತಿಳಿಯಿತು"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ಧನ್ಯವಾದಗಳು"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ಮರೆಮಾಡುವುದೇ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿದಾಗ ಅದು ಮರುಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ಮರೆಮಾಡಿ"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವಜಾಗೊಳಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಕಗಳು"</string> <string name="output_title" msgid="5355078100792942802">"ಮೀಡಿಯಾ ಔಟ್ಪುಟ್"</string> <string name="output_calls_title" msgid="8717692905017206161">"ಫೋನ್ ಕರೆ ಔಟ್ಪುಟ್"</string> <string name="output_none_found" msgid="5544982839808921091">"ಯಾವ ಸಾಧನಗಳೂ ಕಂಡುಬಂದಿಲ್ಲ"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ಕ್ಲಿಪ್ಬೋರ್ಡ್"</item> <item msgid="5742013440802239414">"ಕೀಕೋಡ್"</item> - <item msgid="8802889973626281575">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item> - <item msgid="7095517796293767867">"ತಿರುಗಿಸುವಿಕೆ ಸಲಹೆ"</item> - <item msgid="8494159969042135235">"ಯಾವುದೂ ಅಲ್ಲ"</item> + <item msgid="1951959982985094069">"ತಿರುಗಿಸುವಿಕೆ ದೃಢೀಕರಿಸಿ, ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item> + <item msgid="8175437057325747277">"ಯಾವುದೂ ಅಲ್ಲ"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ಸಾಮಾನ್ಯ"</item> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index b42d0b5c0d23..65e64f37c7ba 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"카메라 열기"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"새 작업 레이아웃 선택"</string> <string name="cancel" msgid="6442560571259935130">"취소"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"애플리케이션 아이콘"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"도움말 메시지 영역"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"호환성 확대/축소 버튼입니다."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"작은 화면을 큰 화면으로 확대합니다."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"블루투스가 연결되었습니다."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"디저트 케이스"</string> <string name="start_dreams" msgid="5640361424498338327">"화면 보호기"</string> <string name="ethernet_label" msgid="7967563676324087464">"이더넷"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"알림 일시중지"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"중요 알림만"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"알람만"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 꺼짐"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 사용"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"사용 가능한 Wi-Fi 네트워크 없음"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"알람"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"전송"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"전송 중"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"이름이 없는 기기"</string> @@ -329,9 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"연결 중..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"테더링"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"핫스팟"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"사용 설정 중..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">기기 %d대</item> + <item quantity="one">기기 %d대</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"알림"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"손전등"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"모바일 데이터"</string> @@ -341,10 +345,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> 사용됨"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"한도: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 경고"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"직장 프로필"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"알림 및 앱 사용 중지됨"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"야간 조명"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"일몰에"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"일출까지"</string> @@ -362,8 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>은(는) 안전 모드에서 사용 중지됩니다."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"모두 지우기"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"여기를 드래그하여 분할 화면 사용하기"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"수평 분할"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"수직 분할"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"맞춤 분할"</string> @@ -504,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"지금 사용 중지"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"펼치기"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"접기"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"출력 기기 전환"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"화면 고정됨"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 최근 사용을 길게 터치하세요."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 홈을 길게 터치하세요."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 최근 사용을 길게 터치하세요."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 홈을 길게 터치하세요."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"이 화면을 고정 해제하려면 뒤로 및 최근 사용 버튼을 길게 터치하세요."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"이 화면을 고정 해제하려면 뒤로 및 홈 버튼을 길게 터치하세요."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"확인"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"거부"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"화면 고정됨"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"화면 고정 해제됨"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>을(를) 숨기시겠습니까?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"다음번에 설정에서 사용 설정하면 다시 표시됩니다."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"숨기기"</string> @@ -531,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. 탭하여 진동으로 설정하세요."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. 탭하여 음소거로 설정하세요."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s 볼륨 컨트롤이 표시됩니다. 닫으려면 위로 스와이프합니다."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"볼륨 컨트롤 숨김"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s 볼륨 컨트롤"</string> <string name="output_title" msgid="5355078100792942802">"미디어 출력"</string> <string name="output_calls_title" msgid="8717692905017206161">"전화 통화 출력"</string> <string name="output_none_found" msgid="5544982839808921091">"기기를 찾을 수 없음"</string> @@ -588,8 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"전원 알림 컨트롤을 사용하면 앱 알림 관련 중요도를 0부터 5까지로 설정할 수 있습니다. \n\n"<b>"레벨 5"</b>" \n- 알림 목록 상단에 표시 \n- 전체 화면일 경우 알림 표시 허용 \n- 항상 엿보기 표시 \n\n"<b>"레벨 4"</b>" \n- 전체 화면에 알림 표시 금지 \n- 항상 엿보기 표시 \n\n"<b>"레벨 3"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n\n"<b>"레벨 2"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n\n"<b>"레벨 1"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n- 잠금 화면 및 상태 표시줄에서 숨김 \n- 알림 목록 하단에 표시 \n\n"<b>"레벨 0"</b>" \n- 앱의 모든 알림 차단"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"알림"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"더 이상 다음의 알림을 받지 않습니다"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"계속 표시하기"</string> @@ -683,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"클립보드"</item> <item msgid="5742013440802239414">"키 코드"</item> - <item msgid="8802889973626281575">"키보드 전환 도구"</item> - <item msgid="7095517796293767867">"추천 항목 회전"</item> - <item msgid="8494159969042135235">"없음"</item> + <item msgid="1951959982985094069">"회전 확인, 키보드 전환 도구"</item> + <item msgid="8175437057325747277">"없음"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"보통"</item> diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index a1e1415a6444..64891169220e 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"камераны ачуу"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңы тапшырманын планын тандаңыз"</string> <string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Колдонмонун сүрөтчөсү"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Жардам билдирүүсү"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Масштабды сыйыштыруу баскычы."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Кичинекейди чоң экранга масштабдоо."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth байланышта"</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Десерт себети"</string> <string name="start_dreams" msgid="5640361424498338327">"Көшөгө"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Тынчымды алба"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Шашылыш эскертмелер гана"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ойготкучтар гана"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi өчүк"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi күйүк"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Бир дагы жеткиликтүү Wi-Fi тармагы жок"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ойготкуч"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Тышкы экранга чыгаруу"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Тышкы экранга чыгарылууда"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Аты жок түзмөк"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Туташууда…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Туташуу чекити"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Күйгүзүлүүдө…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d түзмөк</item> + <item quantity="one">%d түзмөк</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Эскертмелер"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Кол чырак"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилдик Интернет"</string> @@ -358,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> коопсуз режиминде өчүрүлдү."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Баарын тазалоо"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Экранды бөлүү үчүн бул жерге сүйрөңүз"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Колдонмолорду которуштуруу үчүн өйдө сүрүңүз"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Туурасынан бөлүү"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Тигинен бөлүү"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ыңгайлаштырылган бөлүү"</string> @@ -499,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Азыр өчүрүлсүн"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Жайып көрсөтүү"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жыйнап коюу"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Аудио түзмөктү которуштуруу"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран кадалган"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Карап чыгуу\" баскычтарын басып, кармап туруңуз."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Карап чыгуу\" баскычын басып, кармап туруңуз."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Башкы бет\" баскычын басып, кармап туруңуз."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Бул экранды бошотуу үчүн \"Артка\" жана \"Сереп салуу\" баскычтарын басып, кармап туруңуз"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Бул экранды бошотуу үчүн \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Түшүндүм"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Жок, рахмат"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Экран кадалды"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран бошотулду"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жашырылсынбы?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бул кийинки жолу жөндөөлөрдөн күйгүзүлгөндө кайра көрүнөт."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жашыруу"</string> @@ -526,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дирилдөөгө коюу үчүн басыңыз."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Үнүн өчүрүү үчүн басыңыз."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s үндү башкаруу элементтери көрсөтүлгөн. Этибарга албоо үчүн өйдө серпип коюңуз."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Үндү башкаруу элементтери жашырылган"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s үндү башкаруу элементтери"</string> <string name="output_title" msgid="5355078100792942802">"Медиа түзмөк"</string> <string name="output_calls_title" msgid="8717692905017206161">"Телефон чалуу"</string> <string name="output_none_found" msgid="5544982839808921091">"Түзмөктөр табылган жок"</string> @@ -583,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Бул функциянын жардамы менен ар бир колдонмо үчүн эскертменин маанилүүлүк деңгээлин 0дон 5ке чейин койсоңуз болот. \n\n"<b>"5-деңгээл"</b>" \n- Эскертмелер тизмесинин башында көрсөтүлсүн \n- Эскертмелер толук экранда көрсөтүлсүн \n- Калкып чыгуучу эскертмелерге уруксат берилсин \n\n"<b>"4-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге уруксат берилсин \n\n"<b>"3-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n\n"<b>"2-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n- Эч качан добуш чыгып же дирилдебесин \n\n"<b>"1-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n- Эч качан добуш чыгып же дирилдебесин \n- Кулпуланган экрандан жана абал тилкесинен жашырылсын \n- Эскертмелер тизмесинин аягында көрсөтүлсүн \n\n"<b>"0-деңгээл"</b>" \n- Колдонмодон алынган бардык эскертмелер бөгөттөлсүн"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Эскертмелер"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Мындан ары бул эскертмелер сизге көрсөтүлбөйт"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Көрсөтүлө берсин"</string> @@ -678,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Алмашуу буфери"</item> <item msgid="5742013440802239414">"Баскыч коду"</item> - <item msgid="8802889973626281575">"Баскычтоп которуштургуч"</item> - <item msgid="7095517796293767867">"Буруу сунушу"</item> - <item msgid="8494159969042135235">"Эч бири"</item> + <item msgid="1951959982985094069">"Бурууну ырастоо, баскычтопту которуштургуч"</item> + <item msgid="8175437057325747277">"Эч бири"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Кадимки"</item> diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml index ca052409e492..e37ca1c95e9a 100644 --- a/packages/SystemUI/res/values-land/dimens.xml +++ b/packages/SystemUI/res/values-land/dimens.xml @@ -22,8 +22,10 @@ <dimen name="docked_divider_handle_width">2dp</dimen> <dimen name="docked_divider_handle_height">16dp</dimen> + <dimen name="brightness_mirror_height">96dp</dimen> + <dimen name="qs_tile_margin_top">2dp</dimen> - <dimen name="qs_brightness_padding_top">0dp</dimen> + <dimen name="qs_header_tooltip_height">24dp</dimen> <dimen name="battery_detail_graph_space_top">9dp</dimen> <dimen name="battery_detail_graph_space_bottom">9dp</dimen> diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 1b56074e4268..ce1d5514fa43 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ເປີດກ້ອງ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກແຜນຜັງໜ້າວຽກໃໝ່"</string> <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ໄອຄອນແອັບພລິເຄຊັນ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ກ່ອງຂອງຫວານ"</string> <string name="start_dreams" msgid="5640361424498338327">"ພາບພັກໜ້າຈໍ"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ຫ້າມລົບກວນ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ບຸລິມະສິດເທົ່ານັ້ນ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ໂມງປຸກເທົ່ານັ້ນ"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ປິດ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ເປີດ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ບໍ່ມີເຄືອຂ່າຍ Wi-Fi ຢູ່"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ໂມງປຸກ"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ການສົ່ງສັນຍານ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ກຳລັງສົ່ງສັນຍານ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ອຸປະກອນບໍ່ມີຊື່"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ຖືກປິດໃຊ້ໃນໂໝດຄວາມມປອດໄພ."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ລຶບລ້າງທັງໝົດ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ລາກມາບ່ອນນີ້ເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ປັດຂື້ນເພື່ອສະຫຼັບແອັບ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ການແຍກລວງຂວາງ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ການແຍກລວງຕັ້ງ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ການແຍກກຳນົດເອງ"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ປິດດຽວນີ້"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ຂະຫຍາຍ"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ຫຍໍ້ລົງ"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ສະຫຼັບອຸປະກອນສົ່ງສຽງອອກ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກໝຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກໝຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ເພື່ອຍົກເລີກການປັກໝຸດໜ້າຈໍນີ້, ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ເພື່ອຍົກເລີກການປັກໝຸດໜ້າຈໍນີ້, ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ເຂົ້າໃຈແລ້ວ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ບໍ່, ຂອບໃຈ"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"ຍົກເລີກການປັກໝຸດໜ້າຈໍແລ້ວ"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ເຊື່ອງ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ຫຼືບໍ່?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ມັນຈະສະແດງຄືນໃໝ່ເມື່ອທ່ານເປີດນຳໃຊ້ມັນໃນການຕັ້ງຄ່າຄັ້ງຕໍ່ໄປ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ເຊື່ອງ"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນເຕືອນ."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ແຕະເພື່ອປິດສຽງ."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"ສະແດງສ່ວນຄວບຄຸມສຽງ %s ແລ້ວ. ປັດອອກຂ້າງເພື່ອປິດໄວ້."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ເຊື່ອງສ່ວນຄວບຄຸມສຽງແລ້ວ"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"ການຄວບຄຸມສຽງ %s"</string> <string name="output_title" msgid="5355078100792942802">"ມີເດຍເອົ້າພຸດ"</string> <string name="output_calls_title" msgid="8717692905017206161">"ເອົ້າພຸດສາຍໂທອອກ"</string> <string name="output_none_found" msgid="5544982839808921091">"ບໍ່ພົບອຸປະກອນ"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ຄລິບບອດ"</item> <item msgid="5742013440802239414">"ລະຫັດກະແຈ"</item> - <item msgid="8802889973626281575">"ຕົວສະຫຼັບແປ້ນພິມ"</item> - <item msgid="7095517796293767867">"ການແນະນຳການໝຸນ"</item> - <item msgid="8494159969042135235">"ບໍ່ມີ"</item> + <item msgid="1951959982985094069">"ຢືນຢັນມຸນ, ຕົວສະຫຼັບແປ້ນພິມ"</item> + <item msgid="8175437057325747277">"ບໍ່ໃຊ້"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ປົກກະຕິ"</item> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index cc0f8ab5411b..a35ccba8de04 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -105,12 +105,10 @@ <string name="camera_label" msgid="7261107956054836961">"atidaryti fotoaparatą"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pasirinkti naują užduoties išdėstymą"</string> <string name="cancel" msgid="6442560571259935130">"Atšaukti"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite kontrolinio kodo jutiklį"</string> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Kontrolinio kodo piktograma"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Programos piktograma"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Pagalbos pranešimo sritis"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Suderinamumo priartinimo mygtukas."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Padidinti ekraną."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"„Bluetooth“ prijungtas."</string> @@ -279,6 +277,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Desertų dėklas"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekrano užsklanda"</string> <string name="ethernet_label" msgid="7967563676324087464">"Eternetas"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Paspauskite ir palaikykite piktogramas, kad būtų parodyta daugiau parinkčių"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netrukdyti"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tik prioritetiniai įvykiai"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tik signalai"</string> @@ -315,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"„Wi-Fi“ išjungta"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"„Wi-Fi“ įjungtas"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nėra jokių pasiekiamų „Wi-Fi“ tinklų"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Signalas"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Perdavimas"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Perduodama"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Įrenginys be pavadinimo"</string> @@ -331,9 +331,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Prisijungiama..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Susiejimas"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Viešosios interneto prieigos taškas"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Įjungiama..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d įrenginys</item> + <item quantity="few">%d įrenginiai</item> + <item quantity="many">%d įrenginio</item> + <item quantity="other">%d įrenginių</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pranešimai"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Žibintuvėlis"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiliojo ryšio duomenys"</string> @@ -343,10 +347,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Išnaudota: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limitas: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> įspėjimas"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Darbo profilis"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Pranešimai ir programos išjungti"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nakties šviesa"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Per saulėlydį"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Iki saulėtekio"</string> @@ -364,8 +366,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Programa „<xliff:g id="APP">%s</xliff:g>“ išjungta saugos režimu."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Išvalyti viską"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Vilkite čia, kad naudotumėte skaidytą ekraną"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontalus skaidymas"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikalus skaidymas"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tinkintas skaidymas"</string> @@ -506,11 +506,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Išjungti dabar"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Išskleisti"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sutraukti"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Perjungti išvesties įrenginį"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekranas prisegtas"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Apžvalga“, kad atsegtumėte."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Pagrindinis ekranas“, kad atsegtumėte."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Pagrindinis ekranas“"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Supratau"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, ačiū"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekranas prisegtas"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekranas atsegtas"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Slėpti „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tai bus vėl parodyta, kai kitą kartą įjungsite tai nustatymuose."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Slėpti"</string> @@ -533,8 +540,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Palieskite, kad nustatytumėte vibravimą."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Palieskite, kad nutildytumėte."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Rodomi „%s“ garsumo valdikliai. Perbraukite į viršų, kad atsisakytumėte."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Garsumo valdikliai paslėpti"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Garsumo valdikliai: %s"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Medijos išvestis"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefono skambučių išvestis"</string> <string name="output_none_found" msgid="5544982839808921091">"Įrenginių nerasta"</string> @@ -590,8 +602,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Naudodami pranešimų valdiklius galite nustatyti programos pranešimų svarbos lygį nuo 0 iki 5. \n\n"<b>"5 lygis"</b>" \n– Rodyti pranešimų sąrašo viršuje \n– Leisti pertraukti, kai veikia viso ekrano režimas \n– Visada rodyti pranešimus \n\n"<b>"4 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Visada rodyti pranešimus \n\n"<b>"3 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n\n"<b>"2 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n\n"<b>"1 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n– Slėpti užrakinimo ekrane ir būsenos juostoje \n– Rodyti pranešimų sąrašo apačioje \n\n"<b>"0 lygis"</b>" \n– Blokuoti visus programos pranešimus"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Pranešimai"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Nebematysite šių pranešimų"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Toliau rodyti"</string> @@ -689,9 +700,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Iškarpinė"</item> <item msgid="5742013440802239414">"Klavišo kodas"</item> - <item msgid="8802889973626281575">"Klaviatūros perjungiklis"</item> - <item msgid="7095517796293767867">"Pasukimo pasiūlymas"</item> - <item msgid="8494159969042135235">"Nėra"</item> + <item msgid="1951959982985094069">"Pasukimo patvirtinimas, klaviatūros perjungiklis"</item> + <item msgid="8175437057325747277">"Nėra"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Įprastas"</item> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 1d0d57af9a12..a4b7d2e7e7a0 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -104,12 +104,11 @@ <string name="camera_label" msgid="7261107956054836961">"atvērt kameru"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Atlasiet jaunu uzdevumu izkārtojumu"</string> <string name="cancel" msgid="6442560571259935130">"Atcelt"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Lietojumprogrammas ikona"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Palīdzības ziņojuma apgabals"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Saderības tālummaiņas poga."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Veikt tālummaiņu no mazāka ekrāna uz lielāku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth savienojums ir izveidots."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Saldo ēdienu stends"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekrānsaudzētājs"</string> <string name="ethernet_label" msgid="7967563676324087464">"Tīkls Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netraucēt"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tikai prioritārie"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tikai signāli"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ir izslēgts"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi savienojums ieslēgts"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nav pieejams neviens Wi-Fi tīkls."</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Signāls"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Apraide"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Notiek apraide…"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nenosaukta ierīce"</string> @@ -329,9 +331,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Notiek savienojuma izveide…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Piesaiste"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tīklājs"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Notiek ieslēgšana…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="zero">%d ierīču</item> + <item quantity="one">%d ierīce</item> + <item quantity="other">%d ierīces</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Paziņojumi"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zibspuldze"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilie dati"</string> @@ -341,10 +346,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Tiek izmantots: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ierobežojums: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> brīdinājums"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Darba profils"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Paziņojumi un lietotnes ir izslēgtas"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nakts režīms"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Saulrietā"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Līdz saullēktam"</string> @@ -362,8 +365,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Lietotne <xliff:g id="APP">%s</xliff:g> ir atspējota drošajā režīmā."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Notīrīt visu"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Velciet šeit, lai izmantotu ekrāna sadalīšanu"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontāls dalījums"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikāls dalījums"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pielāgots dalījums"</string> @@ -504,11 +505,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Izslēgt tūlīt"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Izvērst"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sakļaut"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Pārslēgt izvades ierīci"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrāns ir piesprausts"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām Atpakaļ un Pārskats un turiet tās."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogai Pārskats un turiet to."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogai “Sākums” un turiet to."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Sapratu!"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nē, paldies"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekrāns ir piesprausts"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekrāns ir atsprausts"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vai paslēpt vienumu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tas tiks atkārtoti parādīts, kad nākamreiz ieslēgsiet to iestatījumos."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Paslēpt"</string> @@ -531,8 +539,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Pieskarieties, lai iestatītu vibrozvanu."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Pieskarieties, lai izslēgtu skaņu."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tiek rādītas %s skaļuma vadīklas. Velciet augšup, lai nerādītu."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Skaļuma vadīklas paslēptas"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s skaļuma vadīklas"</string> <string name="output_title" msgid="5355078100792942802">"Multivides izvade"</string> <string name="output_calls_title" msgid="8717692905017206161">"Tālruņa zvana izvade"</string> <string name="output_none_found" msgid="5544982839808921091">"Nav atrasta neviena ierīce"</string> @@ -588,8 +595,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Izmantojot barošanas paziņojumu vadīklas, varat lietotnes paziņojumiem iestatīt svarīguma līmeni (no 0 līdz 5). \n\n"<b>"5. līmenis"</b>" \n- Tiek rādīts paziņojumu saraksta augšdaļā \n- Tiek atļauta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"4. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"3. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n\n"<b>"2. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n\n"<b>"1. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n- Paziņojumi tiek paslēpti bloķēšanas ekrānā un statusa joslā \n- Paziņojumi tiek rādīti paziņojumu saraksta apakšdaļā \n\n"<b>"0. līmenis"</b>" \n- Visi lietotnes paziņojumi tiek bloķēti"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Paziņojumi"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Jūs vairs neredzēsiet šos paziņojumus."</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Turpināt rādīt"</string> @@ -685,9 +691,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Starpliktuve"</item> <item msgid="5742013440802239414">"Taustiņu kods"</item> - <item msgid="8802889973626281575">"Tastatūras pārslēdzējs"</item> - <item msgid="7095517796293767867">"Rotācijas ieteikums"</item> - <item msgid="8494159969042135235">"Nav"</item> + <item msgid="1951959982985094069">"Apstiprināt pagriežot, tastatūras pārslēdzējs"</item> + <item msgid="8175437057325747277">"Neviens"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normāls"</item> diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 07ea7aa04109..a7f6aae4de47 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"отвори камера"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона за апликацијата"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Поле за пораки за помош"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Заштитник на екран"</string> <string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не вознемирувај"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетно"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi е исклучено"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Вклучено е Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Нема достапни Wi-Fi мрежи"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Аларм"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Емитувај"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Емитување"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименуван уред"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> е оневозможен во безбеден режим."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Исчисти ги сите"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Повлечете тука за да користите поделен екран"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Повлечете нагоре за да се префрлите од една на друга апликација"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Раздели хоризонтално"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Раздели вертикално"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Раздели прилагодено"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Префрлете го излезниот уред"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екранот е прикачен"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Назад“ и „Почетен екран“ за откачување."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Краток преглед“ за откачување."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Почетен екран“ за откачување."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"За откачување на екранов, допрете и задржете ги копчињата „Назад“ и „Краток преглед“"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"За откачување на екранов, допрете и задржете ги копчињата „Назад“ и „Почетен екран“"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Сфатив"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Не, фала"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Екранот е прикачен"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Екранот е откачен"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сокриј <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ќе се појави повторно следниот пат кога ќе го вклучите во поставки."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сокриј"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Допрете за да се постави на вибрации."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Допрете за да се исклучи звукот."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Прикажани се контролите за јачина на звукот на %s. Повлечете нагоре за да отфрлите."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Скриени се контролите за јачина на звукот"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Контроли на јачината на звукот за %s"</string> <string name="output_title" msgid="5355078100792942802">"Излез за аудиовизуелни содржини"</string> <string name="output_calls_title" msgid="8717692905017206161">"Излез за телефонски повик"</string> <string name="output_none_found" msgid="5544982839808921091">"Не се најдени уреди"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Табла со исечоци"</item> <item msgid="5742013440802239414">"Код на копче"</item> - <item msgid="8802889973626281575">"Менувач на тастатура"</item> - <item msgid="7095517796293767867">"Предлог за ротација"</item> - <item msgid="8494159969042135235">"Нема"</item> + <item msgid="1951959982985094069">"Потврди ротирање, менувач на тастатура"</item> + <item msgid="8175437057325747277">"Ништо"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Нормални"</item> diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index d4d629738140..c59c774b7e07 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ക്യാമറ തുറക്കുക"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string> <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ആപ്പ് ഐക്കൺ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"സഹായ സന്ദേശ ഏരിയ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ഡെസേർട്ട് കെയ്സ്"</string> <string name="start_dreams" msgid="5640361424498338327">"സ്ക്രീൻ സേവർ"</string> <string name="ethernet_label" msgid="7967563676324087464">"ഇതർനെറ്റ്"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ശല്ല്യപ്പെടുത്തരുത്"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"മുൻഗണന മാത്രം"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"അലാറങ്ങൾ മാത്രം"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"വൈഫൈ ഓഫുചെയ്യുക"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"അലാറം"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"കാസ്റ്റുചെയ്യുക"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"കാസ്റ്റുചെയ്യുന്നു"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാത്ത ഉപകരണം"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"സുരക്ഷിത മോഡിൽ <xliff:g id="APP">%s</xliff:g> പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"എല്ലാം മായ്ക്കുക"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"സ്പ്ലിറ്റ് സ്ക്രീൻ ഉപയോഗിക്കുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"തിരശ്ചീനമായി വേർതിരിക്കുക"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ലംബമായി വേർതിരിക്കുക"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ഇഷ്ടാനുസൃതമായി വേർതിരിക്കുക"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ഇപ്പോൾ ഓഫ് ചെയ്യുക"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"വികസിപ്പിക്കുക"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ചുരുക്കുക"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ഔട്ട്പുട്ട് ഉപകരണം മാറുക"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"സ്ക്രീൻ പിൻ ചെയ്തു"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ\', \'ചുരുക്കവിവരണം\' എന്നിവ സ്പർശിച്ച് പിടിക്കുക."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ പോവുക\', \'ഹോം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ചുരുക്കവിവരണം\' സ്പർശിച്ച് പിടിക്കുക."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ഹോം\' ബട്ടൺ സ്പർശിച്ച് പിടിക്കുക."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, \'തിരികെ പോവുക\', \'അവലോകനം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, \'തിരികെ പോവുക\', \'ഹോം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"മനസ്സിലായി"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"വേണ്ട, നന്ദി"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"സ്ക്രീൻ പിൻ ചെയ്തു"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"സ്ക്രീൻ അൺപിൻ ചെയ്തു"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> എന്നത് മറയ്ക്കണോ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"അടുത്ത തവണ നിങ്ങൾ അത് ക്രമീകരണങ്ങളിൽ ഓണാക്കുമ്പോൾ അത് വീണ്ടും ദൃശ്യമാകും."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"മറയ്ക്കുക"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s വോളിയം നിയന്ത്രണങ്ങൾ കാണിച്ചിരിക്കുന്നു. ഡിസ്മിസ് ചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"വോളിയം നിയന്ത്രണങ്ങൾ മറച്ചിരിക്കുന്നു"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ശബ്ദ നിയന്ത്രണങ്ങൾ"</string> <string name="output_title" msgid="5355078100792942802">"മീഡിയ ഔട്ട്പുട്ട്"</string> <string name="output_calls_title" msgid="8717692905017206161">"ഫോൺ കോൾ ഔട്ട്പുട്ട്"</string> <string name="output_none_found" msgid="5544982839808921091">"ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ക്ലിപ്പ്ബോർഡ്"</item> <item msgid="5742013440802239414">"കീകോഡ്"</item> - <item msgid="8802889973626281575">"കീബോർഡ് സ്വിച്ചർ"</item> - <item msgid="7095517796293767867">"തിരിക്കൽ നിർദ്ദേശം"</item> - <item msgid="8494159969042135235">"ഒന്നുമില്ല"</item> + <item msgid="1951959982985094069">"റൊട്ടേറ്റ് ചെയ്യൽ സ്ഥിരീകരിക്കുക, കീബോഡ് മാറൽ"</item> + <item msgid="8175437057325747277">"ഒന്നുമില്ല"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"സാധാരണ വേഗത്തിൽ"</item> diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index f1d0c1811238..af98542cc5ad 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -101,12 +101,11 @@ <string name="camera_label" msgid="7261107956054836961">"камер нээх"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Шинэ ажиллах талбарыг сонгоно уу"</string> <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Аппын дүрс тэмдэг"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Туслах зурвасын хэсэг"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой өсгөх товч."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Жижгээс том дэлгэцрүү өсгөх."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth холбогдсон."</string> @@ -273,6 +272,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Амттаны хайрцаг"</string> <string name="start_dreams" msgid="5640361424498338327">"Дэлгэц амраагч"</string> <string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Бүү саад бол"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Зөвхөн чухал зүйлс"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Зөвхөн сэрүүлэг"</string> @@ -309,6 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi унтарсан"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi асаалттай"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi сүлжээ байхгүй байна"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Сэрүүлэг"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Дамжуулах"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Дамжуулж байна"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Нэргүй төхөөрөмж"</string> @@ -325,9 +327,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Холбогдож байна..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Модем болгох"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Сүлжээний цэг"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Асааж байна…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d төхөөрөмж</item> + <item quantity="one">%d төхөөрөмж</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Мэдэгдэл"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Гар чийдэн"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобайл дата"</string> @@ -337,10 +341,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ашигласан"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> хязгаар"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> анхааруулга"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Ажлын профайл"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Мэдэгдэл болон апп унтраалттай байна"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Шөнийн гэрэл"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Нар жаргах үед"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Нар мандах хүртэл"</string> @@ -358,8 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>-г аюулгүй горимд идэвхгүй болгосон."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Бүгдийг арилгах"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Хуваагдсан дэлгэцийг ашиглахын тулд энд чирэх"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хэвтээ чиглэлд хуваах"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Босоо чиглэлд хуваах"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Хүссэн хэлбэрээр хуваах"</string> @@ -500,11 +500,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Одоо унтраах"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Дэлгэх"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Хураах"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Гаралтын төхөөрөмжийг солих"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Дэлгэц эхэнд байрлуулагдсан"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулна. Тогтоосныг болиулахын тулд Буцах, Тоймыг дараад хүлээнэ үү."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Таныг тогтоосныг болиулах хүртэл харагдах болно. Тогтоосныг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Тойм товчлуурыг дараад хүлээнэ үү"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ойлголоо"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Үгүй"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Дэлгэцийг тогтоосон"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Дэлгэцийг тогтоосныг болиулсан"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>-ийг нуух уу?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Тохируулгын хэсэгт үүнийг асаахад энэ дахин харагдана."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Нуух"</string> @@ -527,10 +534,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Чичиргээнд тохируулахын тулд товшино уу."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дууг хаахын тулд товшино уу."</string> - <!-- String.format failed for translation --> - <!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) --> - <skip /> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Түвшний удирдлагыг нуусан"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s түвшний хяналт"</string> <string name="output_title" msgid="5355078100792942802">"Медиа гаралт"</string> <string name="output_calls_title" msgid="8717692905017206161">"Утасны дуудлагын гаралт"</string> <string name="output_none_found" msgid="5544982839808921091">"Төхөөрөмж олдсонгүй"</string> @@ -586,8 +590,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын түвшин тогтоох боломжтой. \n\n"<b>"5-р түвшин"</b>" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"4-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"3-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n"<b>"2-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n"<b>"1-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n"<b>"0-р түвшин"</b>" \n- Энэ апп-н бүх мэдэгдлийг блоклоно"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Мэдэгдэл"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Та эдгээр мэдэгдлийг цаашид харахгүй"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Харуулсан хэвээр байх"</string> @@ -681,9 +684,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Түр санах ой"</item> <item msgid="5742013440802239414">"Түлхүүр код"</item> - <item msgid="8802889973626281575">"Гар солигч"</item> - <item msgid="7095517796293767867">"Эргүүлэлтийн зөвлөмж"</item> - <item msgid="8494159969042135235">"Байхгүй"</item> + <item msgid="1951959982985094069">"Эргүүлэхийг баталгаажуулах, гар солигч"</item> + <item msgid="8175437057325747277">"Хоосон"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Энгийн"</item> diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index c34811017954..bf2d7ae9657e 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"कॅमेरा उघडा"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अॅप्लिकेशन आयकन"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मदत संदेश क्षेत्र"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"मिष्ठान्न प्रकरण"</string> <string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेव्हर"</string> <string name="ethernet_label" msgid="7967563676324087464">"इथरनेट"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"व्यत्यय आणू नका"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवळ प्राधान्य"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवळ अलार्म"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाय-फाय बंद"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाय-फाय चालू"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"वाय-फाय नेटवर्क उपलब्ध नाहीत"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करा"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"निनावी डिव्हाइस"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> सुरक्षित-मोडमध्ये अक्षम केला आहे."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सर्व साफ करा"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रीन वापर करण्यासाठी येथे ड्रॅग करा"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज विभाजित करा"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"अनुलंब विभाजित करा"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"सानुकूल विभाजित करा"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"आता बंद करा"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तृत करा"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"संकुचित करा"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट डिव्हाइस स्विच करा"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन केलेली आहे"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"तुम्ही अनपिन करेर्यंत हे त्याला दृश्यामध्ये ठेवते. अनपिन करण्यासाठी मागे आणि होम वर स्पर्श करा आणि धरून ठेवा."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"तुम्ही अनपिन करेपर्यंत हे त्यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी होमला स्पर्श करा आणि धरून ठेवा."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"हा स्क्रीन अनपिन करण्यासाठी, मागे आणि अवलोकन बटणांना स्पर्श करून धरून ठेवा"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"हा स्क्रीन अनपिन करण्यासाठी, मागे आणि होम बटणांना स्पर्श करून धरून ठेवा"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"समजले"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"नाही, नको"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रीन पिन केला"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रीन अनपिन केला"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"आपण सेटिंग्जमध्ये ते पुढील वेळी चालू कराल तेव्हा ते पुन्हा दिसेल."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लपवा"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. नि:शब्द करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा नि:शब्द केल्या जाऊ शकतात."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन सेट करण्यासाठी टॅप करा."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. नि:शब्द करण्यासाठी टॅप करा."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s आवाज नियंत्रणे दर्शविली. डिसमिस करण्यासाठी वर स्वाइप करा."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"आवाज नियंत्रणे लपविली"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s व्हॉल्यूम नियंत्रण"</string> <string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string> <string name="output_calls_title" msgid="8717692905017206161">"फोन कॉल आउटपुट"</string> <string name="output_none_found" msgid="5544982839808921091">"कोणतीही डिव्हाइस सापडली नाहीत"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"क्लिपबोर्ड"</item> <item msgid="5742013440802239414">"कीकोड"</item> - <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item> - <item msgid="7095517796293767867">"रोटेशन सूचना"</item> - <item msgid="8494159969042135235">"काहीही नाही"</item> + <item msgid="1951959982985094069">"फिरवणे निश्चित, कीबोर्ड स्विचर"</item> + <item msgid="8175437057325747277">"काहीही नाही"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"सामान्य"</item> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index d2674aeb19bf..97bde1d5c9f9 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"buka kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pilih reka letak tugas baharu"</string> <string name="cancel" msgid="6442560571259935130">"Batal"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikon aplikasi"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Bahagian mesej bantuan"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butang zum keserasian."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Skrin zum lebih kecil kepada lebih besar."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth disambungkan."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Bekas Pencuci Mulut"</string> <string name="start_dreams" msgid="5640361424498338327">"Penyelamat skrin"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Keutamaan sahaja"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Penggera sahaja"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Dimatikan"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Dihidupkan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tiada rangkaian Wi-Fi tersedia"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Penggera"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Hantar"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Menghantar"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Peranti tidak bernama"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Penambatan"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tempat liputan"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Menghidupkan…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d peranti</item> + <item quantity="one">%d peranti</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pemberitahuan"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampu suluh"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data mudah alih"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> digunakan"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> had"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Amaran <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil kerja"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Pemberitahuan & apl dimatikan"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Cahaya Malam"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Dihidupkan pd senja"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hingga matahari terbit"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dilumpuhkan dalam mod selamat."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kosongkan semua"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Seret ke sini untuk menggunakan skrin pisah"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Mendatar Terpisah"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Menegak Terpisah"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tersuai Terpisah"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Matikan sekarang"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Kembangkan"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Runtuhkan"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Tukar peranti output"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skrin telah disemat"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Ikhtisar untuk menyahsemat."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Skrin Utama untuk menyahsemat."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Ikhtisar untuk menyahsemat."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Skrin Utama untuk menyahsemat."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk menyahsemat skrin ini, sentuh & tahan butang Kembali dan Ikhtisar"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk menyahsemat skrin ini, sentuh & tahan butang Kembali dan Skrin Utama"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Faham"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Tidak"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skrin disemat"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skrin dinyahsemat"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Mesej itu akan terpapar semula pada kali seterusnya anda menghidupkan apl dalam tetapan."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ketik untuk menetapkan pada getar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ketik untuk meredam."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kawalan kelantangan ditunjukkan. Leret ke atas untuk mengetepikan."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kawalan kelantangan disembunyikan"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s kawalan kelantangan"</string> <string name="output_title" msgid="5355078100792942802">"Output media"</string> <string name="output_calls_title" msgid="8717692905017206161">"Output panggilan telefon"</string> <string name="output_none_found" msgid="5544982839808921091">"Tiada peranti ditemui"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kawalan pemberitahuan berkuasa, anda boleh menetapkan tahap kepentingan dari 0 hingga 5 untuk pemberitahuan apl. \n\n"<b>"Tahap 5"</b>" \n- Tunjukkan pada bahagian atas senarai pemberitahuan \n- Benarkan gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 4"</b>" \n- Halang gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 3"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n\n"<b>"Tahap 2"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi dan bergetar \n\n"<b>"Tahap 1"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi atau bergetar \n- Sembunyikan daripada skrin kunci dan bar status \n- Tunjukkan di bahagian bawah senarai pemberitahuan \n\n"<b>"Tahap 0"</b>" \n- Sekat semua pemberitahuan daripada apl"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Pemberitahuan"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Anda tidak akan melihat pemberitahuan ini lagi"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Terus tunjukkan"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Papan Keratan"</item> <item msgid="5742013440802239414">"Kod Kunci"</item> - <item msgid="8802889973626281575">"Penukar papan kekunci"</item> - <item msgid="7095517796293767867">"Cadangan putaran"</item> - <item msgid="8494159969042135235">"Tiada"</item> + <item msgid="1951959982985094069">"Pengesahan putaran, penukar papan kekunci"</item> + <item msgid="8175437057325747277">"Tiada"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Biasa"</item> diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index 41f28e2093e1..0e4d37515d72 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -103,6 +103,7 @@ <string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string> <string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string> + <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"အပလီကေးရှင်း သင်္ကေတ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string> @@ -272,6 +273,7 @@ <string name="dessert_case" msgid="1295161776223959221">"မုန့်ထည့်သော ပုံး"</string> <string name="start_dreams" msgid="5640361424498338327">"ဖန်သားပြင်အသုံးပြုမှု ချွေတာမှုစနစ်"</string> <string name="ethernet_label" msgid="7967563676324087464">"အီသာနက်"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"နောက်ထပ် ရွေးချယ်စရာများအတွက် သင်္ကေတပုံများကို ဖိထားပါ"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"မနှောင့်ယှက်ရ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ဦးစားပေးများသာ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"နှိုးစက်များသာ"</string> @@ -308,8 +310,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ဝိုင်ဖိုင်ပိတ်ရန်"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"နှိုးစက်"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string> @@ -359,7 +360,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ကို ဘေးကင်းလုံခြုံသည့်မုဒ်တွင် ပိတ်ထားပါသည်။"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"အားလုံး ဖယ်ရှားပါ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"မျက်နှာပြင် ခွဲခြမ်းပြသခြင်းကို အသုံးပြုရန် ဤနေရာသို့ ပွတ်၍ဆွဲထည့်ပါ"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"အက်ပ်များကို ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ရေပြင်ညီ ပိုင်းမည်"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ဒေါင်လိုက်ပိုင်းမည်"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"စိတ်ကြိုက် ပိုင်းမည်"</string> @@ -503,21 +503,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"အထွက် စက်ပစ္စည်းကို ပြောင်းပါ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"သင်က ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ။"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"သင်က ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'ပင်မ\' ခလုတ်ကို တို့၍ဖိထားပါ။"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် \'နောက်သို့\' နှင့် \'အနှစ်ချုပ်\' ခလုတ်တို့ကို တို့၍ဖိထားပါ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ရပါပြီ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"မလိုတော့ပါ"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"မျက်နှာပြင်ကို ပင်ထိုးထားသည်"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"မျက်နှာပြင်ကို ပင်ဖြုတ်လိုက်ပါပြီ"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ဝှက်မည်လား?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ဖျောက်ထားမည်"</string> @@ -540,8 +534,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s။ တုန်ခါခြင်းသို့ သတ်မှတ်ရန်တို့ပါ။"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s။ အသံတိတ်ရန် တို့ပါ။"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"အသံအတိုးအလျှော့ခလုတ် %s ပြသထားပါသည်။ ပယ်ရန် အပေါ်သို့ပွတ်ဆွဲပါ။"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"အသံအတိုးအလျှော့ခလုတ်များကို ဝှက်ထားပါသည်"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s အသံအတိုးအလျှော့ ခလုတ်များ"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"မီဒီယာ အထွက်"</string> <string name="output_calls_title" msgid="8717692905017206161">"ဖုန်းလိုင်း အထွက်"</string> <string name="output_none_found" msgid="5544982839808921091">"မည်သည့် စက်ပစ္စည်းမျှ မတွေ့ပါ"</string> @@ -691,9 +690,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ကလစ်ဘုတ်"</item> <item msgid="5742013440802239414">"ကီးကုဒ်"</item> - <item msgid="8802889973626281575">"ကီးဘုတ် ပြောင်းလဲပေးသည့်စနစ်"</item> - <item msgid="7095517796293767867">"လှည့်မှု အကြံပြုချက်"</item> - <item msgid="8494159969042135235">"တစ်ခုမျှမရှိ"</item> + <item msgid="1951959982985094069">"လှည့်ခြင်းကို အတည်ပြုရန်၊ ကီးဘုတ်ပြောင်း ကိရိယာ"</item> + <item msgid="8175437057325747277">"တစ်ခုမျှမရှိ"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ပုံမှန်"</item> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 5bd4f2ee321d..0d79faafecf0 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"åpne kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Velg en ny utforming for oppgaver"</string> <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appikon"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område for hjelpemelding"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertmonter"</string> <string name="start_dreams" msgid="5640361424498338327">"Skjermsparer"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"«Ikke forstyrr»"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Bare prioritet"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Bare alarmer"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi er av"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er slått av i sikker modus."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tøm alt"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit for å bruke delt skjerm"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Sveip opp for å bytte apper"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Del horisontalt"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Del vertikalt"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Del tilpasset"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Slå av nå"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Utvid"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skjul"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Bytt enhet for lydutgang"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skjermen er låst"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Startside for å løsne den."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Oversikt for å løsne den."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Startside for å løsne den."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"For å løsne denne skjermen, trykk på og hold inne Tilbake- og Oversikt-knappene"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"For å løsne denne skjermen, trykk på og hold inne Tilbake- og Startside-knappene"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Skjønner"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nei takk"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skjermen er festet"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skjermen er løsnet"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den vises igjen neste gang du slår den på i innstillingene."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skjul"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trykk for å angi vibrasjon."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trykk for å slå av lyden."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumkontrollene for %s vises. Sveip opp for å avvise dem."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumkontrollene er skjult"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s volumkontroller"</string> <string name="output_title" msgid="5355078100792942802">"Medieutdata"</string> <string name="output_calls_title" msgid="8717692905017206161">"Utgang for telefonsamtaler"</string> <string name="output_none_found" msgid="5544982839808921091">"Fant ingen enheter"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Utklippstavle"</item> <item msgid="5742013440802239414">"Tastkode"</item> - <item msgid="8802889973626281575">"Bytteknapp for tastatur"</item> - <item msgid="7095517796293767867">"Forslag til rotasjon"</item> - <item msgid="8494159969042135235">"Ingen"</item> + <item msgid="1951959982985094069">"Rotasjonsbekreftelse, bytteknapp for tastatur"</item> + <item msgid="8175437057325747277">"Ingen"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index ca81f44f7cac..83651517cf0f 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"क्यामेरा खोल्नुहोस्"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string> <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अनुप्रयोग जनाउने आइकन"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"स्क्रिन सेभर"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"बाधा नपुर्याउँनुहोस्"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"प्राथमिकता मात्र"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"अलार्महरू मात्र"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बन्द"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi सक्रिय छ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi नेटवर्क अनुपलब्ध"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"प्रसारण गर्दै"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"बेनाम उपकरण"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> लाई सुरक्षित-मोडमा असक्षम गरिएको छ।"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"सबै हटाउनुहोस्"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रिनको प्रयोग गर्नका लागि यहाँ तान्नुहोस्"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"तेर्सो रूपमा विभाजन गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ठाडो रूपमा विभाजन गर्नुहोस्"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"आफू अनुकूल विभाजन गर्नुहोस्"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"अहिले नै निष्क्रिय पार्नुहोस्"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार गर्नुहोस्"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"संक्षिप्त पार्नुहोस्"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट यन्त्र बदल्नुहोस्"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"पर्दा राखेका छ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्।"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई छोइराख्नुहोस्।"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"यस स्क्रिनलाई अनपनि गर्न पछाडि र परिदृश्य नामक बटनहरूलाई छोइराख्नुहोस्"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"यस स्क्रिनलाई अनपनि गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"बुझेँ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"धन्यवाद पर्दैन"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रिन पिन गरियो"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रिन अनपिन गरियो"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"लुकाउनुहुन्छ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"यो तपाईं सेटिङ् मा यो बारी अर्को समय देखापर्नेछ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लुकाउनुहोस्"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। म्यूट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। कम्पन मोडमा सेट गर्न ट्याप गर्नुहोस्।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। म्यूट गर्न ट्याप गर्नुहोस्।"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s का भोल्युम सम्बन्धी नियन्त्रणहरूलाई देखाइएको छ। खारेज गर्नका लागि स्वाइप गर्नुहोस्।"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"भोल्युम सम्बन्धी नियन्त्रणहरूलाई लुकाइयो"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s भोल्युमका नियन्त्रणहरू"</string> <string name="output_title" msgid="5355078100792942802">"मिडियाको आउटपुट"</string> <string name="output_calls_title" msgid="8717692905017206161">"फोन कलको आउटपुट"</string> <string name="output_none_found" msgid="5544982839808921091">"कुनै पनि यन्त्र भेटिएन"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"क्लिपबोर्ड"</item> <item msgid="5742013440802239414">"किकोड"</item> - <item msgid="8802889973626281575">"किबोर्ड स्विचर"</item> - <item msgid="7095517796293767867">"परिक्रमासम्बन्धी सुझाव"</item> - <item msgid="8494159969042135235">"कुनै पनि होइन"</item> + <item msgid="1951959982985094069">"घुमाउने कार्यको निश्चितता, किबोर्ड स्विचर"</item> + <item msgid="8175437057325747277">"कुनै पनि होइन"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"साधारण"</item> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 896d15690721..a2c1717289f3 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"camera openen"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Nieuwe taakindeling selecteren"</string> <string name="cancel" msgid="6442560571259935130">"Annuleren"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"App-pictogram"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Gebied voor Help-berichten"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knop voor compatibiliteitszoom."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kleiner scherm uitzoomen naar groter scherm."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-verbinding ingesteld."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertshowcase"</string> <string name="start_dreams" msgid="5640361424498338327">"Screensaver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Niet storen"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Alleen prioriteit"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alleen wekkers"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi uit"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi aan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen wifi-netwerken beschikbaar"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wekker"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Casten"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Casten"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Naamloos apparaat"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Verbinding maken…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Inschakelen..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d apparaten</item> + <item quantity="one">%d apparaat</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Meldingen"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zaklamp"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiele data"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> gebruikt"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiet van <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Waarschuwing voor <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Werkprofiel"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Meldingen en apps zijn uitgeschakeld"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nachtverlichting"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan bij zonsondergang"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot zonsopgang"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is uitgeschakeld in de veilige modus"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alles wissen"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Sleep hier naartoe om het scherm te splitsen"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontaal splitsen"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verticaal splitsen"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Aangepast splitsen"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Nu uitschakelen"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Uitvouwen"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Samenvouwen"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Naar een ander uitvoerapparaat schakelen"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Scherm is vastgezet"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Home en houd deze vast om het scherm los te maken."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Overzicht en houd dit vast om het scherm los te maken."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Home en houd dit vast om het scherm los te maken."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Tik op Terug en Overzicht en houd deze knoppen vast om dit scherm los te maken"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Tik op Terug en Home en houd deze knoppen vast om dit scherm los te maken"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ik snap het"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nee, bedankt"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Scherm vastgezet"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Scherm losgemaakt"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> verbergen?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Deze wordt opnieuw weergegeven zodra u de instelling weer inschakelt."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Verbergen"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om in te stellen op trillen."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te dempen."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumeknoppen van %s worden weergegeven. Veeg omhoog om te sluiten."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumeknoppen verborgen"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s-volumeknoppen"</string> <string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string> <string name="output_calls_title" msgid="8717692905017206161">"Uitvoer van telefoongesprek"</string> <string name="output_none_found" msgid="5544982839808921091">"Geen apparaten gevonden"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n"<b>"Niveau 5"</b>" \n- Boven aan de lijst met meldingen weergeven \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n"<b>"Niveau 4"</b>" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n"<b>"Niveau 3"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n"<b>"Niveau 2"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n"<b>"Niveau 1"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelingsscherm en statusbalk \n- Onder aan de lijst met meldingen weergeven \n\n"<b>"Niveau 0"</b>" \n- Alle meldingen van de app blokkeren"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Meldingen"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Deze meldingen worden niet meer weergegeven"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Blijven weergeven"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Klembord"</item> <item msgid="5742013440802239414">"Toetscode"</item> - <item msgid="8802889973626281575">"Toetsenbordschakelaar"</item> - <item msgid="7095517796293767867">"Rotatiesuggestie"</item> - <item msgid="8494159969042135235">"Geen"</item> + <item msgid="1951959982985094069">"Draaien bevestigen, toetsenbordschakelaar"</item> + <item msgid="8175437057325747277">"Geen"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normaal"</item> diff --git a/packages/SystemUI/res/values-or-land/strings.xml b/packages/SystemUI/res/values-or-land/strings.xml new file mode 100644 index 000000000000..484e924f38d2 --- /dev/null +++ b/packages/SystemUI/res/values-or-land/strings.xml @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2010, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="toast_rotation_locked" msgid="7609673011431556092">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲକ୍ ଅଛି।"</string> +</resources> diff --git a/packages/SystemUI/res/values-or/config.xml b/packages/SystemUI/res/values-or/config.xml new file mode 100644 index 000000000000..5309563e3986 --- /dev/null +++ b/packages/SystemUI/res/values-or/config.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/* +** Copyright 2009, 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. +*/ + --> + +<!-- These resources are around just to allow their values to be customized + for different hardware and product builds. --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string> +</resources> diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml new file mode 100644 index 000000000000..c35c8a74a1b4 --- /dev/null +++ b/packages/SystemUI/res/values-or/strings.xml @@ -0,0 +1,1219 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- +/** + * Copyright (c) 2009, The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="app_label" msgid="7164937344850004466">"ସିଷ୍ଟମ୍ UI"</string> + <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ଖାଲି କରନ୍ତୁ"</string> + <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ତାଲିକାରୁ ବାହାର କରନ୍ତୁ"</string> + <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ଆପ୍ ସୂଚନା"</string> + <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ଆପଣଙ୍କ ସମ୍ପ୍ରତି ସ୍କ୍ରୀନ୍ ଏଠାରେ ଦେଖାଯାଉଛି"</string> + <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"କିଛି ସମୟ ପୂର୍ବରୁ ଇନଷ୍ଟଲ୍ ହୋଇଥିବା ଆପ୍ଗୁଡ଼ିକୁ ଖାରଜ କରନ୍ତୁ"</string> + <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> + <item quantity="other">ଓଭର୍ଭ୍ୟୁରେ %d ସ୍କ୍ରୀନ୍</item> + <item quantity="one">ଓଭର୍ଭ୍ୟୁରେ 1 ସ୍କ୍ରୀନ୍</item> + </plurals> + <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string> + <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ଚାଲୁଅଛି"</string> + <string name="status_bar_latest_events_title" msgid="6594767438577593172">"ବିଜ୍ଞପ୍ତି"</string> + <string name="battery_low_title" msgid="6456385927409742437">"ବ୍ୟାଟେରୀ କମ୍ ଅଛି"</string> + <!-- no translation found for battery_low_title_hybrid (6268991275887381595) --> + <skip /> + <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବାକି ଅଛି"</string> + <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) --> + <skip /> + <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) --> + <skip /> + <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) --> + <skip /> + <string name="invalid_charger" msgid="4549105996740522523">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।\nକେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="invalid_charger_title" msgid="3515740382572798460">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।"</string> + <string name="invalid_charger_text" msgid="5474997287953892710">"କେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string> + <string name="battery_low_why" msgid="4553600287639198111">"ସେଟିଙ୍ଗ"</string> + <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) --> + <skip /> + <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ଅନ୍ କରନ୍ତୁ"</string> + <!-- no translation found for battery_saver_start_action (8187820911065797519) --> + <skip /> + <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ସେଟିଙ୍ଗ"</string> + <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ୱାଇ-ଫାଇ"</string> + <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରୀନ୍"</string> + <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ମ୍ୟୁଟ୍"</string> + <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ସ୍ୱତଃ"</string> + <string name="status_bar_settings_notifications" msgid="397146176280905137">"ବିଜ୍ଞପ୍ତି"</string> + <string name="bluetooth_tethered" msgid="7094101612161133267">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ୍"</string> + <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ଇନପୁଟ୍ ପଦ୍ଧତି ସେଟ୍ କରନ୍ତୁ"</string> + <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ଫିଜିକଲ୍ କୀ’ବୋର୍ଡ୍"</string> + <!-- no translation found for usb_device_permission_prompt (1825685909587559679) --> + <skip /> + <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) --> + <skip /> + <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) --> + <skip /> + <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) --> + <skip /> + <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ଇନଷ୍ଟଲ୍ ହୋଇଥିବା କୌଣସି ଆପ୍ ଏହି USB ଆକ୍ସେସୋରୀରେ କାମ କରେନାହିଁ। ଏହି ଆକ୍ସେସୋରୀ ବିଷୟରେ <xliff:g id="URL">%1$s</xliff:g>ରେ ଅଧିକ ଜାଣନ୍ତୁ"</string> + <string name="title_usb_accessory" msgid="4966265263465181372">"USB ଆକ୍ସେସରୀ"</string> + <string name="label_view" msgid="6304565553218192990">"ଦେଖନ୍ତୁ"</string> + <!-- no translation found for always_use_device (4015357883336738417) --> + <skip /> + <!-- no translation found for always_use_accessory (3257892669444535154) --> + <skip /> + <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> + <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍ କରାଯାଇପାରିବ ନାହିଁ"</string> + <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) --> + <skip /> + <string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string> + <string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string> + <!-- no translation found for global_action_screenshot (8329831278085426283) --> + <skip /> + <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> + <string name="screenshot_saving_title" msgid="8242282144535555697">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string> + <!-- no translation found for screenshot_saving_text (2545047868936087248) --> + <skip /> + <!-- no translation found for screenshot_saved_title (5637073968117370753) --> + <skip /> + <!-- no translation found for screenshot_saved_text (7574667448002050363) --> + <skip /> + <!-- no translation found for screenshot_failed_title (9096484883063264803) --> + <skip /> + <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) --> + <skip /> + <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) --> + <skip /> + <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) --> + <skip /> + <string name="usb_preference_title" msgid="6551050377388882787">"USB ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ର ବିକଳ୍ପ"</string> + <string name="use_mtp_button_title" msgid="4333504413563023626">"ଏକ ମିଡିଆ ପ୍ଲେୟାର୍ (MTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string> + <string name="use_ptp_button_title" msgid="7517127540301625751">"ଏକ କ୍ୟାମେରା (PTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string> + <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac ପାଇଁ Android ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ଆପ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string> + <string name="accessibility_back" msgid="567011538994429120">"ଫେରନ୍ତୁ"</string> + <string name="accessibility_home" msgid="8217216074895377641">"ହୋମ୍"</string> + <string name="accessibility_menu" msgid="316839303324695949">"ମେନୁ"</string> + <!-- no translation found for accessibility_accessibility_button (7601252764577607915) --> + <skip /> + <!-- no translation found for accessibility_rotate_button (7402949513740253006) --> + <skip /> + <string name="accessibility_recent" msgid="5208608566793607626">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string> + <string name="accessibility_search_light" msgid="1103867596330271848">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> + <string name="accessibility_camera_button" msgid="8064671582820358152">"କ୍ୟାମେରା"</string> + <string name="accessibility_phone_button" msgid="6738112589538563574">"ଫୋନ୍"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ଭଏସ୍ ସହାୟକ"</string> + <string name="accessibility_unlock_button" msgid="128158454631118828">"ଅନଲକ୍ କରନ୍ତୁ"</string> + <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) --> + <skip /> + <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) --> + <skip /> + <string name="unlock_label" msgid="8779712358041029439">"ଅନଲକ୍"</string> + <string name="phone_label" msgid="2320074140205331708">"ଫୋନ୍ ଖୋଲନ୍ତୁ"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"ଭଏସ୍ ସହାୟକ ଖୋଲନ୍ତୁ"</string> + <string name="camera_label" msgid="7261107956054836961">"କ୍ୟାମେରା ଖୋଲନ୍ତୁ"</string> + <string name="recents_caption_resize" msgid="3517056471774958200">"ନୂଆ ଟାସ୍କ ଲେଆଉଟ୍ ଚୟନ କରନ୍ତୁ"</string> + <string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> + <skip /> + <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <skip /> + <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।"</string> + <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ଜୁମ୍ କରି ସ୍କ୍ରୀନ୍କୁ ଛୋଟରୁ ବଡ଼ କରନ୍ତୁ।"</string> + <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string> + <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ କରାଯାଇନାହିଁ।"</string> + <string name="accessibility_no_battery" msgid="358343022352820946">"ବ୍ୟାଟେରୀ ନାହିଁ।"</string> + <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ବ୍ୟାଟେରୀର ଗୋଟିଏ ବାର୍ ଅଛି।"</string> + <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ବ୍ୟାଟେରୀର ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ବ୍ୟାଟେରୀର ତିନୋଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_battery_full" msgid="8909122401720158582">"ବ୍ୟାଟେରୀ ପୂର୍ଣ୍ଣ।"</string> + <string name="accessibility_no_phone" msgid="4894708937052611281">"କୌଣସି ଫୋନ୍ ନାହିଁ।"</string> + <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ଫୋନର ଗୋଟିଏ ବାର ଅଛି।"</string> + <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ଫୋନର ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ଫୋନ୍ରେ ତିନୋଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ଫୋନ୍ ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string> + <string name="accessibility_no_data" msgid="4791966295096867555">"କୌଣସି ଡାଟା ନାହିଁ।"</string> + <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ଡାଟାର ଗୋଟିଏ ବାର ଅଛି।"</string> + <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ଡାଟାର ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ଡାଟାର ତିନୋଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ଡାଟା ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string> + <string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string> + <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string> + <!-- no translation found for accessibility_cast_name (4026393061247081201) --> + <skip /> + <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX ନାହିଁ।"</string> + <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXର ଗୋଟିଏ ବାର୍ ଅଛି।"</string> + <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXର ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAXର ତିନୋଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAXର ସିଗ୍ନାଲ୍ ସମ୍ପୂର୍ଣ୍ଣ ଅଛି।"</string> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"ଇଥରନେଟ୍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"ଇଥରନେଟ୍ ସଂଯୁକ୍ତ ହୋଇଛି।"</string> + <string name="accessibility_no_signal" msgid="7064645320782585167">"କୌଣସି ସିଗ୍ନାଲ୍ ନାହିଁ।"</string> + <string name="accessibility_not_connected" msgid="6395326276213402883">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ।"</string> + <string name="accessibility_zero_bars" msgid="3806060224467027887">"କୌଣସି ବାର୍ ନାହିଁ।"</string> + <string name="accessibility_one_bar" msgid="1685730113192081895">"ଗୋଟିଏ ବାର୍ ଅଛି।"</string> + <string name="accessibility_two_bars" msgid="6437363648385206679">"ଦୁଇଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_three_bars" msgid="2648241415119396648">"ତିନୋଟି ବାର୍ ଅଛି।"</string> + <string name="accessibility_signal_full" msgid="9122922886519676839">"ସିଗ୍ନାଲ୍ ଫୁଲ୍ ଅଛି।"</string> + <string name="accessibility_desc_on" msgid="2385254693624345265">"ଅନ୍।"</string> + <string name="accessibility_desc_off" msgid="6475508157786853157">"ଅଫ୍।"</string> + <string name="accessibility_desc_connected" msgid="8366256693719499665">"ସଂଯୁକ୍ତ।"</string> + <string name="accessibility_desc_connecting" msgid="3812924520316280149">"ସଂଯୋଗ କରୁଛି।"</string> + <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string> + <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string> + <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string> + <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string> + <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string> + <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string> + <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) --> + <skip /> + <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string> + <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) --> + <skip /> + <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string> + <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ରୋମିଙ୍ଗ"</string> + <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ଏଜ୍"</string> + <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ୱାଇ-ଫାଇ"</string> + <string name="accessibility_no_sim" msgid="8274017118472455155">"କୌଣସି SIM ନାହିଁ।"</string> + <!-- no translation found for accessibility_cell_data (5326139158682385073) --> + <skip /> + <!-- no translation found for accessibility_cell_data_on (5927098403452994422) --> + <skip /> + <!-- no translation found for accessibility_cell_data_off (443267573897409704) --> + <skip /> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ"</string> + <string name="accessibility_airplane_mode" msgid="834748999790763092">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string> + <!-- no translation found for accessibility_vpn_on (5993385083262856059) --> + <skip /> + <!-- no translation found for accessibility_no_sims (3957997018324995781) --> + <skip /> + <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳାଯାଉଛି।"</string> + <!-- no translation found for accessibility_battery_details (7645516654955025422) --> + <skip /> + <string name="accessibility_battery_level" msgid="7451474187113371965">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା ଅଛି।"</string> + <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) --> + <skip /> + <string name="accessibility_settings_button" msgid="799583911231893380">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ।"</string> + <string name="accessibility_notifications_button" msgid="4498000369779421892">"ବିଜ୍ଞପ୍ତି"</string> + <!-- no translation found for accessibility_overflow_action (5681882033274783311) --> + <skip /> + <string name="accessibility_remove_notification" msgid="3603099514902182350">"ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string> + <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ସକ୍ଷମ।"</string> + <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS ପ୍ରାପ୍ତ କରୁଛି।"</string> + <string name="accessibility_tty_enabled" msgid="4613200365379426561">"ଟେଲି-ଟାଇପରାଇଟର୍ ସକ୍ଷମ ଅଛି।"</string> + <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ରିଙ୍ଗର୍ କମ୍ପନରେ ଅଛି।"</string> + <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ରିଙ୍ଗର୍ ସାଇଲେଣ୍ଟରେ ଅଛି।"</string> + <!-- no translation found for accessibility_casting (6887382141726543668) --> + <skip /> + <!-- no translation found for accessibility_work_mode (702887484664647430) --> + <skip /> + <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ।"</string> + <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ କରିଦିଆଗଲା।"</string> + <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ସମସ୍ତ ସମ୍ପ୍ରତି ଆପ୍ଲିକେଶନଗୁଡ଼ିକ ଖାରଜ କରାଯାଇଛି।"</string> + <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) --> + <skip /> + <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ଆରମ୍ଭ ହେଉଛି।"</string> + <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string> + <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string> + <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ଦ୍ରୁତ ସେଟିଙ୍ଗ।"</string> + <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string> + <string name="accessibility_desc_settings" msgid="3417884241751434521">"ସେଟିଙ୍ଗ"</string> + <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string> + <!-- no translation found for accessibility_desc_work_lock (4288774420752813383) --> + <skip /> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ବନ୍ଦ କରନ୍ତୁ"</string> + <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string> + <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି।"</string> + <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ୱାଇ-ଫାଇ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ମୋବାଇଲ୍ <xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="TYPE">%2$s</xliff:g>। <xliff:g id="NETWORK">%3$s</xliff:g>।"</string> + <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"<xliff:g id="STATE">%s</xliff:g> ବ୍ୟାଟେରୀ ଅଛି।"</string> + <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍ ଅଫ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ବନ୍ଦ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଗୁରୁତ୍ୱର୍ଣ୍ଣ।"</string> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ।"</string> + <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଆଲାର୍ମ।"</string> + <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) --> + <skip /> + <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରଯାଇଛି।"</string> + <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) --> + <skip /> + <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ବ୍ଲୁ-ଟୂଥ୍ ଅଫ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ ହେଉଛି।"</string> + <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ବ୍ଲୁ-ଟୁଥ୍କୁ ସଂଯୋଗ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ବ୍ଲୁ-ଟୁଥ୍କୁ ବନ୍ଦ କରିଦିଆଯାଇଛି।"</string> + <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ବ୍ଲୁ-ଟୁଥ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ଲୋକେଶନ୍ର ତଥ୍ୟ ବନ୍ଦ ଅଛି।"</string> + <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"ଲୋକେଶନ୍ର ତଥ୍ୟ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ବନ୍ଦ କରାଗଲା।"</string> + <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ଅନ୍ କରାଗଲା।"</string> + <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>ରେ ଆଲାର୍ମ ସେଟ୍ କରାଯାଇଛି।"</string> + <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"ପ୍ୟାନେଲ୍ ବନ୍ଦ କରନ୍ତୁ।"</string> + <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"ଅଧିକ ସମୟ।"</string> + <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"କମ୍ ସମୟ।"</string> + <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅଫ୍ ଅଛି।"</string> + <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) --> + <skip /> + <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ବନ୍ଦ ଅଛି।"</string> + <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ବନ୍ଦ କରିଦିଆଗଲା।"</string> + <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ଚାଲୁ କରିଦିଆଗଲା।"</string> + <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ବନ୍ଦ ଅଛି।"</string> + <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ଅନ୍ ଅଛି।"</string> + <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ସ୍କ୍ରୀନ୍ କାଷ୍ଟ କରିବା ରହିଯାଇଛି।"</string> + <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) --> + <skip /> + <string name="accessibility_brightness" msgid="8003681285547803095">"ଡିସ୍ପ୍ଲେ ଉଜ୍ଜ୍ୱଳତା"</string> + <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) --> + <skip /> + <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string> + <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string> + <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) --> + <skip /> + <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ଡାଟା ପଜ୍ କରାଯାଇଛି"</string> + <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) --> + <skip /> + <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string> + <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ଖୋଜାଯାଉଛି"</string> + <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ଦ୍ୱାରା ଲୋକେଶନ୍ ସେଟ୍ କରାଯାଇଛି"</string> + <string name="accessibility_location_active" msgid="2427290146138169014">"ଲୋକେଶନ୍ ଅନୁରୋଧ ସକ୍ରିୟ ଅଛି"</string> + <string name="accessibility_clear_all" msgid="5235938559247164925">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string> + <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) --> + <skip /> + <!-- no translation found for notification_group_overflow_description (4579313201268495404) --> + <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"ବିଜ୍ଞପ୍ତି ସେଟିଙ୍ଗ"</string> + <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ସେଟିଙ୍ଗ"</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ସ୍କ୍ରୀନ୍ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ପୋର୍ଟ୍ରେଟ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string> + <string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"ସ୍କ୍ରୀନ୍ ବର୍ତ୍ତମାନ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string> + <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string> + <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ପୋର୍ଟେଟ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string> + <string name="dessert_case" msgid="1295161776223959221">"ଡେଜର୍ଟ କେସ୍"</string> + <!-- no translation found for start_dreams (5640361424498338327) --> + <skip /> + <string name="ethernet_label" msgid="7967563676324087464">"ଇଥରନେଟ୍"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> + <string name="quick_settings_dnd_label" msgid="8735855737575028208">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\""</string> + <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"କେବଳ ପ୍ରାଥମିକତା"</string> + <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"କେବଳ ଆଲାର୍ମ"</string> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ"</string> + <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ବ୍ଲୁ-ଟୁଥ୍"</string> + <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ବ୍ଲୁ-ଟୁଥ୍ (<xliff:g id="NUMBER">%d</xliff:g>ଟି ଡିଭାଇସ୍)"</string> + <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ବ୍ଲୁ-ଟୁଥ୍ ଅଫ୍"</string> + <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ପେୟାର୍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> + <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) --> + <skip /> + <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) --> + <skip /> + <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string> + <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string> + <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) --> + <skip /> + <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ଘୂର୍ଣ୍ଣନ ଲକ୍ ହୋଇଛି"</string> + <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_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> + <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"କେବଳ ଜରୁରୀକାଳୀନ କଲ୍"</string> + <string name="quick_settings_settings_label" msgid="5326556592578065401">"ସେଟିଙ୍ଗ"</string> + <string name="quick_settings_time_label" msgid="4635969182239736408">"ସମୟ"</string> + <string name="quick_settings_user_label" msgid="5238995632130897840">"ମୁଁ"</string> + <string name="quick_settings_user_title" msgid="4467690427642392403">"ୟୁଜର୍"</string> + <string name="quick_settings_user_new_user" msgid="9030521362023479778">"ନୂଆ ୟୁଜର୍"</string> + <string name="quick_settings_wifi_label" msgid="9135344704899546041">"ୱାଇ-ଫାଇ"</string> + <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string> + <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ନେଟ୍ୱର୍କ ନାହିଁ"</string> + <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ୱାଇ-ଫାଇ ଅଫ୍"</string> + <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) --> + <skip /> + <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string> + <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> + <skip /> + <string name="quick_settings_cast_title" msgid="7709016546426454729">"କାଷ୍ଟ"</string> + <string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string> + <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ନାମହୀନ ଡିଭାଇସ୍"</string> + <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"କାଷ୍ଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ"</string> + <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string> + <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ଉଜ୍ଜ୍ୱଳତା"</string> + <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ସ୍ୱଚାଳିତ"</string> + <string name="quick_settings_inversion_label" msgid="8790919884718619648">"ରଙ୍ଗ ପୂର୍ବପରି କରନ୍ତୁ"</string> + <string name="quick_settings_color_space_label" msgid="853443689745584770">"ରଙ୍ଗ ସଂଶୋଧନ ମୋଡ୍"</string> + <string name="quick_settings_more_settings" msgid="326112621462813682">"ଅଧିକ ସେଟିଙ୍ଗ"</string> + <string name="quick_settings_done" msgid="3402999958839153376">"ହୋଇଗଲା"</string> + <string name="quick_settings_connected" msgid="1722253542984847487">"ସଂଯୁକ୍ତ"</string> + <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) --> + <skip /> + <string name="quick_settings_connecting" msgid="47623027419264404">"ସଂଯୋଗ କରୁଛି..."</string> + <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ଟିଥରିଙ୍ଗ"</string> + <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ହଟସ୍ପଟ୍"</string> + <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> + <skip /> + <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ବିଜ୍ଞପ୍ତି"</string> + <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ଫ୍ଲାଶ୍ଲାଇଟ"</string> + <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) --> + <skip /> + <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ଡାଟାର ବ୍ୟବହାର"</string> + <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ଅବଶିଷ୍ଟ ଡାଟା"</string> + <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ସୀମାଠାରୁ ଅଧିକ"</string> + <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ବ୍ୟବହାର କରାଯାଇଛି"</string> + <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ସୀମା"</string> + <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ଚେତାବନୀ"</string> + <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> + <skip /> + <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> + <skip /> + <!-- no translation found for quick_settings_night_display_label (3577098011487644395) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) --> + <skip /> + <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) --> + <skip /> + <!-- no translation found for quick_settings_nfc_label (9012153754816969325) --> + <skip /> + <!-- no translation found for quick_settings_nfc_off (6883274004315134333) --> + <skip /> + <!-- no translation found for quick_settings_nfc_on (6680317193676884311) --> + <skip /> + <!-- no translation found for recents_empty_message (808480104164008572) --> + <skip /> + <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) --> + <skip /> + <string name="recents_app_info_button_label" msgid="2890317189376000030">"ଆପ୍ଲିକେଶନ୍ ସୂଚନା"</string> + <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string> + <string name="recents_search_bar_label" msgid="8074997400187836677">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string> + <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> କୁ ଆରମ୍ଭ କରାଯାଇପାରିଲା ନାହିଁ।"</string> + <!-- no translation found for recents_launch_disabled_message (1624523193008871793) --> + <skip /> + <!-- no translation found for recents_stack_action_button_label (6593727103310426253) --> + <skip /> + <!-- no translation found for recents_drag_hint_message (2649739267073203985) --> + <skip /> + <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ଭୂସମାନ୍ତର ଭାବରେ ଭାଗ କରନ୍ତୁ"</string> + <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ଭୂଲମ୍ବ ଭାବରେ ଭାଗ କରନ୍ତୁ"</string> + <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"କଷ୍ଟମ୍ କରି ଭାଗ କରନ୍ତୁ"</string> + <!-- no translation found for recents_accessibility_split_screen_top (9056056469282256287) --> + <skip /> + <!-- no translation found for recents_accessibility_split_screen_left (8987144699630620019) --> + <skip /> + <!-- no translation found for recents_accessibility_split_screen_right (275069779299592867) --> + <skip /> + <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ଚାର୍ଜ ହୋଇଗଲା"</string> + <string name="expanded_header_battery_charging" msgid="205623198487189724">"ଚାର୍ଜ କରାଯାଉଛି"</string> + <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାକୁ ଆଉ <xliff:g id="CHARGING_TIME">%s</xliff:g> ଅଛି"</string> + <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"ଚାର୍ଜ ହେଉନାହିଁ"</string> + <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ନେଟ୍ୱର୍କ\nମନିଟର୍ କରାଯାଇପାରେ"</string> + <string name="description_target_search" msgid="3091587249776033139">"ସର୍ଚ୍ଚ"</string> + <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ଉପରକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ।"</string> + <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ବାମକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ"</string> + <!-- no translation found for zen_priority_introduction (1149025108714420281) --> + <skip /> + <!-- no translation found for zen_alarms_introduction (4934328096749380201) --> + <skip /> + <string name="zen_priority_customize_button" msgid="7948043278226955063">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string> + <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) --> + <skip /> + <!-- no translation found for zen_silence_introduction (3137882381093271568) --> + <skip /> + <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string> + <string name="speed_bump_explanation" msgid="1288875699658819755">"ନିମ୍ନରେ କମ୍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି"</string> + <string name="notification_tap_again" msgid="7590196980943943842">"ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍ କରନ୍ତୁ"</string> + <string name="keyguard_unlock" msgid="8043466894212841998">"ଅନଲକ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> + <!-- no translation found for do_disclosure_generic (5615898451805157556) --> + <skip /> + <!-- no translation found for do_disclosure_with_name (5640615509915445501) --> + <skip /> + <string name="phone_hint" msgid="4872890986869209950">"ଫୋନ୍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> + <string name="voice_hint" msgid="8939888732119726665">"ଭଏସ୍ ସହାୟକ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> + <string name="camera_hint" msgid="7939688436797157483">"କ୍ୟାମେରା ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string> + <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) --> + <skip /> + <string name="interruption_level_none" msgid="6000083681244492992">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ"</string> + <string name="interruption_level_priority" msgid="6426766465363855505">"କେବଳ ପ୍ରାଥମିକତା"</string> + <string name="interruption_level_alarms" msgid="5226306993448328896">"କେବଳ ଆଲାର୍ମ"</string> + <string name="interruption_level_none_twoline" msgid="3957581548190765889">"ସମ୍ପୂର୍ଣ୍ଣ\nନୀରବ"</string> + <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"କେବଳ\nପ୍ରାଥମିକତା"</string> + <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"କେବଳ\nଆଲାର୍ମ"</string> + <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ଚାର୍ଜ କରାଯାଉଛି (ପୂର୍ଣ୍ଣ ହେବାକୁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ରହିଛି)"</string> + <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) --> + <skip /> + <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) --> + <skip /> + <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string> + <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ୟୁଜର୍ ବଦଳାନ୍ତୁ, ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string> + <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) --> + <skip /> + <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ପ୍ରୋଫାଇଲ୍ ଦେଖାନ୍ତୁ"</string> + <string name="user_add_user" msgid="5110251524486079492">"ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="user_new_user_name" msgid="426540612051178753">"ନୂତନ ୟୁଜର୍"</string> + <string name="guest_nickname" msgid="8059989128963789678">"ଅତିଥି"</string> + <string name="guest_new_guest" msgid="600537543078847803">"ଅତିଥି ଯୋଡ଼ନ୍ତୁ"</string> + <string name="guest_exit_guest" msgid="7187359342030096885">"ଅତିଥିଙ୍କୁ କାଢ଼ନ୍ତୁ"</string> + <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ଅତିଥିଙ୍କୁ କାଢ଼ିଦେବେ?"</string> + <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ଏହି ଅବଧିର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string> + <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"କାଢ଼ିଦିଅନ୍ତୁ"</string> + <string name="guest_wipe_session_title" msgid="6419439912885956132">"ପୁଣି ସ୍ୱାଗତ, ଅତିଥି!"</string> + <string name="guest_wipe_session_message" msgid="8476238178270112811">"ଆପଣ ନିଜର ଅବଧି ଜାରି ରଖିବାକୁ ଚାହାନ୍ତି କି?"</string> + <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ଆରମ୍ଭ କରନ୍ତୁ"</string> + <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ହଁ, ଜାରି ରଖନ୍ତୁ"</string> + <string name="guest_notification_title" msgid="1585278533840603063">"ଅତିଥି ୟୁଜର୍"</string> + <!-- no translation found for guest_notification_text (335747957734796689) --> + <skip /> + <string name="guest_notification_remove_action" msgid="8820670703892101990">"ଅତିଥିଙ୍କୁ ବାହାର କରନ୍ତୁ"</string> + <!-- no translation found for user_logout_notification_title (1453960926437240727) --> + <skip /> + <!-- no translation found for user_logout_notification_text (3350262809611876284) --> + <skip /> + <!-- no translation found for user_logout_notification_action (1195428991423425062) --> + <skip /> + <string name="user_add_user_title" msgid="4553596395824132638">"ନୂତନ ୟୁଜର୍ ଯୋଡ଼ିବେ?"</string> + <string name="user_add_user_message_short" msgid="2161624834066214559">"ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍ ଆପ୍ଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string> + <!-- no translation found for user_remove_user_title (4681256956076895559) --> + <skip /> + <!-- no translation found for user_remove_user_message (1453218013959498039) --> + <skip /> + <!-- no translation found for user_remove_user_remove (7479275741742178297) --> + <skip /> + <!-- no translation found for battery_saver_notification_title (8614079794522291840) --> + <skip /> + <string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string> + <!-- no translation found for battery_saver_notification_action_text (132118784269455533) --> + <skip /> + <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ରେ ପ୍ରଦର୍ଶିତ ହେଉଥିବା ସମସ୍ତ ବସ୍ତୁକୁ କ୍ୟାପଚର୍ କରିବା ଆରମ୍ଭ ହୋଇଯିବ।"</string> + <string name="media_projection_remember_text" msgid="3103510882172746752">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string> + <string name="clear_all_notifications_text" msgid="814192889771462828">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string> + <string name="media_projection_action_text" msgid="8470872969457985954">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string> + <string name="empty_shade_text" msgid="708135716272867002">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string> + <string name="profile_owned_footer" msgid="8021888108553696069">"ପ୍ରୋଫାଇଲ୍ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ।"</string> + <string name="vpn_footer" msgid="2388611096129106812">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string> + <!-- no translation found for branded_vpn_footer (2168111859226496230) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management_monitoring (6645176135063957394) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_managed_profile_monitoring (8973606847896650284) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_vpns (8170318392053156330) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) --> + <skip /> + <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) --> + <skip /> + <!-- no translation found for monitoring_title_device_owned (1652495295941959815) --> + <skip /> + <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ପ୍ରୋଫାଇଲ୍ ନୀରିକ୍ଷଣ"</string> + <string name="monitoring_title" msgid="169206259253048106">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ"</string> + <!-- no translation found for monitoring_subtitle_vpn (876537538087857300) --> + <skip /> + <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) --> + <skip /> + <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) --> + <skip /> + <string name="disable_vpn" msgid="4435534311510272506">"VPN ଅକ୍ଷମ କରନ୍ତୁ"</string> + <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ବିଛିନ୍ନ କରନ୍ତୁ"</string> + <!-- no translation found for monitoring_button_view_policies (100913612638514424) --> + <skip /> + <!-- no translation found for monitoring_description_named_management (5281789135578986303) --> + <skip /> + <!-- no translation found for monitoring_description_management (4573721970278370790) --> + <skip /> + <!-- no translation found for monitoring_description_management_ca_certificate (5202023784131001751) --> + <skip /> + <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) --> + <skip /> + <!-- no translation found for monitoring_description_ca_certificate (7886985418413598352) --> + <skip /> + <!-- no translation found for monitoring_description_management_network_logging (7184005419733060736) --> + <skip /> + <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) --> + <skip /> + <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) --> + <skip /> + <!-- no translation found for monitoring_description_managed_profile_named_vpn (1427905889862420559) --> + <skip /> + <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) --> + <skip /> + <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) --> + <skip /> + <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) --> + <skip /> + <!-- no translation found for monitoring_description_do_body (3639594537660975895) --> + <skip /> + <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) --> + <skip /> + <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) --> + <skip /> + <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) --> + <skip /> + <!-- no translation found for monitoring_description_vpn_settings_separator (1933186756733474388) --> + <skip /> + <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) --> + <skip /> + <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) --> + <skip /> + <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) --> + <skip /> + <!-- no translation found for monitoring_description_network_logging (7223505523384076027) --> + <skip /> + <string name="monitoring_description_vpn" msgid="4445150119515393526">"ଏକ VPN ସଂଯୋଗ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଆପଣ ଗୋଟିଏ ଆପକୁ ଅନୁମତି ଦେଲେ।\n\nଏହି ଆପ୍ ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଓ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string> + <!-- no translation found for monitoring_description_vpn_profile_owned (2958019119161161530) --> + <skip /> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <!-- no translation found for monitoring_description_app (1828472472674709532) --> + <skip /> + <!-- no translation found for monitoring_description_app_personal (484599052118316268) --> + <skip /> + <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) --> + <skip /> + <!-- no translation found for monitoring_description_app_work (4612997849787922906) --> + <skip /> + <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) --> + <skip /> + <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) --> + <skip /> + <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) --> + <skip /> + <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ଯେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଆପଣ ମାନୁଆଲୀ ଅନଲକ୍ କରିନାହାନ୍ତି, ସେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଡିଭାଇସ୍ ଲକ୍ ରହିବ"</string> + <string name="hidden_notifications_title" msgid="7139628534207443290">"ବିଜ୍ଞପ୍ତିକୁ ଶୀଘ୍ର ପ୍ରାପ୍ତ କରନ୍ତୁ"</string> + <string name="hidden_notifications_text" msgid="2326409389088668981">"ଅନଲକ୍ କରିବା ପୁର୍ବରୁ ସେମାନଙ୍କୁ ଦେଖନ୍ତୁ"</string> + <string name="hidden_notifications_cancel" msgid="3690709735122344913">"ନାହିଁ, ଥାଉ"</string> + <string name="hidden_notifications_setup" msgid="41079514801976810">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string> + <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> + <!-- no translation found for volume_zen_end_now (6930243045593601084) --> + <skip /> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"ବଢ଼ାନ୍ତୁ"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ଛୋଟ କରନ୍ତୁ"</string> + <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> + <skip /> + <string name="screen_pinning_title" msgid="3273740381976175811">"ସ୍କ୍ରିନକୁ ପିନ୍ କରାଯାଇଛି"</string> + <!-- no translation found for screen_pinning_description (8909878447196419623) --> + <skip /> + <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> + <skip /> + <!-- no translation found for screen_pinning_description_accessible (426190689254018656) --> + <skip /> + <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> + <skip /> + <!-- no translation found for screen_pinning_toast (2266705122951934150) --> + <skip /> + <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> + <skip /> + <string name="screen_pinning_positive" msgid="3783985798366751226">"ବୁଝିଲି"</string> + <string name="screen_pinning_negative" msgid="3741602308343880268">"ନାହିଁ, ଥାଉ"</string> + <!-- no translation found for screen_pinning_start (1022122128489278317) --> + <skip /> + <!-- no translation found for screen_pinning_exit (5187339744262325372) --> + <skip /> + <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string> + <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string> + <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ଲୁଚାନ୍ତୁ"</string> + <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) --> + <skip /> + <!-- no translation found for stream_voice_call (4410002696470423714) --> + <skip /> + <!-- no translation found for stream_system (7493299064422163147) --> + <skip /> + <!-- no translation found for stream_ring (8213049469184048338) --> + <skip /> + <!-- no translation found for stream_music (9086982948697544342) --> + <skip /> + <!-- no translation found for stream_alarm (5209444229227197703) --> + <skip /> + <!-- no translation found for stream_notification (2563720670905665031) --> + <skip /> + <!-- no translation found for stream_bluetooth_sco (2055645746402746292) --> + <skip /> + <!-- no translation found for stream_dtmf (2447177903892477915) --> + <skip /> + <!-- no translation found for stream_accessibility (301136219144385106) --> + <skip /> + <!-- no translation found for ring_toggle_title (3281244519428819576) --> + <skip /> + <!-- no translation found for volume_ringer_status_normal (4273142424125855384) --> + <skip /> + <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) --> + <skip /> + <!-- no translation found for volume_ringer_status_silent (6896394161022916369) --> + <skip /> + <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) --> + <skip /> + <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) --> + <skip /> + <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) --> + <skip /> + <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) --> + <skip /> + <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) --> + <skip /> + <!-- no translation found for volume_dialog_title (7272969888820035876) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> + <!-- no translation found for output_title (5355078100792942802) --> + <skip /> + <!-- no translation found for output_calls_title (8717692905017206161) --> + <skip /> + <!-- no translation found for output_none_found (5544982839808921091) --> + <skip /> + <!-- no translation found for output_none_found_service_off (8631969668659757069) --> + <skip /> + <!-- no translation found for output_service_bt (6224213415445509542) --> + <skip /> + <!-- no translation found for output_service_wifi (3749735218931825054) --> + <skip /> + <!-- no translation found for output_service_bt_wifi (4486837869988770896) --> + <skip /> + <!-- no translation found for system_ui_tuner (708224127392452018) --> + <skip /> + <string name="show_battery_percentage" msgid="5444136600512968798">"ଏମ୍ବେଡ୍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string> + <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string> + <string name="quick_settings" msgid="10042998191725428">"ଦ୍ରୁତ ସେଟିଙ୍ଗ"</string> + <string name="status_bar" msgid="4877645476959324760">"ଷ୍ଟାଟସ୍ ବାର୍"</string> + <!-- no translation found for overview (4018602013895926956) --> + <skip /> + <!-- no translation found for demo_mode (2532177350215638026) --> + <skip /> + <string name="enable_demo_mode" msgid="4844205668718636518">"ଡେମୋ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ"</string> + <string name="show_demo_mode" msgid="2018336697782464029">"ଡେମୋ ମୋଡ୍ ଦେଖାନ୍ତୁ"</string> + <string name="status_bar_ethernet" msgid="5044290963549500128">"ଇଥରନେଟ୍"</string> + <string name="status_bar_alarm" msgid="8536256753575881818">"ଆଲାର୍ମ"</string> + <string name="status_bar_work" msgid="6022553324802866373">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string> + <string name="status_bar_airplane" msgid="7057575501472249002">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string> + <string name="add_tile" msgid="2995389510240786221">"ଟାଇଲ୍ ଯୋଡ଼ନ୍ତୁ"</string> + <string name="broadcast_tile" msgid="3894036511763289383">"ଟାଇଲ୍ ବ୍ରଡ୍କାଷ୍ଟ କରନ୍ତୁ"</string> + <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"ଆପଣ <xliff:g id="WHEN">%1$s</xliff:g> ପୂର୍ବରୁ ଏହା ଅଫ୍ ନକଲେ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string> + <string name="zen_alarm_warning" msgid="444533119582244293">"<xliff:g id="WHEN">%1$s</xliff:g>ବେଳେ ଆପଣ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string> + <string name="alarm_template" msgid="3980063409350522735">"<xliff:g id="WHEN">%1$s</xliff:g>ରେ"</string> + <string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string> + <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ଦ୍ରୁତ ସେଟିଙ୍ଗ, <xliff:g id="TITLE">%s</xliff:g>।"</string> + <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ହଟସ୍ପଟ୍"</string> + <!-- no translation found for accessibility_managed_profile (6613641363112584120) --> + <skip /> + <!-- no translation found for tuner_warning_title (7094689930793031682) --> + <skip /> + <!-- no translation found for tuner_warning (8730648121973575701) --> + <skip /> + <!-- no translation found for tuner_persistent_warning (8597333795565621795) --> + <skip /> + <!-- no translation found for got_it (2239653834387972602) --> + <skip /> + <!-- no translation found for tuner_toast (603429811084428439) --> + <skip /> + <!-- no translation found for remove_from_settings (8389591916603406378) --> + <skip /> + <!-- no translation found for remove_from_settings_prompt (6069085993355887748) --> + <skip /> + <!-- no translation found for activity_not_found (348423244327799974) --> + <skip /> + <!-- no translation found for clock_seconds (7689554147579179507) --> + <skip /> + <!-- no translation found for clock_seconds_desc (6282693067130470675) --> + <skip /> + <!-- no translation found for qs_rearrange (8060918697551068765) --> + <skip /> + <!-- no translation found for show_brightness (6613930842805942519) --> + <skip /> + <!-- no translation found for experimental (6198182315536726162) --> + <skip /> + <!-- no translation found for enable_bluetooth_title (5027037706500635269) --> + <skip /> + <!-- no translation found for enable_bluetooth_message (9106595990708985385) --> + <skip /> + <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) --> + <skip /> + <!-- no translation found for show_silently (6841966539811264192) --> + <skip /> + <!-- no translation found for block (2734508760962682611) --> + <skip /> + <!-- no translation found for do_not_silence (6878060322594892441) --> + <skip /> + <!-- no translation found for do_not_silence_block (4070647971382232311) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings (3207312268609236827) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) --> + <skip /> + <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) --> + <skip /> + <!-- no translation found for power_notification_controls_description (4372459941671353358) --> + <skip /> + <!-- no translation found for notification_header_default_channel (7506845022070889909) --> + <skip /> + <!-- no translation found for notification_channel_disabled (344536703863700565) --> + <skip /> + <!-- no translation found for inline_blocking_helper (3055064577771478591) --> + <skip /> + <!-- no translation found for inline_keep_showing (8945102997083836858) --> + <skip /> + <!-- no translation found for inline_stop_button (4172980096860941033) --> + <skip /> + <!-- no translation found for inline_keep_button (6665940297019018232) --> + <skip /> + <!-- no translation found for inline_keep_showing_app (1723113469580031041) --> + <skip /> + <!-- no translation found for notification_unblockable_desc (1037434112919403708) --> + <skip /> + <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) --> + <skip /> + <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) --> + <skip /> + <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) --> + <skip /> + <!-- no translation found for notification_more_settings (816306283396553571) --> + <skip /> + <!-- no translation found for notification_app_settings (420348114670768449) --> + <skip /> + <!-- no translation found for notification_done (5279426047273930175) --> + <skip /> + <!-- no translation found for inline_undo (558916737624706010) --> + <skip /> + <!-- no translation found for notification_menu_accessibility (2046162834248888553) --> + <skip /> + <!-- no translation found for notification_menu_gear_description (2204480013726775108) --> + <skip /> + <!-- no translation found for notification_menu_snooze_description (3653669438131034525) --> + <skip /> + <!-- no translation found for snooze_undo (6074877317002985129) --> + <skip /> + <!-- no translation found for snoozed_for_time (2390718332980204462) --> + <skip /> + <!-- no translation found for snoozeHourOptions (2124335842674413030) --> + <!-- no translation found for snoozeMinuteOptions (4127251700591510196) --> + <!-- no translation found for battery_panel_title (7944156115535366613) --> + <skip /> + <!-- no translation found for battery_detail_charging_summary (1279095653533044008) --> + <skip /> + <!-- no translation found for battery_detail_switch_title (6285872470260795421) --> + <skip /> + <!-- no translation found for battery_detail_switch_summary (9049111149407626804) --> + <skip /> + <!-- no translation found for keyboard_key_button_template (6230056639734377300) --> + <skip /> + <!-- no translation found for keyboard_key_home (2243500072071305073) --> + <skip /> + <!-- no translation found for keyboard_key_back (2337450286042721351) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) --> + <skip /> + <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) --> + <skip /> + <!-- no translation found for keyboard_key_tab (3871485650463164476) --> + <skip /> + <!-- no translation found for keyboard_key_space (2499861316311153293) --> + <skip /> + <!-- no translation found for keyboard_key_enter (5739632123216118137) --> + <skip /> + <!-- no translation found for keyboard_key_backspace (1559580097512385854) --> + <skip /> + <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) --> + <skip /> + <!-- no translation found for keyboard_key_media_stop (2859963958595908962) --> + <skip /> + <!-- no translation found for keyboard_key_media_next (1894394911630345607) --> + <skip /> + <!-- no translation found for keyboard_key_media_previous (4256072387192967261) --> + <skip /> + <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) --> + <skip /> + <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) --> + <skip /> + <!-- no translation found for keyboard_key_page_up (5654098530106845603) --> + <skip /> + <!-- no translation found for keyboard_key_page_down (8720502083731906136) --> + <skip /> + <!-- no translation found for keyboard_key_forward_del (1391451334716490176) --> + <skip /> + <!-- no translation found for keyboard_key_move_home (2765693292069487486) --> + <skip /> + <!-- no translation found for keyboard_key_move_end (5901174332047975247) --> + <skip /> + <!-- no translation found for keyboard_key_insert (8530501581636082614) --> + <skip /> + <!-- no translation found for keyboard_key_num_lock (5052537581246772117) --> + <skip /> + <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) --> + <skip /> + <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) --> + <skip /> + <!-- no translation found for tuner_full_zen_title (4540823317772234308) --> + <skip /> + <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) --> + <skip /> + <!-- no translation found for volume_dnd_silent (4363882330723050727) --> + <skip /> + <!-- no translation found for volume_up_silent (7141255269783588286) --> + <skip /> + <!-- no translation found for battery (7498329822413202973) --> + <skip /> + <!-- no translation found for clock (7416090374234785905) --> + <skip /> + <!-- no translation found for headset (4534219457597457353) --> + <skip /> + <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) --> + <skip /> + <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) --> + <skip /> + <!-- no translation found for data_saver (5037565123367048522) --> + <skip /> + <!-- no translation found for accessibility_data_saver_on (8454111686783887148) --> + <skip /> + <!-- no translation found for accessibility_data_saver_off (8841582529453005337) --> + <skip /> + <!-- no translation found for switch_bar_on (1142437840752794229) --> + <skip /> + <!-- no translation found for switch_bar_off (8803270596930432874) --> + <skip /> + <!-- no translation found for nav_bar (1993221402773877607) --> + <skip /> + <!-- no translation found for nav_bar_layout (3664072994198772020) --> + <skip /> + <!-- no translation found for left_nav_bar_button_type (8555981238887546528) --> + <skip /> + <!-- no translation found for right_nav_bar_button_type (2481056627065649656) --> + <skip /> + <!-- no translation found for nav_bar_default (8587114043070993007) --> + <skip /> + <!-- no translation found for nav_bar_buttons:0 (1545641631806817203) --> + <!-- no translation found for nav_bar_buttons:1 (5742013440802239414) --> + <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) --> + <!-- no translation found for nav_bar_buttons:3 (8175437057325747277) --> + <!-- no translation found for nav_bar_layouts:0 (8077901629964902399) --> + <!-- no translation found for nav_bar_layouts:1 (8256205964297588988) --> + <!-- no translation found for nav_bar_layouts:2 (8719936228094005878) --> + <!-- no translation found for nav_bar_layouts:3 (586019486955594690) --> + <!-- no translation found for menu_ime (4998010205321292416) --> + <skip /> + <!-- no translation found for save (2311877285724540644) --> + <skip /> + <string name="reset" msgid="2448168080964209908">"ରିସେଟ୍ କରନ୍ତୁ"</string> + <!-- no translation found for adjust_button_width (6138616087197632947) --> + <skip /> + <!-- no translation found for clipboard (1313879395099896312) --> + <skip /> + <!-- no translation found for accessibility_key (5701989859305675896) --> + <skip /> + <!-- no translation found for left_keycode (2010948862498918135) --> + <skip /> + <!-- no translation found for right_keycode (708447961000848163) --> + <skip /> + <!-- no translation found for left_icon (3096287125959387541) --> + <skip /> + <!-- no translation found for right_icon (3952104823293824311) --> + <skip /> + <!-- no translation found for drag_to_add_tiles (7058945779098711293) --> + <skip /> + <!-- no translation found for drag_to_remove_tiles (3361212377437088062) --> + <skip /> + <!-- no translation found for qs_edit (2232596095725105230) --> + <skip /> + <!-- no translation found for tuner_time (6572217313285536011) --> + <skip /> + <!-- no translation found for clock_options:0 (5965318737560463480) --> + <!-- no translation found for clock_options:1 (1427801730816895300) --> + <!-- no translation found for clock_options:2 (3830170141562534721) --> + <!-- no translation found for battery_options:0 (3160236755818672034) --> + <!-- no translation found for battery_options:1 (2139628951880142927) --> + <!-- no translation found for battery_options:2 (3327323682209964956) --> + <!-- no translation found for other (4060683095962566764) --> + <skip /> + <!-- no translation found for accessibility_divider (5903423481953635044) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) --> + <skip /> + <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) --> + <skip /> + <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) --> + <skip /> + <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) --> + <skip /> + <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) --> + <skip /> + <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) --> + <skip /> + <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) --> + <skip /> + <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) --> + <skip /> + <!-- no translation found for dock_forced_resizable (5914261505436217520) --> + <skip /> + <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) --> + <skip /> + <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) --> + <skip /> + <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) --> + <skip /> + <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) --> + <skip /> + <!-- no translation found for tuner_lock_screen (5755818559638850294) --> + <skip /> + <!-- no translation found for pip_phone_expand (5889780005575693909) --> + <skip /> + <!-- no translation found for pip_phone_minimize (1079119422589131792) --> + <skip /> + <!-- no translation found for pip_phone_close (8416647892889710330) --> + <skip /> + <!-- no translation found for pip_phone_settings (8080777499521528521) --> + <skip /> + <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) --> + <skip /> + <!-- no translation found for pip_menu_title (4707292089961887657) --> + <skip /> + <!-- no translation found for pip_notification_title (3204024940158161322) --> + <skip /> + <!-- no translation found for pip_notification_message (5619512781514343311) --> + <skip /> + <!-- no translation found for pip_play (1417176722760265888) --> + <skip /> + <!-- no translation found for pip_pause (8881063404466476571) --> + <skip /> + <!-- no translation found for pip_skip_to_next (1948440006726306284) --> + <skip /> + <!-- no translation found for pip_skip_to_prev (1955311326688637914) --> + <skip /> + <!-- no translation found for thermal_shutdown_title (4458304833443861111) --> + <skip /> + <!-- no translation found for thermal_shutdown_message (9006456746902370523) --> + <skip /> + <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) --> + <skip /> + <!-- no translation found for high_temp_title (4589508026407318374) --> + <skip /> + <!-- no translation found for high_temp_notif_message (5642466103153429279) --> + <skip /> + <!-- no translation found for high_temp_dialog_message (6840700639374113553) --> + <skip /> + <!-- no translation found for lockscreen_shortcut_left (2182769107618938629) --> + <skip /> + <!-- no translation found for lockscreen_shortcut_right (3328683699505226536) --> + <skip /> + <!-- no translation found for lockscreen_unlock_left (2043092136246951985) --> + <skip /> + <!-- no translation found for lockscreen_unlock_right (1529992940510318775) --> + <skip /> + <!-- no translation found for lockscreen_none (4783896034844841821) --> + <skip /> + <!-- no translation found for tuner_launch_app (1527264114781925348) --> + <skip /> + <!-- no translation found for tuner_other_apps (4726596850501162493) --> + <skip /> + <!-- no translation found for tuner_circle (2340998864056901350) --> + <skip /> + <!-- no translation found for tuner_plus (6792960658533229675) --> + <skip /> + <!-- no translation found for tuner_minus (4806116839519226809) --> + <skip /> + <!-- no translation found for tuner_left (8404287986475034806) --> + <skip /> + <!-- no translation found for tuner_right (6222734772467850156) --> + <skip /> + <!-- no translation found for tuner_menu (191640047241552081) --> + <skip /> + <!-- no translation found for tuner_app (3507057938640108777) --> + <skip /> + <!-- no translation found for notification_channel_alerts (4496839309318519037) --> + <skip /> + <!-- no translation found for notification_channel_battery (5786118169182888462) --> + <skip /> + <!-- no translation found for notification_channel_screenshot (6314080179230000938) --> + <skip /> + <!-- no translation found for notification_channel_general (4525309436693914482) --> + <skip /> + <!-- no translation found for notification_channel_storage (3077205683020695313) --> + <skip /> + <!-- no translation found for instant_apps (6647570248119804907) --> + <skip /> + <!-- no translation found for instant_apps_message (8116608994995104836) --> + <skip /> + <!-- no translation found for app_info (6856026610594615344) --> + <skip /> + <!-- no translation found for go_to_web (2650669128861626071) --> + <skip /> + <!-- no translation found for mobile_data (7094582042819250762) --> + <skip /> + <!-- no translation found for wifi_is_off (1838559392210456893) --> + <skip /> + <!-- no translation found for bt_is_off (2640685272289706392) --> + <skip /> + <!-- no translation found for dnd_is_off (6167780215212497572) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) --> + <skip /> + <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) --> + <skip /> + <!-- no translation found for qs_dnd_until (3469471136280079874) --> + <skip /> + <!-- no translation found for qs_dnd_keep (1825009164681928736) --> + <skip /> + <!-- no translation found for qs_dnd_replace (8019520786644276623) --> + <skip /> + <!-- no translation found for running_foreground_services_title (381024150898615683) --> + <skip /> + <!-- no translation found for running_foreground_services_msg (6326247670075574355) --> + <skip /> + <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ମୋବାଇଲ୍ ଡାଟା ଅଫ୍ କରିବେ?"</string> + <!-- no translation found for touch_filtered_warning (8671693809204767551) --> + <skip /> + <!-- no translation found for slice_permission_title (7465009437851044444) --> + <skip /> + <!-- no translation found for slice_permission_text_1 (3514586565609596523) --> + <skip /> + <!-- no translation found for slice_permission_text_2 (3146758297471143723) --> + <skip /> + <!-- no translation found for slice_permission_checkbox (7986504458640562900) --> + <skip /> + <!-- no translation found for slice_permission_allow (2340244901366722709) --> + <skip /> + <!-- no translation found for slice_permission_deny (7683681514008048807) --> + <skip /> +</resources> diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 9308fee0d546..ce35a079ab14 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string> <string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਪ੍ਰਤੀਕ"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ਡੈਜ਼ਰਟ ਕੇਸ"</string> <string name="start_dreams" msgid="5640361424498338327">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string> <string name="ethernet_label" msgid="7967563676324087464">"ਈਥਰਨੈਟ"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ਕੇਵਲ ਤਰਜੀਹੀ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ਕੇਵਲ ਅਲਾਰਮ"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ਵਾਈ-ਫਾਈ ਬੰਦ"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ਵਾਈ-ਫਾਈ ਚਾਲੂ"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ਅਲਾਰਮ"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ਕਾਸਟ"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਾ ਡੀਵਾਈਸ"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਸੁਰੱਖਿਅਤ-ਮੋਡ ਵਿੱਚ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ਹੌਰੀਜ਼ੌਂਟਲ ਸਪਲਿਟ"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ਵਰਟੀਕਲ ਸਪਲਿਟ"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਵਿਉਂਂਤੀ ਸਪਲਿਟ"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ਹੁਣੇ ਬੰਦ ਕਰੋ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ਵਿਸਤਾਰ ਕਰੋ"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ਨਸ਼ਟ ਕਰੋ"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"ਆਊਟਪੁੱਟ ਡੀਵਾਈਸ ਵਰਤੋ"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਨਾ ਕੀਤੇ ਜਾਣ ਤੱਕ ਇਸਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਹੋਮ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਨਾ ਕੀਤੇ ਜਾਣ ਤੱਕ ਇਸਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਹੋਮ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਬਟਨਾਂ ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਹੋਮ\' ਬਟਨਾਂ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ਸਮਝ ਲਿਆ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ਨਹੀਂ ਧੰਨਵਾਦ"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ ਗਈ"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"ਸਕ੍ਰੀਨ ਅਨਪਿੰਨ ਕੀਤੀ ਗਈ"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ਕੀ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ਇਹ ਅਗਲੀ ਵਾਰ ਮੁੜ ਪ੍ਰਗਟ ਹੋਵੇਗਾ ਜਦੋਂ ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰਦੇ ਹੋ।"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ਲੁਕਾਓ"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ਥਰਥਰਾਹਟ \'ਤੇ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ਅਵਾਜ਼ ਕੰਟਰੋਲ ਦਿਖਾਏ ਗਏ ਹਨ। ਖਾਰਜ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ ਲੁਕਾਏ ਗਏ ਹਨ"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string> <string name="output_title" msgid="5355078100792942802">"ਮੀਡੀਆ ਆਊਟਪੁੱਟ"</string> <string name="output_calls_title" msgid="8717692905017206161">"ਫ਼ੋਨ ਕਾਲ ਆਊਟਪੁੱਟ"</string> <string name="output_none_found" msgid="5544982839808921091">"ਕੋਈ ਡੀਵਾਈਸ ਨਹੀਂ ਮਿਲੇ"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"ਕਲਿੱਪਬੋਰਡ"</item> <item msgid="5742013440802239414">"ਕੀ-ਕੋਡ"</item> - <item msgid="8802889973626281575">"ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item> - <item msgid="7095517796293767867">"ਘੁਮਾਅ ਸੰਬੰਧੀ ਸੁਝਾਅ"</item> - <item msgid="8494159969042135235">"ਕੋਈ ਨਹੀਂ"</item> + <item msgid="1951959982985094069">"ਘੁਮਾਉਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ, ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item> + <item msgid="8175437057325747277">"ਕੋਈ ਨਹੀਂ"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ਸਧਾਰਨ"</item> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index d2a863a4daf5..5313c966e208 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -105,12 +105,11 @@ <string name="camera_label" msgid="7261107956054836961">"otwórz aparat"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Wybierz nowy układ zadań"</string> <string name="cancel" msgid="6442560571259935130">"Anuluj"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacji"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Obszar komunikatu pomocy"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Przycisk powiększenia na potrzeby zgodności."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Powiększa mniejszy ekran do większego."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth połączony."</string> @@ -279,6 +278,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Półka ze słodkościami"</string> <string name="start_dreams" msgid="5640361424498338327">"Wygaszacz ekranu"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nie przeszkadzać"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tylko priorytetowe"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tylko alarmy"</string> @@ -315,6 +316,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi wyłączone"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi wł."</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Brak dostępnych sieci Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Przesyłanie"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Przesyłam"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Urządzenie bez nazwy"</string> @@ -331,9 +333,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Łączę..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Powiązanie"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Włączam…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="few">%d urządzenia</item> + <item quantity="many">%d urządzeń</item> + <item quantity="other">%d urządzenia</item> + <item quantity="one">%d urządzenie</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Powiadomienia"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Latarka"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilna transmisja danych"</string> @@ -343,10 +349,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Wykorzystano <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Ostrzeżenie: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil służbowy"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Powiadomienia i aplikacje są wyłączone"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Podświetlenie nocne"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Włącz o zachodzie"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do wschodu słońca"</string> @@ -364,8 +368,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacja <xliff:g id="APP">%s</xliff:g> została wyłączona w trybie bezpiecznym."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Wyczyść wszystko"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Przeciągnij tutaj, by podzielić ekran"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podziel poziomo"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podziel pionowo"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podziel niestandardowo"</string> @@ -454,7 +456,7 @@ <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> może monitorować ruch w sieci w Twoim profilu do pracy"</string> <string name="quick_settings_disclosure_monitoring" msgid="679658227269205728">"Sieć może być monitorowana"</string> <string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"Urządzenie połączone z sieciami VPN"</string> - <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil do pracy połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> + <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil służbowy połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> <string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil osobisty połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> <string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Urządzenie połączone z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string> <string name="monitoring_title_device_owned" msgid="1652495295941959815">"Zarządzanie urządzeniami"</string> @@ -474,7 +476,7 @@ <string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu."</string> <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Łączysz się z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Łączysz się z aplikacjami <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, które mogą monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> - <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Twój profil do pracy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> + <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Twój profil służbowy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Twój profil osobisty jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Twoim urządzeniem zarządza <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string> <string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> używa aplikacji <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> do zarządzania Twoim urządzeniem."</string> @@ -506,11 +508,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Wyłącz teraz"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozwiń"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Zwiń"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Przełącz urządzenie wyjściowe"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran jest przypięty"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Wstecz oraz Ekran główny."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Przegląd."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Ekran główny."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Aby odpiąć ten ekran, naciśnij i przytrzymaj przyciski Wstecz oraz Przegląd"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Aby odpiąć ten ekran, naciśnij i przytrzymaj przyciski Wstecz oraz Ekran główny"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nie, dziękuję"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran przypięty"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran odpięty"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ukryć <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojawi się ponownie, gdy następnym włączysz go w ustawieniach."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ukryj"</string> @@ -533,8 +542,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Kliknij, by włączyć wibracje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Kliknij, by wyciszyć."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Wyświetlane są elementy sterowania głośnością aplikacji %s. Przesuń palcem, by odrzucić."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Elementy sterowania głośnością ukryte"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Sterowanie głośnością: %s"</string> <string name="output_title" msgid="5355078100792942802">"Wyjście multimediów"</string> <string name="output_calls_title" msgid="8717692905017206161">"Wyjście dla połączeń telefonicznych"</string> <string name="output_none_found" msgid="5544982839808921091">"Nie znaleziono urządzeń"</string> @@ -553,7 +561,7 @@ <string name="show_demo_mode" msgid="2018336697782464029">"Pokaż tryb demonstracyjny"</string> <string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string> <string name="status_bar_alarm" msgid="8536256753575881818">"Alarm"</string> - <string name="status_bar_work" msgid="6022553324802866373">"Profil do pracy"</string> + <string name="status_bar_work" msgid="6022553324802866373">"Profil służbowy"</string> <string name="status_bar_airplane" msgid="7057575501472249002">"Tryb samolotowy"</string> <string name="add_tile" msgid="2995389510240786221">"Dodaj nazwę"</string> <string name="broadcast_tile" msgid="3894036511763289383">"Rozgłaszana nazwa"</string> @@ -563,7 +571,7 @@ <string name="alarm_template_far" msgid="4242179982586714810">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string> <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string> <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string> - <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil do pracy"</string> + <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil służbowy"</string> <string name="tuner_warning_title" msgid="7094689930793031682">"Dobra zabawa, ale nie dla każdego"</string> <string name="tuner_warning" msgid="8730648121973575701">"Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> <string name="tuner_persistent_warning" msgid="8597333795565621795">"Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string> @@ -590,8 +598,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Dzięki zaawansowanym ustawieniom możesz określić poziom ważności powiadomień z aplikacji w skali od 0 do 5. \n\n"<b>"Poziom 5"</b>" \n– Pokazuj u góry listy powiadomień \n– Zezwalaj na powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 4"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 3"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n\n"<b>"Poziom 2"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n\n"<b>"Poziom 1"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n– Ukrywaj na ekranie blokady i pasku stanu \n– Pokazuj u dołu listy powiadomień \n\n"<b>"Poziom 0"</b>" \n– Blokuj wszystkie powiadomienia aplikacji"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Powiadomienia"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Te powiadomienia nie będą już wyświetlane"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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">"Zatrzymaj powiadomienia"</string> <string name="inline_keep_button" msgid="6665940297019018232">"Pokazuj nadal"</string> @@ -689,9 +696,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Schowek"</item> <item msgid="5742013440802239414">"Klawisz"</item> - <item msgid="8802889973626281575">"Przełączanie klawiatury"</item> - <item msgid="7095517796293767867">"Sugestia obrotu"</item> - <item msgid="8494159969042135235">"Brak"</item> + <item msgid="1951959982985094069">"Potwierdzenie obrotu, przełącznik klawiatury"</item> + <item msgid="8175437057325747277">"Brak"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normalny"</item> diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index 982b8b7df37b..29ac90e6ec17 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string> <string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string> @@ -310,8 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -361,7 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string> @@ -505,21 +507,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ela é mantida à vista até que seja liberada. Toque em Início e mantenha essa opção pressionada para liberar."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para liberar essa tela, toque nos botões Voltar e Início e mantenha-os pressionados"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Tela fixada"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Tela liberada"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -542,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string> <string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string> <string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string> @@ -693,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Área de transferência"</item> <item msgid="5742013440802239414">"Código de tecla"</item> - <item msgid="8802889973626281575">"Alternador de teclado"</item> - <item msgid="7095517796293767867">"Sugestão de rotação"</item> - <item msgid="8494159969042135235">"Nenhum"</item> + <item msgid="1951959982985094069">"Gire para confirmar a troca do teclado"</item> + <item msgid="8175437057325747277">"Nenhum"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 2bc1c03edd44..c5c4add88ac8 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmara"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo esquema de tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone de aplicação"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina de sobremesas"</string> <string name="start_dreams" msgid="5640361424498338327">"Proteção de ecrã"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não incomodar"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Apenas prioridade"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Apenas alarmes"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ligado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Não estão disponíveis redes Wi-Fi"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmissão"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para utilizar o ecrã dividido"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslizar rapidamente para cima para mudar de aplicação"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Mudar de dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"O ecrã está fixado"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Página inicial para soltar."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Vista geral para soltar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Página inicial para soltar."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Vista geral."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Página inicial."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Compreendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ecrã fixo"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ecrã solto"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Pretende ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Reaparecerá da próxima vez que a funcionalidade for ativada nas definições."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para ativar a vibração."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para desativar o som."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Controlos de volume %s apresentados. Deslize rapidamente para cima para ignorar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultados"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controlos de volume de %s"</string> <string name="output_title" msgid="5355078100792942802">"Saída de som multimédia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Saída de som de chamada telefónica"</string> <string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo encontrado."</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Área de transferência"</item> <item msgid="5742013440802239414">"Código de tecla"</item> - <item msgid="8802889973626281575">"Comutador de teclado"</item> - <item msgid="7095517796293767867">"Sugestão de rotação"</item> - <item msgid="8494159969042135235">"Nenhum"</item> + <item msgid="1951959982985094069">"Confirmar ao rodar, comutador de teclado"</item> + <item msgid="8175437057325747277">"Nenhum"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 982b8b7df37b..29ac90e6ec17 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string> <string name="cancel" msgid="6442560571259935130">"Cancelar"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string> <string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string> @@ -310,8 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string> @@ -361,7 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string> @@ -505,21 +507,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ela é mantida à vista até que seja liberada. Toque em Início e mantenha essa opção pressionada para liberar."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para liberar essa tela, toque nos botões Voltar e Início e mantenha-os pressionados"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Tela fixada"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Tela liberada"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string> @@ -542,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string> <string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string> <string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string> <string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string> @@ -693,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Área de transferência"</item> <item msgid="5742013440802239414">"Código de tecla"</item> - <item msgid="8802889973626281575">"Alternador de teclado"</item> - <item msgid="7095517796293767867">"Sugestão de rotação"</item> - <item msgid="8494159969042135235">"Nenhum"</item> + <item msgid="1951959982985094069">"Gire para confirmar a troca do teclado"</item> + <item msgid="8175437057325747277">"Nenhum"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index d7652821560e..7753e11343b5 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -104,6 +104,8 @@ <string name="camera_label" msgid="7261107956054836961">"deschideți camera foto"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Selectați noul aspect pentru activitate"</string> <string name="cancel" msgid="6442560571259935130">"Anulați"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Pictograma aplicației"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zona mesajelor de ajutor"</string> @@ -276,6 +278,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina cu dulciuri"</string> <string name="start_dreams" msgid="5640361424498338327">"Economizor de ecran"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nu deranja"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Numai cu prioritate"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Numai alarme"</string> @@ -312,8 +316,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi deconectat"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activat"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarmă"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Proiectați"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Se proiectează"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispozitiv nedenumit"</string> @@ -364,7 +367,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplicația <xliff:g id="APP">%s</xliff:g> este dezactivată în modul sigur."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ștergeți tot"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Trageți aici pentru a folosi ecranul împărțit"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Glisați în sus pentru a comuta între aplicații"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divizare pe orizontală"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divizare pe verticală"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divizare personalizată"</string> @@ -508,21 +510,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Comutați dispozitivul de ieșire"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ecranul este fixat"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Pentru a anula fixarea acestui ecran, atingeți lung butoanele Înapoi și Recente"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Pentru a anula fixarea acestui ecran, atingeți lung butoanele Înapoi și Acasă"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Am înțeles"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nu, mulțumesc"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ecran fixat"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Fixarea ecranului anulată"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ascundeți <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Va reapărea la următoarea activare în setări."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ascundeți"</string> @@ -545,8 +541,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Atingeți pentru a seta pe vibrații."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Atingeți pentru a dezactiva sunetul."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Comenzile de volum pentru %s sunt afișate. Glisați pentru a închide."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comenzile de volum sunt ascunse"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Comenzi de volum pentru %s"</string> <string name="output_title" msgid="5355078100792942802">"Ieșire media"</string> <string name="output_calls_title" msgid="8717692905017206161">"Ieșire apel telefonic"</string> <string name="output_none_found" msgid="5544982839808921091">"Nu s-a găsit niciun dispozitiv"</string> @@ -698,9 +693,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Cod de tastă"</item> - <item msgid="8802889973626281575">"Comutator tastatură"</item> - <item msgid="7095517796293767867">"Sugestie de rotire"</item> - <item msgid="8494159969042135235">"Niciunul"</item> + <item msgid="1951959982985094069">"Confirmați rotirea, comutator de la tastatură"</item> + <item msgid="8175437057325747277">"Niciunul"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 9cd90827a39c..abeaf22bcab8 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -87,7 +87,7 @@ <string name="use_ptp_button_title" msgid="7517127540301625751">"Установить как камеру (PTP)"</string> <string name="installer_cd_button_title" msgid="2312667578562201583">"Установить приложение"</string> <string name="accessibility_back" msgid="567011538994429120">"Назад"</string> - <string name="accessibility_home" msgid="8217216074895377641">"Домой"</string> + <string name="accessibility_home" msgid="8217216074895377641">"Главный экран"</string> <string name="accessibility_menu" msgid="316839303324695949">"Меню"</string> <string name="accessibility_accessibility_button" msgid="7601252764577607915">"Специальные возможности"</string> <string name="accessibility_rotate_button" msgid="7402949513740253006">"Поворот экрана"</string> @@ -105,6 +105,8 @@ <string name="camera_label" msgid="7261107956054836961">"Открыть камеру."</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string> <string name="cancel" msgid="6442560571259935130">"Отмена"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок приложения"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Справочное сообщение"</string> @@ -278,6 +280,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Коробка со сладостями"</string> <string name="start_dreams" msgid="5640361424498338327">"Заставка"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не беспокоить"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Только важные"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Только будильник"</string> @@ -314,8 +318,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi выкл."</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi включен"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Не удалось найти доступные сети Wi-Fi"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будильник"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Передача изображения"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Безымянное устройство"</string> @@ -367,7 +370,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" отключено в безопасном режиме."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистить все"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетащите сюда, чтобы разделить экран"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Чтобы переключиться между приложениями, проведите по экрану вверх."</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Разделить по горизонтали"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Разделить по вертикали"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Разделить по-другому"</string> @@ -511,21 +513,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Сменить устройство аудиовыхода"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Блокировка в приложении включена"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Обзор\"."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Главный экран\"."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Обзор\"."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Главный экран\"."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Чтобы отменить блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Чтобы отменить блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Главный экран\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"ОК"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Нет, спасибо"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Блокировка включена"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Блокировка выключена"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Скрыть параметр \"<xliff:g id="TILE_LABEL">%1$s</xliff:g>\"?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Этот параметр появится в следующий раз, когда вы включите его."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скрыть"</string> @@ -548,8 +544,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Нажмите, чтобы включить вибрацию."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Нажмите, чтобы выключить звук."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показаны регуляторы громкости: %s. Проведите вверх, чтобы скрыть."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регуляторы громкости скрыты"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s: регулировка громкости"</string> <string name="output_title" msgid="5355078100792942802">"Выход мультимедиа"</string> <string name="output_calls_title" msgid="8717692905017206161">"Выход телефонных вызовов"</string> <string name="output_none_found" msgid="5544982839808921091">"Устройств не найдено"</string> @@ -703,9 +698,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Буфер обмена"</item> <item msgid="5742013440802239414">"Код клавиши"</item> - <item msgid="8802889973626281575">"Переключение раскладки"</item> - <item msgid="7095517796293767867">"Поворот"</item> - <item msgid="8494159969042135235">"Нет"</item> + <item msgid="1951959982985094069">"Подтвердить поворот, переключить раскладку"</item> + <item msgid="8175437057325747277">"Нет"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Обычная"</item> diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index b041d48d1cc4..effcac49e632 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"කැමරාව විවෘත කරන්න"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"නව කාර්යය සැකැස්ම තෝරන්න"</string> <string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"යෙදුම් නිරූපකය"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"උදවු පණිවිඩ ප්රදේශය"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"අතුරුපස අවස්තාව"</string> <string name="start_dreams" msgid="5640361424498338327">"තිර සුරැකුම"</string> <string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"බාධා නොකරන්න"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ප්රමුඛතාව පමණයි"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"එලාම පමණි"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi අක්රියයි"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ක්රියාත්මකයි"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ජාල ලබා ගත නොහැකිය"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"එලාමය"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"කාස්ට් කිරීම"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"නම් නොකළ උපාංගය"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ආරක්ෂිත ප්රකාරය තුළ අබලයි."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"සියල්ල හිස් කරන්න"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"බෙදුම් තිරය භාවිත කිරීමට මෙතැනට අදින්න"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"යෙදුම් මාරු කිරීමට ස්වයිප් කරන්න"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"තිරස්ව වෙන් කරන්න"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"සිරස්ව වෙන් කරන්න"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"අභිමත ලෙස වෙන් කරන්න"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ප්රතිදාන උපාංගය මාරු කරන්න"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"තීරය අමුණන ලදි"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට මුල් පිටුව ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට මුල් පිටුව ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"මෙම තිර ඇමුණුම ගැලවීමට, දළ විශ්ලේෂණය බොත්තම් ස්පර්ශ කර අල්ලා ගෙන සිටින්න"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"මෙම තිරය ඇමුණුම ගැලවීමට, මුල් පිටුව බොත්තම් ස්පර්ශ කර අල්ලා ගෙන සිටින්න"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"හරි, තේරුණා"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"එපා ස්තූතියි"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"තිරය අමුණා ඇත"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"තිරයේ ගලවා ඇත"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> සඟවන්නද?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ඊළඟ අවස්ථාවේ සැකසීම් තුළ ඔබ එය සක්රිය කළ විට එය නැවත දිසිවේ."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"සඟවන්න"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. කම්පනය කිරීමට සකස් කිරීමට තට්ටු කරන්න."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s හඬ පරිමා පාලන පෙන්වයි. ඉවත දැමීමට ස්වයිප් කරන්න."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"හඩ පරිමා පාලන සඟවා ඇත"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"හඬ පරිමා පාලන %s"</string> <string name="output_title" msgid="5355078100792942802">"මාධ්ය ප්රතිදානය"</string> <string name="output_calls_title" msgid="8717692905017206161">"දුරකථන ඇමතුම් ප්රතිදානය"</string> <string name="output_none_found" msgid="5544982839808921091">"උපාංග හමු නොවිණි"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"පසුරු පුවරුව"</item> <item msgid="5742013440802239414">"යතුරු කේතය"</item> - <item msgid="8802889973626281575">"යතුරු පුවරු මාරුව"</item> - <item msgid="7095517796293767867">"කැරකීමේ යෝජනාව"</item> - <item msgid="8494159969042135235">"කිසිවක් නැත"</item> + <item msgid="1951959982985094069">"තහවුරු කිරීම කරකවන්න, යතුරු පුවරු මාරුව"</item> + <item msgid="8175437057325747277">"කිසිවක් නැත"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"සාමාන්ය"</item> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index e9b4e9fd0da8..3a0a3315ffc0 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -105,12 +105,10 @@ <string name="camera_label" msgid="7261107956054836961">"spustiť fotoaparát"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Vyberte nové rozloženie úlohy"</string> <string name="cancel" msgid="6442560571259935130">"Zrušiť"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> - <skip /> + <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="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikácie"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblasť chybového hlásenia"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tlačidlo úpravy veľkosti z dôvodu kompatibility."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zväčšiť menší obrázok na väčšiu obrazovku."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth pripojené."</string> @@ -281,6 +279,7 @@ <string name="dessert_case" msgid="1295161776223959221">"Pult s dezertami"</string> <string name="start_dreams" msgid="5640361424498338327">"Šetrič obrazovky"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Pridržaním ikon zobrazíte ďalšie možnosti"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušiť"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Iba prioritné"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Iba budíky"</string> @@ -317,6 +316,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Sieť Wi‑Fi je vypnutá"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi‑Fi je zapnuté"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi‑Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Budík"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Prenos"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Prenáša sa"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepomenované zariadenie"</string> @@ -333,9 +333,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Pripája sa..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľané pripojenie"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Zapína sa..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="few">%d zariadenia</item> + <item quantity="many">%d zariadenia</item> + <item quantity="other">%d zariadení</item> + <item quantity="one">%d zariadenie</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Upozornenia"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Baterka"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilné dáta"</string> @@ -345,10 +349,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využité: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornenie pri <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Pracovný profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Upozornenia a aplikácie sú vypnuté"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nočný režim"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Zapne sa pri západe slnka"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do východu slnka"</string> @@ -366,8 +368,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikácia <xliff:g id="APP">%s</xliff:g> je v núdzovom režime zakázaná."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazať všetko"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Presuňte okno sem a použite tak rozdelenú obrazovku"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Rozdeliť vodorovné"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Rozdeliť zvislé"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Rozdeliť vlastné"</string> @@ -508,11 +508,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Vypnúť"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozbaliť"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Zbaliť"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Prepnúť výstupné zariadenie"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je pripnutá"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidiel Späť a Prehľad."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidiel Späť a Domov."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidla Prehľad."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidla Domov."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Ak chcete odopnúť túto obrazovku, pridržte tlačidlá Späť a Prehľad"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ak chcete odopnúť túto obrazovku, pridržte tlačidlá Späť a Prehľad"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Dobre"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nie, vďaka"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Obrazovka bola pripnutá"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Obrazovka bola odopnutá"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skryť <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Táto položka sa znova zobrazí, keď ju v nastaveniach opätovne zapnete."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skryť"</string> @@ -535,8 +542,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrovanie."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Zobrazujú sa ovládacie prvky hlasitosti zariadenia %s. Prejdením prstom nahor to odmietnete."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládacie prvky hlasitosti sú skryté"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Ovládacie prvky hlasitosti %s"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"Výstup médií"</string> <string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonického hovoru"</string> <string name="output_none_found" msgid="5544982839808921091">"Nenašli sa žiadne zariadenia"</string> @@ -592,8 +604,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Pomocou ovládacích prvkov zobrazovania upozornení môžete nastaviť pre upozornenia aplikácie úroveň dôležitosti od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazovať v hornej časti zoznamu upozornení. \n– Povoliť prerušenia na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 4"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 3"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n\n"<b>"Úroveň 2"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n\n"<b>"Úroveň 1"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n– Skryť na uzamknutej obrazovke a v stavovom riadku. \n– Zobraziť v dolnej časti zoznamu upozornení. \n\n"<b>"Úroveň 0"</b>" \n– Blokovať všetky upozornenia z aplikácie."</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Upozornenia"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Tieto upozornenia sa už nebudú zobrazovať"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Naďalej zobrazovať"</string> @@ -691,9 +702,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Schránka"</item> <item msgid="5742013440802239414">"Kód klávesnice"</item> - <item msgid="8802889973626281575">"Prepínač klávesnice"</item> - <item msgid="7095517796293767867">"Návrh otáčania"</item> - <item msgid="8494159969042135235">"Žiadne"</item> + <item msgid="1951959982985094069">"Potvrdenie otočenia, prepínač klávesnice"</item> + <item msgid="8175437057325747277">"Žiadne"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Štandardná"</item> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 65164cc7aa5e..40b7539a3cdb 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -105,12 +105,11 @@ <string name="camera_label" msgid="7261107956054836961">"odpri fotoaparat"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Izberite novo postavitev opravil"</string> <string name="cancel" msgid="6442560571259935130">"Prekliči"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Območje sporočila pomoči"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb povečave za združljivost."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Povečava manjšega na večji zaslon."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Povezava Bluetooth vzpostavljena."</string> @@ -281,6 +280,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Vitrina za sladice"</string> <string name="start_dreams" msgid="5640361424498338327">"Ohranjeval. zaslona"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne moti"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prednostno"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string> @@ -317,6 +318,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi izklopljen"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je vklopljen."</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Na voljo ni nobeno omrežje Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Predvajanje"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Predvajanje"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovana naprava"</string> @@ -333,9 +335,13 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Vzpostavljanje povezave ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internet prek mobilne naprave"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Dostopna točka"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Vklapljanje …"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d naprava</item> + <item quantity="two">%d napravi</item> + <item quantity="few">%d naprave</item> + <item quantity="other">%d naprav</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obvestila"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svetilka"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Prenos podatkov v mobilnem omrežju"</string> @@ -345,10 +351,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Porabljeno: <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Omejitev: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Opozorilo – <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Delovni profil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Obvestila in aplikacije so izklopljeni"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nočna svetloba"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ob sončnem zahodu"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do sončnega vzhoda"</string> @@ -366,8 +370,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je v varnem načinu onemogočena."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši vse"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Povlecite sem za razdeljeni zaslon"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Razdeli vodoravno"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Razdeli navpično"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Razdeli po meri"</string> @@ -508,11 +510,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Izklopi"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Razširi"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Strni"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Izbira druge izhodne naprave"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je pripet"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in pregled."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in za začetni zaslon."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za pregled."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za začetni zaslon."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Če želite odpeti ta zaslon, hkrati pridržite gumba za nazaj in za pregled."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Če želite odpeti ta zaslon, hkrati pridržite gumba za nazaj in za začetni zaslon."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Razumem"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Zaslon je pripet"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Zaslon je odpet"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite skriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Znova se bo pojavila, ko jo naslednjič vklopite v nastavitvah."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrij"</string> @@ -535,8 +544,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dotaknite se, če želite nastaviti vibriranje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dotaknite se, če želite izklopiti zvok."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazani so ti kontrolniki za glasnost: %s. Povlecite navzgor za opustitev."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrolniki za glasnost so skriti."</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrolniki glasnosti za %s"</string> <string name="output_title" msgid="5355078100792942802">"Izhod predstavnosti"</string> <string name="output_calls_title" msgid="8717692905017206161">"Izhod telefonskih klicev"</string> <string name="output_none_found" msgid="5544982839808921091">"Ni naprav"</string> @@ -592,8 +600,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"S kontrolniki za pomebnost obvestila je mogoče za obvestila aplikacije nastaviti stopnjo pomembnosti od 0 do 5. \n\n"<b>"Stopnja 5"</b>" \n– Prikaz na vrhu seznama obvestil \n– Omogočanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 4"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 3"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n\n"<b>"Stopnja 2"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n\n"<b>"Stopnja 1"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n– Skrivanje na zaklenjenem zaslonu in v vrstici stanja \n– Prikaz na dnu seznama obvestil \n\n"<b>"Stopnja 0"</b>" \n– Blokiranje vseh obvestil aplikacije"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Obvestila"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Ta obvestila ne bodo več prikazana"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Prikazuj še naprej"</string> @@ -691,9 +698,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Odložišče"</item> <item msgid="5742013440802239414">"Koda tipke"</item> - <item msgid="8802889973626281575">"Preklopnik tipkovnice"</item> - <item msgid="7095517796293767867">"Predlog za vrtenje"</item> - <item msgid="8494159969042135235">"Brez"</item> + <item msgid="1951959982985094069">"Potrditev vrtenja, preklopnik tipkovnice"</item> + <item msgid="8175437057325747277">"Brez"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Običajna"</item> diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 7634902dbf9b..24c3538c17c4 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"hap kamerën"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Zgjidh strukturën e re të detyrës"</string> <string name="cancel" msgid="6442560571259935130">"Anulo"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona e aplikacionit"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zona e mesazhit të ndihmës"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butoni i zmadhimit të pajtueshmërisë."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zmadho nga një ekran i vogël në të madh."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Pajisja është lidhur me \"bluetooth\"."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"\"Kutia e ëmbëlsirës\""</string> <string name="start_dreams" msgid="5640361424498338327">"Mbrojtësi i ekranit"</string> <string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mos shqetëso"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vetëm me prioritet"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vetëm alarmet"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi është i çaktivizuar"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi i aktivizuar"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nuk ka rrjete Wi-Fi të disponueshme"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarmi"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmeto"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Po transmeton"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Pajisje e paemërtuar"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Po lidhet..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Lidhje çiftimi"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Qasje në zona publike interneti"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Po aktivizon..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d pajisje</item> + <item quantity="one">%d pajisje</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Njoftimet"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Elektriku"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Të dhënat celulare"</string> @@ -358,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> është i çaktivizuar në modalitetin e sigurt."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Pastroji të gjitha"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Zvarrit këtu për të përdorur ekranin e ndarë"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Ndaje horizontalisht"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Ndaj vertikalisht"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ndaj të personalizuarën"</string> @@ -499,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Çaktivizoje tani"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Zgjeroje"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Mbylle"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ndërro pajisjen e daljes"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrani u gozhdua"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Kreu\" për ta hequr nga gozhdimi."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Përmbledhje\" për ta hequr nga gozhdimi."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Kreu\" për ta hequr nga gozhdimi."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Për të hequr gozhdimin e këtij ekrani, prek dhe mbaj butonat \"Prapa\" dhe \"Përmbledhja\"."</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Për të hequr gozhdimin e këtij ekrani, prek dhe mbaj butonat \"Prapa\" dhe \"Kreu\"."</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"E kuptova!"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Jo, faleminderit!"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekrani u gozhdua"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekrani u hoq nga gozhdimi"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Të fshihet <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Do të rishfaqet herën tjetër kur ta aktivizoni te cilësimet."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fshih"</string> @@ -526,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trokit për ta vendosur në dridhje."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trokit për ta çaktivizuar."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tregohen %s kontrolle volumi. Rrëshqit lart për ta larguar."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrollet e volumit janë fshehur"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrollet e volumit %s"</string> <string name="output_title" msgid="5355078100792942802">"Dalja e pajisjes"</string> <string name="output_calls_title" msgid="8717692905017206161">"Dalja e telefonatës"</string> <string name="output_none_found" msgid="5544982839808921091">"Nuk u gjet asnjë pajisje"</string> @@ -583,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Me kontrollet e njoftimit të energjisë, mund të caktosh një nivel rëndësie nga 0 në 5 për njoftimet e një aplikacioni. \n\n"<b>"Niveli 5"</b>" \n- Shfaq në krye të listës së njoftimeve \n- Lejo ndërprerjen e ekranit të plotë \n- Gjithmonë shfaq shpejt \n\n"<b>"Niveli 4"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Gijthmonë shfaq shpejt \n\n"<b>"Niveli 3"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n\n"<b>"Niveli 2"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull dhe dridhje \n\n"<b>"Niveli 1"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull ose dridhje \n- Fshih nga ekrani i kyçjes dhe shiriti i statusit \n- Shfaq në fund të listës së njoftimeve \n\n"<b>"Niveli 0"</b>" \n- Blloko të gjitha njoftimet nga aplikacioni"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Njoftime"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Nuk do t\'i shikosh më këto njoftime"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Vazhdo të shfaqësh"</string> @@ -678,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Kujtesa e fragmenteve"</item> <item msgid="5742013440802239414">"Kodi i tasteve"</item> - <item msgid="8802889973626281575">"Ndërruesi i tastierës"</item> - <item msgid="7095517796293767867">"Sugjerimi i rrotullimit"</item> - <item msgid="8494159969042135235">"Asnjë"</item> + <item msgid="1951959982985094069">"Konfirmimi i rrotullimit, ndërruesi i tastierës"</item> + <item msgid="8175437057325747277">"Asnjë"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normale"</item> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index aa97eb275a09..346e2a3ab8aa 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -104,12 +104,11 @@ <string name="camera_label" msgid="7261107956054836961">"отвори камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Изабери нови распоред задатака"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона апликације"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Област поруке за помоћ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Дугме Зум компатибилности."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумирање са мањег на већи екран."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth је прикључен."</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Витрина са посластицама"</string> <string name="start_dreams" msgid="5640361424498338327">"Чувар екрана"</string> <string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не узнемиравај"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетни прекиди"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi је искључен"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi је укључен"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Није доступна ниједна Wi-Fi мрежа"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Аларм"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Пребацивање"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Пребацивање"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименовани уређај"</string> @@ -329,9 +331,12 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Повезује се..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Повезивање"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хотспот"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Укључује се..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d уређај</item> + <item quantity="few">%d уређаја</item> + <item quantity="other">%d уређаја</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Обавештења"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Лампа"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилни подаци"</string> @@ -341,10 +346,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Искористили сте <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничење од <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Упозорење за <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Профил за Work"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Обавештења и апликације су искључени"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Ноћно светло"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Укључује се по заласку сунца"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изласка сунца"</string> @@ -362,8 +365,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Апликација <xliff:g id="APP">%s</xliff:g> је онемогућена у безбедном режиму."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Обриши све"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Превуците овде да бисте користили раздељени екран"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Подели хоризонтално"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Подели вертикално"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Прилагођено дељење"</string> @@ -504,11 +505,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Искључи одмах"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Прошири"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Скупи"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Промените излазни уређај"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екран је закачен"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Преглед да бисте га откачили."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Почетна да бисте га откачили."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Преглед да бисте га откачили."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Почетна да бисте га откачили."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Да бисте откачили овај екран, додирните и задржите дугмад Назад и Преглед"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Да бисте откачили овај екран, додирните и задржите дугмад Назад и Почетна"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Важи"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Не, хвала"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Екран је закачен"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Екран је откачен"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Желите ли да сакријете <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ово ће се поново појавити када га следећи пут будете укључили у подешавањима."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сакриј"</string> @@ -531,8 +539,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Додирните да бисте подесили на вибрацију."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Додирните да бисте искључили звук."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Контроле за јачину звука (%s) су приказане. Превуците нагоре да бисте их одбацили."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контроле за јачину звука су сакривене"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Контроле за јачину звука за %s"</string> <string name="output_title" msgid="5355078100792942802">"Излаз медија"</string> <string name="output_calls_title" msgid="8717692905017206161">"Излаз за телефонски позив"</string> <string name="output_none_found" msgid="5544982839808921091">"Није пронађен ниједан уређај"</string> @@ -588,8 +595,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Помоћу напредних контрола за обавештења можете да подесите ниво важности од 0. до 5. за обавештења апликације. \n\n"<b>"5. ниво"</b>" \n– Приказују се у врху листе обавештења \n- Дозволи прекид режима целог екрана \n– Увек завируј \n\n"<b>"4. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Увек завируј \n\n"<b>"3. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n\n"<b>"2. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n\n"<b>"1. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n– Сакриј на закључаном екрану и статусној траци \n– Приказују се у дну листе обавештења \n\n"<b>"0. ниво"</b>" \n– Блокирај сва обавештења из апликације"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Обавештења"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Више нећете видети ова обавештења"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Настави да приказујеш"</string> @@ -685,9 +691,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Меморија"</item> <item msgid="5742013440802239414">"Кôд тастера"</item> - <item msgid="8802889973626281575">"Пребацивач за тастатуру"</item> - <item msgid="7095517796293767867">"Предлог за ротацију"</item> - <item msgid="8494159969042135235">"Ништа"</item> + <item msgid="1951959982985094069">"Потврда ротирања, пребацивач за тастатуру"</item> + <item msgid="8175437057325747277">"Ништа"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Нормални"</item> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index e5ae211ce0bb..83efa686adf4 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"öppna kameran"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Välj en ny layout för uppgiften"</string> <string name="cancel" msgid="6442560571259935130">"Avbryt"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appikon"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område för hjälpmeddelande"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knapp för kompatibilitetszoom."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zooma mindre skärm till större."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ansluten."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessertdisken"</string> <string name="start_dreams" msgid="5640361424498338327">"Skärmsläckare"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Stör ej"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Endast prioriterade"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Endast alarm"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi av"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi är aktiverat"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Det finns inga tillgängliga Wi-Fi-nätverk"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Casta"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Castar"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Namnlös enhet"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Ansluter ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internetdelning"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Surfzon"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Aktiverar …"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d enheter</item> + <item quantity="one">%d enhet</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Aviseringar"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Ficklampa"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobildata"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> används"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Gräns: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Varning <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Jobbprofil"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Aviseringar och appar är inaktiverade"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nattljus"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På från solnedgången"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Till soluppgången"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> är inaktiverad i säkert läge."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Rensa alla"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit för att dela upp skärmen"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dela horisontellt"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dela vertikalt"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dela anpassad"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Inaktivera nu"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Utöka"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Komprimera"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Byt enhet för utdata"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skärmen har fästs"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Översikt om du vill lossa skärmen."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Startsida om du vill lossa skärmen."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Skärmen visas tills du lossar den. Tryck länge på Översikt om du vill lossa skärmen."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Skärmen visas tills du lossar den. Tryck länge på Startsida om du vill lossa skärmen."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Översikt"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Startsida"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Nej tack"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skärmen är fäst"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skärmen är inte längre fäst"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vill du dölja <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den visas på nytt nästa gång du aktiverar den i inställningarna."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Dölj"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryck här om du vill aktivera vibrationsläget."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryck här om du vill stänga av ljudet."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volymkontrollerna för %s visas. Svep uppåt för att ignorera."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volymkontrollerna är dolda"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Volymkontroller för %s"</string> <string name="output_title" msgid="5355078100792942802">"Medieuppspelning"</string> <string name="output_calls_title" msgid="8717692905017206161">"Utdata för samtal"</string> <string name="output_none_found" msgid="5544982839808921091">"Inga enheter hittades"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Med aviseringsinställningarna kan du ange prioritetsnivå från 0 till 5 för aviseringar från en app. \n\n"<b>"Nivå 5"</b>" \n– Visa högst upp i aviseringslistan\n– Tillåt avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 4"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 3"</b>" \n- Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n\n"<b>"Nivå 2"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n\n"<b>"Nivå 1"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n– Visa inte på låsskärmen och i statusfältet \n– Visa längst ned i aviseringslistan \n\n"<b>"Nivå 0"</b>" \n– Blockera alla aviseringar från appen"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Aviseringar"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"De här aviseringarna visas inte längre"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Fortsätt visa"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Urklipp"</item> <item msgid="5742013440802239414">"Tangentkod"</item> - <item msgid="8802889973626281575">"Byt mellan meny/tangentbord"</item> - <item msgid="7095517796293767867">"Rotationsförslag"</item> - <item msgid="8494159969042135235">"Inga"</item> + <item msgid="1951959982985094069">"Bekräfta rotation, byt mellan meny/tangentbord"</item> + <item msgid="8175437057325747277">"Ingen"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> @@ -789,7 +793,7 @@ <string name="notification_channel_screenshot" msgid="6314080179230000938">"Skärmdumpar"</string> <string name="notification_channel_general" msgid="4525309436693914482">"Allmänna meddelanden"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string> - <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string> + <string name="instant_apps" msgid="6647570248119804907">"Snabbappar"</string> <string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string> <string name="app_info" msgid="6856026610594615344">"Info om appen"</string> <string name="go_to_web" msgid="2650669128861626071">"Öppna webbläsaren"</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index a74f8a4c4e19..e7a4e498f4c1 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"fungua kamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Chagua muundo mpya wa kazi"</string> <string name="cancel" msgid="6442560571259935130">"Ghairi"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Aikoni ya programu"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Sehemu ya ujumbe wa usaidizi"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Sanduku la Vitindamlo"</string> <string name="start_dreams" msgid="5640361424498338327">"Taswira ya skrini"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Usinisumbue"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kipaumbele tu"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kengele pekee"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Imezimwa"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Imewasha Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hakuna mitandao ya Wi-Fi inayopatikana"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Kengele"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Tuma"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Inatuma"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Kifaa hakina jina"</string> @@ -353,13 +356,12 @@ <string name="recents_empty_message" msgid="808480104164008572">"Hakuna vipengee vya hivi karibuni"</string> <string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Umeondoa vipengee vyote"</string> <string name="recents_app_info_button_label" msgid="2890317189376000030">"Maelezo ya Programu"</string> - <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kudumisha programu moja"</string> + <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kubandika kwenye skirini"</string> <string name="recents_search_bar_label" msgid="8074997400187836677">"tafuta"</string> <string name="recents_launch_error_message" msgid="2969287838120550506">"Haikuweza kuanzisha <xliff:g id="APP">%s</xliff:g>."</string> <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> imezimwa katika hali salama."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Futa zote"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Buruta hapa ili utumie skrini iliyogawanywa"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Telezesha kidole juu ili ubadilishe programu"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gawanya Mlalo"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Gawanya Wima"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Maalum Iliyogawanywa"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Badilisha kifaa cha kutoa sauti"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Skrini imebandikwa"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha kurudisha Nyuma na cha Mwanzo kwa pamoja ili ubandue."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Muhtasari ili ubandue."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha Mwanzo ili ubandue."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Ili ubandue skrini hii, gusa na ushikilie kitufe cha Nyuma na Muhtasari"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ili ubandue skrini hii, gusa na ushikilie vitufe vya Nyuma na Mwanzo"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Nimeelewa"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Hapana, asante"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Skrini imebandikwa"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Skrini imebanduliwa"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ungependa kuficha <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Itaonekana tena wakati mwingine utakapoiwasha katika mipangilio."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ficha"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Gusa ili uweke mtetemo."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Gusa ili usitishe."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Inaonyesha %s ya vidhibiti vya sauti. Telezesha kidole juu ili uondoe."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Imeficha vidhibiti vya sauti"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Vidhibiti %s vya sauti"</string> <string name="output_title" msgid="5355078100792942802">"Vifaa vya kutoa maudhui"</string> <string name="output_calls_title" msgid="8717692905017206161">"Vifaa vya kutoa sauti ya simu"</string> <string name="output_none_found" msgid="5544982839808921091">"Hakuna vifaa vilivyopatikana"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Ubao wa kunakili"</item> <item msgid="5742013440802239414">"Msimbo wa ufunguo"</item> - <item msgid="8802889973626281575">"Kibadilishaji cha kibodi"</item> - <item msgid="7095517796293767867">"Mapendekezo ya kuzungusha"</item> - <item msgid="8494159969042135235">"Hamna"</item> + <item msgid="1951959982985094069">"Thibitisha ugeuzaji, kibadilishaji cha kibodi"</item> + <item msgid="8175437057325747277">"Hamna"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Ya Kawaida"</item> diff --git a/packages/SystemUI/res/values-sw600dp-land/config.xml b/packages/SystemUI/res/values-sw600dp-land/config.xml index 6594bd28c8b4..c4c467152281 100644 --- a/packages/SystemUI/res/values-sw600dp-land/config.xml +++ b/packages/SystemUI/res/values-sw600dp-land/config.xml @@ -15,10 +15,6 @@ ~ limitations under the License --> <resources> - <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow - card. --> - <integer name="keyguard_max_notification_count">3</integer> - <!-- Whether QuickSettings is in a phone landscape --> <bool name="quick_settings_wide">false</bool> diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml index 13ca11401c03..f2df4b9023b1 100644 --- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml @@ -16,9 +16,6 @@ */ --> <resources> - <fraction name="keyguard_clock_y_fraction_max">37%</fraction> - <fraction name="keyguard_clock_y_fraction_min">20%</fraction> - <dimen name="keyguard_clock_notifications_margin">36dp</dimen> <dimen name="keyguard_indication_margin_bottom">80dp</dimen> diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml index 63b9d75f5054..67dabdb7353d 100644 --- a/packages/SystemUI/res/values-sw600dp/config.xml +++ b/packages/SystemUI/res/values-sw600dp/config.xml @@ -26,10 +26,6 @@ <!-- The number of columns that the top level tiles span in the QuickSettings --> <integer name="quick_settings_user_time_settings_tile_span">1</integer> - <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow - card. --> - <integer name="keyguard_max_notification_count">5</integer> - <!-- Set to true to enable the user switcher on the keyguard. --> <bool name="config_keyguardUserSwitcher">true</bool> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index e95d9fee880b..923edc8f1e92 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -38,12 +38,6 @@ <!-- On tablets this is just the close_handle_height --> <dimen name="peek_height">@dimen/close_handle_height</dimen> - <!-- The fraction of the screen height where the clock on the Keyguard has its center. The - max value is used when no notifications are displaying, and the min value is when the - highest possible number of notifications are showing. --> - <fraction name="keyguard_clock_y_fraction_max">34%</fraction> - <fraction name="keyguard_clock_y_fraction_min">24%</fraction> - <!-- The margin between the clock and the notifications on Keyguard. See keyguard_clock_height_fraction_* for the difference between min and max.--> <dimen name="keyguard_clock_notifications_margin">44dp</dimen> diff --git a/packages/SystemUI/res/values-sw720dp-land/config.xml b/packages/SystemUI/res/values-sw720dp-land/config.xml deleted file mode 100644 index 1b502886d8da..000000000000 --- a/packages/SystemUI/res/values-sw720dp-land/config.xml +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> -<resources> - <integer name="keyguard_max_notification_count">4</integer> -</resources> - diff --git a/packages/SystemUI/res/values-sw720dp-land/dimens.xml b/packages/SystemUI/res/values-sw720dp-land/dimens.xml deleted file mode 100644 index 511d45ffe71d..000000000000 --- a/packages/SystemUI/res/values-sw720dp-land/dimens.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- - ~ Copyright (C) 2014 The Android Open Source Project - ~ - ~ Licensed under the Apache License, Version 2.0 (the "License"); - ~ you may not use this file except in compliance with the License. - ~ You may obtain a copy of the License at - ~ - ~ http://www.apache.org/licenses/LICENSE-2.0 - ~ - ~ Unless required by applicable law or agreed to in writing, software - ~ distributed under the License is distributed on an "AS IS" BASIS, - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - ~ See the License for the specific language governing permissions and - ~ limitations under the License - --> -<resources> - <!-- The fraction of the screen height where the clock on the Keyguard has its center. The - min value is used when no notifications are displaying, and the max value is when the - highest possible number of notifications are showing. --> - <fraction name="keyguard_clock_y_fraction_max">35%</fraction> - <fraction name="keyguard_clock_y_fraction_min">24%</fraction> -</resources> diff --git a/packages/SystemUI/res/values-sw720dp/dimens.xml b/packages/SystemUI/res/values-sw720dp/dimens.xml index 25e96c8848db..8cf4adb73a7c 100644 --- a/packages/SystemUI/res/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res/values-sw720dp/dimens.xml @@ -28,11 +28,5 @@ <dimen name="notification_panel_min_height">770dp</dimen> <!-- Bottom margin (from display edge) for status bar panels --> <dimen name="panel_float">56dp</dimen> - - <!-- The fraction of the screen height where the clock on the Keyguard has its center. The - max value is used when no notifications are displaying, and the min value is when the - highest possible number of notifications are showing. --> - <fraction name="keyguard_clock_y_fraction_max">35%</fraction> - <fraction name="keyguard_clock_y_fraction_min">25%</fraction> </resources> diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index c8ff5a175c95..77778394e399 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"கேமராவைத் திற"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string> <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"பயன்பாட்டு ஐகான்"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"உதவிச் செய்திக்கான பகுதி"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string> <string name="start_dreams" msgid="5640361424498338327">"ஸ்கிரீன் சேவர்"</string> <string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்யாதே"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"முதன்மை மட்டும்"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"அலாரங்கள் மட்டும்"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"வைஃபையை முடக்கு"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"அலாரம்"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"பாதுகாப்புப் பயன்முறையில் <xliff:g id="APP">%s</xliff:g> முடக்கப்பட்டது."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"அனைத்தையும் அழி"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"திரைப் பிரிப்பைப் பயன்படுத்த, இங்கே இழுக்கவும்"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"தனிவிருப்பத்தில் பிரி"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"இப்போதே முடக்கு"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"விரிவாக்கு"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"சுருக்கு"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"வெளியீட்டுச் சாதனத்தை மாற்றுதல்"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"திரை பொருத்தப்பட்டது"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முகப்புப் பொத்தானைத் தொட்டுப் பிடிக்கவும்."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"இந்தத் திரையின் பின்னை அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வைப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"இந்தத் திரையின் பின்னை அகற்ற, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"புரிந்தது"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"வேண்டாம்"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"திரை பின் செய்யப்பட்டது"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"திரையிலிருந்து பின் அகற்றப்பட்டது"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"மறை"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும்."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ஒலியடக்க, தட்டவும்."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ஒலிக் கட்டுப்பாடுகள் காட்டப்பட்டன. நிராகரிக்க, மேலே ஸ்வைப் செய்யவும்."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ஒலிக் கட்டுப்பாடுகள் மறைக்கப்பட்டன"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ஒலியளவுக் கட்டுப்பாடுகள்"</string> <string name="output_title" msgid="5355078100792942802">"மீடியா வெளியீடு"</string> <string name="output_calls_title" msgid="8717692905017206161">"ஃபோன் அழைப்பு வெளியீடு"</string> <string name="output_none_found" msgid="5544982839808921091">"சாதனங்கள் எதுவும் இல்லை"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"கிளிப்போர்டு"</item> <item msgid="5742013440802239414">"விசைக்குறியீடு"</item> - <item msgid="8802889973626281575">"விசைப்பலகை மாற்றி"</item> - <item msgid="7095517796293767867">"சுழற்சிப் பரிந்துரை"</item> - <item msgid="8494159969042135235">"ஏதுமில்லை"</item> + <item msgid="1951959982985094069">"சுழற்ற உறுதிப்படுத்து, விசைப்பலகை மாற்றி"</item> + <item msgid="8175437057325747277">"ஏதுமில்லை"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"இயல்பானது"</item> diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 292fddd0a90a..38feaf522919 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string> <string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"అప్లికేషన్ చిహ్నం"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"సహాయ సందేశ ప్రాంతం"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"డెజర్ట్ కేస్"</string> <string name="start_dreams" msgid="5640361424498338327">"స్క్రీన్ సేవర్"</string> <string name="ethernet_label" msgid="7967563676324087464">"ఈథర్నెట్"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"అంతరాయం కలిగించవద్దు"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ప్రాధాన్యత మాత్రమే"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"అలారాలు మాత్రమే"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ఆఫ్లో ఉంది"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ఆన్లో ఉంది"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi నెట్వర్క్లు ఏవీ అందుబాటులో లేవు"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"అలారం"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"ప్రసారం చేయండి"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"ప్రసారం చేస్తోంది"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"పేరులేని పరికరం"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> సురక్షిత-మోడ్లో నిలిపివేయబడింది."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"అన్నీ తీసివేయి"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"విభజన స్క్రీన్ను ఉపయోగించడానికి ఇక్కడ లాగండి"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"యాప్లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"సమతలంగా విభజించు"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"లంబంగా విభజించు"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"అనుకూలంగా విభజించు"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ఇప్పుడు ఆఫ్ చేయండి"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"విస్తరింపజేయండి"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"కుదించండి"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"పరికరం అవుట్పుట్ని మార్చండి"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"స్క్రీన్ పిన్ చేయబడింది"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు హోమ్ని తాకి & అలాగే పట్టుకోండి."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి స్థూలదృష్టిని తాకి & అలాగే పట్టుకోండి."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి హోమ్ని తాకి & అలాగే పట్టుకోండి."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్లను తాకి & అలాగే పట్టుకోండి"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు హోమ్ బటన్లను తాకి & అలాగే పట్టుకోండి"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"అర్థమైంది"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"వద్దు, ధన్యవాదాలు"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"స్క్రీన్ పిన్ చేయబడింది"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"స్క్రీన్ అన్పిన్ చేయబడింది"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ని దాచాలా?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"మీరు సెట్టింగ్ల్లో దీన్ని ఆన్ చేసిన తదుపరిసారి ఇది కనిపిస్తుంది."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"దాచు"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. వైబ్రేట్ అయ్యేలా సెట్ చేయడం కోసం నొక్కండి."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. మ్యూట్ చేయడానికి నొక్కండి."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s వాల్యూమ్ నియంత్రణలు చూపబడ్డాయి. తీసివేయడానికి పైకి స్వైప్ చేయండి."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"వాల్యూమ్ నియంత్రణలు దాచబడ్డాయి"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s వాల్యూమ్ నియంత్రణలు"</string> <string name="output_title" msgid="5355078100792942802">"మీడియా అవుట్పుట్"</string> <string name="output_calls_title" msgid="8717692905017206161">"ఫోన్ కాల్ అవుట్పుట్"</string> <string name="output_none_found" msgid="5544982839808921091">"పరికరాలు ఏవీ కనుగొనబడలేదు"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"క్లిప్బోర్డ్"</item> <item msgid="5742013440802239414">"కీకోడ్"</item> - <item msgid="8802889973626281575">"కీబోర్డ్ స్విచర్"</item> - <item msgid="7095517796293767867">"భ్రమణ సూచన"</item> - <item msgid="8494159969042135235">"ఏదీ కాదు"</item> + <item msgid="1951959982985094069">"భ్రమణం నిర్ధారణ, కీబోర్డ్ స్విచర్"</item> + <item msgid="8175437057325747277">"ఏదీ వద్దు"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"సాధారణం"</item> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index ac4fbc9ef324..a64ec0a33b53 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"เปิดกล้อง"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"เลือกรูปแบบงานใหม่"</string> <string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ไอคอนแอปพลิเคชัน"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"พื้นที่ข้อความช่วยเหลือ"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ปุ่มซูมที่ใช้งานร่วมกันได้"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ซูมหน้าจอให้มีขนาดใหญ่ขึ้น"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"เชื่อมต่อบลูทูธแล้ว"</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ชั้นแสดงของหวาน"</string> <string name="start_dreams" msgid="5640361424498338327">"โปรแกรมรักษาหน้าจอ"</string> <string name="ethernet_label" msgid="7967563676324087464">"อีเทอร์เน็ต"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ห้ามรบกวน"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"เฉพาะเรื่องสำคัญ"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"เฉพาะปลุกเท่านั้น"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ปิด WiFi"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi เปิดอยู่"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ไม่มีเครือข่าย Wi-Fi พร้อมใช้งาน"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"การปลุก"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"แคสต์"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"กำลังส่ง"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"อุปกรณ์ที่ไม่มีชื่อ"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"กำลังเชื่อมต่อ..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"การปล่อยสัญญาณ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ฮอตสปอต"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"กำลังเปิด..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">อุปกรณ์ %d เครื่อง</item> + <item quantity="one">อุปกรณ์ %d เครื่อง</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"การแจ้งเตือน"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ไฟฉาย"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"อินเทอร์เน็ตมือถือ"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"ใช้ไปแล้ว <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ขีดจำกัด <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"คำเตือน <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"โปรไฟล์งาน"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"การแจ้งเตือนและแอปปิดอยู่"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"แสงตอนกลางคืน"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"เปิดตอนพระอาทิตย์ตก"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"จนพระอาทิตย์ขึ้น"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ปิดใช้ในโหมดปลอดภัย"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"ล้างทั้งหมด"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"ลากมาที่นี่เพื่อใช้การแยกหน้าจอ"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"แยกในแนวนอน"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"แยกในแนวตั้ง"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"แยกแบบกำหนดเอง"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ปิดเลย"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"ขยาย"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ยุบ"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"เปลี่ยนอุปกรณ์เอาต์พุต"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ตรึงหน้าจอแล้ว"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"หน้าแรก\" ค้างไว้"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"รับทราบ"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"ไม่เป็นไร ขอบคุณ"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"ตรึงหน้าจอแล้ว"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"เลิกตรึงหน้าจอแล้ว"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ซ่อน <xliff:g id="TILE_LABEL">%1$s</xliff:g> ไหม"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"จะปรากฏอีกครั้งเมื่อคุณเปิดใช้ในการตั้งค่าครั้งถัดไป"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ซ่อน"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s แตะเพื่อตั้งค่าให้สั่น"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s แตะเพื่อปิดเสียง"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ตัวควบคุมระดับเสียงแสดงอยู่ เลื่อนขึ้นเพื่อปิด"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ตัวควบคุมระดับเสียงซ่อนอยู่"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"ตัวควบคุมระดับเสียง %s"</string> <string name="output_title" msgid="5355078100792942802">"เอาต์พุตสื่อ"</string> <string name="output_calls_title" msgid="8717692905017206161">"เอาต์พุตการโทรออก"</string> <string name="output_none_found" msgid="5544982839808921091">"ไม่พบอุปกรณ์"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"ส่วนควบคุมการแจ้งเตือนแบบเปิด/ปิดช่วยให้คุณตั้งค่าระดับความสำคัญสำหรับการแจ้งเตือนของแอปได้ตั้งแต่ระดับ 0-5 \n\n"<b>"ระดับ 5"</b>" \n- แสดงที่ด้านบนของรายการแจ้งเตือน \n- อนุญาตให้รบกวนแบบเต็มหน้าจอ \n- อนุญาตให้แสดงชั่วครู่ \n\n"<b>"ระดับ 4"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- แสดงชั่วครู่เสมอ \n\n"<b>"ระดับ 3"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n\n"<b>"ระดับ 2"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n\n"<b>"ระดับ 1"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n- ซ่อนจากหน้าจอล็อกและแถบสถานะ \n- แสดงที่ด้านล่างของรายการแจ้งเตือน \n\n"<b>"ระดับ 0"</b>" \n- บล็อกการแจ้งเตือนทั้งหมดจากแอป"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"การแจ้งเตือน"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"คุณจะไม่เห็นการแจ้งเตือนเหล่านี้อีก"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"แสดงต่อไป"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"คลิปบอร์ด"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"ปุ่มสลับแป้นพิมพ์"</item> - <item msgid="7095517796293767867">"คำแนะนำในการหมุน"</item> - <item msgid="8494159969042135235">"ไม่มี"</item> + <item msgid="1951959982985094069">"การยืนยันการหมุน, ปุ่มสลับแป้นพิมพ์"</item> + <item msgid="8175437057325747277">"ไม่มี"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"ปกติ"</item> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 97e332b145b9..081b40f509a1 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"buksan ang camera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Pumili ng bagong layout ng gawain"</string> <string name="cancel" msgid="6442560571259935130">"Kanselahin"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icon ng application"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Lugar ng mensahe ng tulong"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Button ng zoom ng pagiging tugma."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Mag-zoom nang mas maliit sa mas malaking screen."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Nakakonekta ang Bluetooth."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Huwag istorbohin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priyoridad lang"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Mga alarm lang"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Naka-off ang Wi-Fi"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Naka-on Ang Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Walang available na mga Wi-Fi network"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"I-cast"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Nagka-cast"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Walang pangalang device"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Kumokonekta..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Nagte-tether"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ino-on..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="one">%d device</item> + <item quantity="other">%d na device</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Mga Notification"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flashlight"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ang nagamit"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ang limitasyon"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Babala sa <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profile sa trabaho"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Naka-off ang mga notification at app"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Night Light"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Mao-on sa sunset"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hanggang mag-umaga"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Naka-disable ang <xliff:g id="APP">%s</xliff:g> sa safe-mode."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"I-clear lahat"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"I-drag dito upang magamit ang split screen"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"I-off na ngayon"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Palawakin"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"I-collapse"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Lumipat ng output device"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Naka-pin ang screen"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Home upang mag-unpin."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Overview upang mag-unpin."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Home upang mag-unpin."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Overview"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Home"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Nakuha ko"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Hindi, salamat na lang"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Na-pin ang screen"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Na-unpin ang screen"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Itago ang <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Lalabas itong muli sa susunod na pagkakataon na i-on mo ito sa mga setting."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Itago"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. I-tap upang itakda na mag-vibrate."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. I-tap upang i-mute."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ipinapakita ang mga kontrol ng volume ng %s. Mag-swipe pataas upang i-dismiss."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Nakatago ang mga kontrol ng volume"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Mga kontrol ng volume ng %s"</string> <string name="output_title" msgid="5355078100792942802">"Output ng media"</string> <string name="output_calls_title" msgid="8717692905017206161">"Output ng tawag sa telepono"</string> <string name="output_none_found" msgid="5544982839808921091">"Walang nakitang device"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Sa pamamagitan ng mga kontrol sa notification ng power, magagawa mong itakda ang antas ng kahalagahan ng mga notification ng isang app mula 0 hanggang 5. \n\n"<b>"Antas 5"</b>" \n- Ipakita sa itaas ng listahan ng notification \n- Payagan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 4"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 3"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n\n"<b>"Antas 2"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n\n"<b>"Antas 1"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n- Itago sa lock screen at status bar \n- Ipakita sa ibaba ng listahan ng notification \n\n"<b>"Antas 0"</b>" \n- I-block ang lahat ng notification mula sa app"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Mga Notification"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Hindi mo na makikita ang mga notification na ito"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Patuloy na ipakita"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Clipboard"</item> <item msgid="5742013440802239414">"Keycode"</item> - <item msgid="8802889973626281575">"Keyboard switcher"</item> - <item msgid="7095517796293767867">"Suhestyon sa pag-rotate"</item> - <item msgid="8494159969042135235">"Wala"</item> + <item msgid="1951959982985094069">"Pagkumpirma ng pag-rotate, keyboard switcher"</item> + <item msgid="8175437057325747277">"Wala"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Karaniwan"</item> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 9adc14150c7f..92c42ec2041b 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"kamerayı aç"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yeni görev düzenini seçin"</string> <string name="cancel" msgid="6442560571259935130">"İptal"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Uygulama simgesi"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı alanı"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Tatlı Kutusu"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekran koruyucu"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Rahatsız etmeyin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnızca öncelikliler"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnızca alarmlar"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Kablosuz Kapalı"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kablosuz Bağlantı Açık"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Kullanılabilir kablosuz ağ yok"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayınla"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Yayınlanıyor"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>, güvenli modda devre dışıdır."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tümünü temizle"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölünmüş olarak kullanmak için burayı sürükleyin"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Yatay Ayırma"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dikey Ayırma"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Özel Ayırma"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Şimdi kapat"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Genişlet"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Daralt"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Çıkış cihazını değiştir"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran sabitlendi"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Ana sayfaya dokunup basılı tutun."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Genel bakış\'a dokunup basılı tutun."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Ana sayfaya dokunup basılı tutun."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Bu ekranın sabitlemesini kaldırmak için Geri ve Genel Bakış düğmelerine dokunup basılı tutun"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Bu ekranın sabitlemesini kaldırmak için Geri ve Ana sayfa düğmelerine dokunup basılı tutun"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Hayır, teşekkürler"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran sabitlendi"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran sabitlemesi kaldırıldı"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlensin mi?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlardan etkinleştirdiğiniz bir sonraki sefer tekrar görünür."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizle"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Titreşime ayarlamak için dokunun."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sesi kapatmak için dokunun."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ses denetimleri gösteriliyor. Kapatmak için hızlıca yukarı kaydırın."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ses denetimleri gizlendi"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s ses denetimleri"</string> <string name="output_title" msgid="5355078100792942802">"Medya çıkışı"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefon çağrısı çıkışı"</string> <string name="output_none_found" msgid="5544982839808921091">"Cihaz bulunamadı"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Pano"</item> <item msgid="5742013440802239414">"Tuş kodu"</item> - <item msgid="8802889973626281575">"Klavye değiştirici"</item> - <item msgid="7095517796293767867">"Rotasyon önerisi"</item> - <item msgid="8494159969042135235">"Yok"</item> + <item msgid="1951959982985094069">"Döndürmeyi onayla, klavye değiştirici"</item> + <item msgid="8175437057325747277">"Yok"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Normal"</item> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 38347531fa05..4b34e253f1fb 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -105,6 +105,8 @@ <string name="camera_label" msgid="7261107956054836961">"відкрити камеру"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string> <string name="cancel" msgid="6442560571259935130">"Скасувати"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок додатка"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Область довідкового повідомлення"</string> @@ -278,6 +280,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Вітрина десертів"</string> <string name="start_dreams" msgid="5640361424498338327">"Заставка"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбувати"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Лише пріоритетні"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Лише будильник"</string> @@ -314,8 +318,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi вимкнено"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi увімкнено"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Немає доступних мереж Wi-Fi"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будильник"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляція"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string> @@ -367,7 +370,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"Додаток <xliff:g id="APP">%s</xliff:g> вимкнено в безпечному режимі."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистити все"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетягніть сюди, щоб увімкнути режим розділеного екрана"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Проводьте пальцем угору, щоб переходити між додатками"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Розділити горизонтально"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Розділити вертикально"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Розділити (власний варіант)"</string> @@ -511,21 +513,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Увімкніть пристрій виведення"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Екран закріплено"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\"."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопку \"Огляд\"."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопку \"Головний екран\"."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Щоб відкріпити цей екран, натисніть і утримуйте кнопки \"Назад\" та \"Огляд\""</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Щоб відкріпити цей екран, натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\""</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Зрозуміло"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Ні, дякую"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Екран закріплено"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Екран відкріплено"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сховати <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"З’явиться знову, коли ви ввімкнете його в налаштуваннях."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сховати"</string> @@ -548,8 +544,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Торкніться, щоб налаштувати вібросигнал."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Торкніться, щоб вимкнути звук."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показано регуляторів гучності: %s. Проведіть пальцем угору, щоб закрити."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регулятори гучності сховано"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Регуляторів гучності: %s"</string> <string name="output_title" msgid="5355078100792942802">"Вивід медіа-вмісту"</string> <string name="output_calls_title" msgid="8717692905017206161">"Вивід телефонного виклику"</string> <string name="output_none_found" msgid="5544982839808921091">"Пристроїв не знайдено"</string> @@ -703,9 +698,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Буфер обміну"</item> <item msgid="5742013440802239414">"Код клавіші"</item> - <item msgid="8802889973626281575">"Вибір клавіатури"</item> - <item msgid="7095517796293767867">"Пропозиція щодо обертання"</item> - <item msgid="8494159969042135235">"Немає"</item> + <item msgid="1951959982985094069">"Підтвердити обертання, вибір клавіатури"</item> + <item msgid="8175437057325747277">"Немає"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Звичайна панель"</item> diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index 9ebdfeb0c0b5..2c01bf903f10 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"کیمرا کھولیں"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string> <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ایپلیکیشن کا آئیکن"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"امدادی پیغام کا علاقہ"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"ڈیزرٹ کیس"</string> <string name="start_dreams" msgid="5640361424498338327">"اسکرین سیور"</string> <string name="ethernet_label" msgid="7967563676324087464">"ایتھرنیٹ"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"ڈسٹرب نہ کریں"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"صرف ترجیحی"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"صرف الارمز"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi آف ہے"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi آن ہے"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"کوئی WI-FI نیٹ ورک دستیاب نہیں"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"الارم"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"کاسٹ کریں"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"کاسٹنگ"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"بغیر نام والا آلہ"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"محفوظ موڈ میں <xliff:g id="APP">%s</xliff:g> غیر فعال ہوتی ہے۔"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"سبھی کو صاف کریں"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"اسپلٹ اسکرین استعمال کرنے کیلئے یہاں گھسیٹیں"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"بلحاظ افقی الگ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"بلحاظ عمودی الگ کریں"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"بلحاظ حسب ضرورت الگ کریں"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"ابھی بند کریں"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"پھیلائیں"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"سکیڑیں"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"آؤٹ پٹ آلہ سوئچ کریں"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"اسکرین پن کردہ ہے"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے مجموعی جائزہ بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"ہوم\" بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"اس اسکرین سے پن ہٹانے کیلئے، \"پیچھے\" اور \"مجموعی جائزہ\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"اس اسکرین سے پن ہٹانے کیلئے، \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"سمجھ آ گئی"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"نہیں شکریہ"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"اسکرین کو پن کر دیا گیا"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"اسکرین کا پن ہٹا دیا گیا"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> کو چھپائیں؟"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"اگلی بار جب آپ اسے ترتیبات میں آن کریں گے تو یہ ظاہر ہوگی۔"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"چھپائیں"</string> @@ -541,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s والیوم کے کنٹرولز دکھائے جا رہے ہیں۔ برخاست کرنے کیلئے سوائپ کریں۔"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"والیوم کے کنٹرولز مخفی ہیں"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s والیوم کے کنٹرولز"</string> <string name="output_title" msgid="5355078100792942802">"میڈیا آؤٹ پٹ"</string> <string name="output_calls_title" msgid="8717692905017206161">"فون کال کا آؤٹ پٹ"</string> <string name="output_none_found" msgid="5544982839808921091">"کوئی آلہ نہیں ملا"</string> @@ -692,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"کلپ بورڈ"</item> <item msgid="5742013440802239414">"کی کوڈ"</item> - <item msgid="8802889973626281575">"کی بورڈ سوئچر"</item> - <item msgid="7095517796293767867">"گردش کی تجویز"</item> - <item msgid="8494159969042135235">"کوئی نہیں"</item> + <item msgid="1951959982985094069">"گردش کی تصدیق، کی بورڈ سوئچر"</item> + <item msgid="8175437057325747277">"کوئی نہیں"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"حسب معمول"</item> diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 0279d16770a0..e308ed3d88ad 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"kamerani ochish"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Yangi vazifa tartibini tanlash"</string> <string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ilova ikonkasi"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yordam xabari"</string> @@ -274,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"Ekran lavhasi"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Bezovta qilinmasin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Faqat muhimlari"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Faqat signallar"</string> @@ -534,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tebranishni yoqish uchun ustiga bosing."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ovozsiz qilish uchun ustiga bosing."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovoz balandligini boshqarish tugmalari ko‘rsatilgan: %s. Yopish uchun tepaga suring."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovoz balandligini boshqarish tugmalari yashirilgan"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s tovush balandligi tugmalari"</string> <string name="output_title" msgid="5355078100792942802">"Media chiqishi"</string> <string name="output_calls_title" msgid="8717692905017206161">"Telefon chaqiruvlari"</string> <string name="output_none_found" msgid="5544982839808921091">"Hech qanday qurilma topilmadi"</string> @@ -685,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Vaqtinchalik xotira"</item> <item msgid="5742013440802239414">"Tugma kodi"</item> - <item msgid="8802889973626281575">"Klaviaturani almashtirish"</item> - <item msgid="7095517796293767867">"Burilish"</item> - <item msgid="8494159969042135235">"Hech biri"</item> + <item msgid="1951959982985094069">"Burishni tasdiqlash, klaviaturani almashtirish"</item> + <item msgid="8175437057325747277">"Hech biri"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Odatiy"</item> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 83bcae5c2277..67bba1d66aea 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"mở máy ảnh"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Chọn bố cục tác vụ mới"</string> <string name="cancel" msgid="6442560571259935130">"Hủy"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Biểu tượng ứng dụng"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Vùng thông báo trợ giúp"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Nút thu phóng khả năng tương thích."</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Thu phóng màn hình lớn hơn hoặc nhỏ hơn."</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Đã kết nối bluetooth."</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Tủ trưng bày bánh ngọt"</string> <string name="start_dreams" msgid="5640361424498338327">"Trình bảo vệ m.hình"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Không làm phiền"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Chỉ ưu tiên"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Chỉ báo thức"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Tắt Wi-Fi"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi đang bật"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Không có mạng Wi-Fi"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Báo thức"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Truyền"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Đang truyền"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Thiết bị không có tên"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"Đang kết nối..."</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Đang dùng làm điểm truy cập Internet"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Đang bật..."</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d thiết bị</item> + <item quantity="one">%d thiết bị</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Thông báo"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Đèn pin"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dữ liệu di động"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Đã sử dụng <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Giới hạn <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Cảnh báo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Hồ sơ công việc"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Thông báo và ứng dụng đã tắt"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"Đèn đọc sách"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Bật khi trời tối"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Cho đến khi trời sáng"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> bị tắt ở chế độ an toàn."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Xóa tất cả"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Kéo vào đây để sử dụng chế độ chia đôi màn hình"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Phân tách ngang"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Phân tách dọc"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tùy chỉnh phân tách"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"Tắt ngay bây giờ"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"Mở rộng"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Thu gọn"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"Chuyển đổi thiết bị đầu ra"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Màn hình được ghim"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim."</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Quay lại và nút Màn hình chính để bỏ ghim."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Tổng quan để bỏ ghim."</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Màn hình chính để bỏ ghim."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Để bỏ ghim màn hình này, hãy chạm và giữ nút Quay lại và nút Tổng quan"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Để bỏ ghim màn hình này, hãy chạm và giữ nút Quay lại và nút Màn hình chính"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ok"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Không, cảm ơn"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"Đã ghim màn hình"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Đã bỏ ghim màn hình"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ẩn <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Thông báo này sẽ xuất hiện lại vào lần tiếp theo bạn bật thông báo trong cài đặt."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ẩn"</string> @@ -529,10 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Nhấn để đặt chế độ rung."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Nhấn để tắt tiếng."</string> - <!-- String.format failed for translation --> - <!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) --> - <skip /> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Các điều khiển âm lượng bị ẩn"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"Điều khiển âm lượng %s"</string> <string name="output_title" msgid="5355078100792942802">"Đầu ra phương tiện"</string> <string name="output_calls_title" msgid="8717692905017206161">"Đầu ra cuộc gọi điệnt thoại"</string> <string name="output_none_found" msgid="5544982839808921091">"Không tìm thấy thiết bị nào"</string> @@ -588,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"Với các kiểm soát thông báo nguồn, bạn có thể đặt cấp độ quan trọng từ 0 đến 5 cho các thông báo của ứng dụng. \n\n"<b>"Cấp 5"</b>" \n- Hiển thị ở đầu danh sách thông báo \n- Cho phép gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 4"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 3"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n\n"<b>"Cấp 2"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n\n"<b>"Cấp 1"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n- Ẩn khỏi màn hình khóa và thanh trạng thái \n- Hiển thị ở cuối danh sách thông báo \n\n"<b>"Cấp 0"</b>" \n- Chặn tất cả các thông báo từ ứng dụng"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"Thông báo"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"Bạn sẽ không thấy các thông báo này nữa"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"Tiếp tục hiển thị"</string> @@ -680,13 +683,7 @@ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"Loại nút bổ sung bên trái"</string> <string name="right_nav_bar_button_type" msgid="2481056627065649656">"Loại nút bổ sung bên phải"</string> <string name="nav_bar_default" msgid="8587114043070993007">"(mặc định)"</string> - <string-array name="nav_bar_buttons"> - <item msgid="1545641631806817203">"Khay nhớ tạm"</item> - <item msgid="5742013440802239414">"Mã phím"</item> - <item msgid="8802889973626281575">"Trình chuyển đổi bàn phím"</item> - <item msgid="7095517796293767867">"Đề xuất xoay"</item> - <item msgid="8494159969042135235">"Không có"</item> - </string-array> + <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) --> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Bình thường"</item> <item msgid="8256205964297588988">"Cao"</item> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 559b2ea780e4..ba25a2bbd074 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"打开相机"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"选择新的任务布局"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"应用图标"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"帮助消息区域"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"兼容性缩放按钮。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"将小屏幕的图片放大在较大屏幕上显示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"蓝牙已连接。"</string> @@ -275,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"甜品盒"</string> <string name="start_dreams" msgid="5640361424498338327">"屏保"</string> <string name="ethernet_label" msgid="7967563676324087464">"有线网络"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"勿扰"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"仅限优先事项"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"仅限闹钟"</string> @@ -311,6 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WLAN:关闭"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN 已开启"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"没有 WLAN 网络"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"闹钟"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"投射"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"正在投射"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名设备"</string> @@ -327,9 +329,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"正在开启…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d 台设备</item> + <item quantity="one">%d 台设备</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手电筒"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"移动数据"</string> @@ -339,10 +343,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用<xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限为<xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g>警告"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"工作资料"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知和应用均已关闭"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"夜间模式"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落时开启"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出时关闭"</string> @@ -360,8 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>已在安全模式下停用。"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"在此处拖动即可使用分屏功能"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自定义分割"</string> @@ -502,11 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"立即关闭"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"展开"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"收起"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"切换输出设备"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"已固定屏幕"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“概览”即可取消固定屏幕。"</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“主屏幕”即可取消固定屏幕。"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“概览”即可取消固定屏幕。"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“主屏幕”即可取消固定屏幕。"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"要取消固定此屏幕,请触摸并按住“返回”和“概览”按钮"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"要取消固定此屏幕,请触摸并按住“返回”和“主屏幕”按钮"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"不用了"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"已固定屏幕"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定屏幕"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"要隐藏“<xliff:g id="TILE_LABEL">%1$s</xliff:g>”吗?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下次在设置中将其开启后,此快捷设置条目将会重新显示。"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隐藏"</string> @@ -529,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。点按即可设为振动。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。点按即可设为静音。"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已显示%s音量控件。向上滑动即可关闭。"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隐藏音量控件"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控件"</string> <string name="output_title" msgid="5355078100792942802">"媒体输出"</string> <string name="output_calls_title" msgid="8717692905017206161">"通话输出"</string> <string name="output_none_found" msgid="5544982839808921091">"未找到任何设备"</string> @@ -586,8 +592,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"利用高级通知设置,您可以为应用通知设置从 0 级到 5 级的重要程度等级。\n\n"<b>"5 级"</b>" \n- 在通知列表顶部显示 \n- 允许全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"4 级"</b>" \n- 禁止全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"3 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n\n"<b>"2 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n\n"<b>"1 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n- 不在锁定屏幕和状态栏中显示 \n- 在通知列表底部显示 \n\n"<b>"0 级"</b>" \n- 屏蔽应用的所有通知"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"您将不会再看到这些通知"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"继续显示"</string> @@ -681,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"剪贴板"</item> <item msgid="5742013440802239414">"键码"</item> - <item msgid="8802889973626281575">"键盘切换器"</item> - <item msgid="7095517796293767867">"旋转建议"</item> - <item msgid="8494159969042135235">"无"</item> + <item msgid="1951959982985094069">"确认旋转、键盘切换器"</item> + <item msgid="8175437057325747277">"无"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"一般"</item> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 0283092b4452..5c56bbffb598 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -103,12 +103,11 @@ <string name="camera_label" msgid="7261107956054836961">"開啟相機"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新的工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> - <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) --> - <skip /> - <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) --> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> <skip /> + <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> + <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"應用程式圖示"</string> + <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"說明訊息區域"</string> <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string> <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較小螢幕的畫面放大在較大螢幕上顯示。"</string> <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"藍牙連線已建立。"</string> @@ -277,6 +276,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string> <string name="ethernet_label" msgid="7967563676324087464">"以太網"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"請勿騷擾"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"只限優先"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"只限鬧鐘"</string> @@ -313,6 +314,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 關閉"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 已開啟"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有可用的 Wi-Fi 網絡"</string> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"鬧鐘"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"正在放送"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string> @@ -329,9 +331,11 @@ <string name="quick_settings_connecting" msgid="47623027419264404">"正在連線…"</string> <string name="quick_settings_tethering_label" msgid="7153452060448575549">"網絡共享"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"熱點"</string> - <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) --> - <skip /> - <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) --> + <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"正在開啟…"</string> + <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428"> + <item quantity="other">%d 部裝置</item> + <item quantity="one">%d 部裝置</item> + </plurals> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"閃光燈"</string> <string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"流動數據"</string> @@ -341,10 +345,8 @@ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用 <xliff:g id="DATA_USED">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限為 <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string> <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string> - <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) --> - <skip /> - <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) --> - <skip /> + <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"工作設定檔"</string> + <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知和應用程式已關閉"</string> <string name="quick_settings_night_display_label" msgid="3577098011487644395">"夜燈模式"</string> <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落時開啟"</string> <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出時關閉"</string> @@ -362,8 +364,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」已在安全模式中停用。"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"在這裡拖曳即可分割螢幕"</string> - <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) --> - <skip /> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string> @@ -504,11 +504,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"立即關閉"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"切換輸出裝置"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"畫面將會繼續顯示,直至您取消固定。按住 [返回] 和 [概覽] 即可取消固定。"</string> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"畫面將會繼續顯示,直至您取消固定為止。按住 [返回] 按鈕和主按鈕即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"畫面將會繼續顯示,直至您取消固定。按住 [概覽] 即可取消固定。"</string> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"畫面將會繼續顯示,直至您取消固定為止。按住主按鈕即可取消固定。"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"如要取消固定此畫面,請按住 [返回] 按鈕和 [概覽] 按鈕"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"如要取消固定此畫面,請按住 [返回] 按鈕和主按鈕"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"不用了,謝謝"</string> + <string name="screen_pinning_start" msgid="1022122128489278317">"已固定畫面"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定畫面"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏 <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下一次您在設定開啟它時,它將再次出現。"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string> @@ -531,8 +538,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕按即可設為震動。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕按即可設為靜音。"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 音量控制項。向上快速滑動即可關閉。"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控制項"</string> <string name="output_title" msgid="5355078100792942802">"媒體輸出"</string> <string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string> <string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string> @@ -588,8 +594,7 @@ <string name="power_notification_controls_description" msgid="4372459941671353358">"通知控制項讓您設定應用程式通知的重要性 (0 至 5 級)。\n\n"<b>"第 5 級"</b>" \n- 在通知清單頂部顯示 \n- 允許全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 4 級"</b>" \n- 阻止全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 3 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n\n"<b>"第 2 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n\n"<b>"第 1 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n- 從上鎖畫面和狀態列中隱藏 \n- 在通知清單底部顯示 \n\n"<b>"第 0 級"</b>" \n- 封鎖所有應用程式通知"</string> <string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string> <string name="notification_channel_disabled" msgid="344536703863700565">"您不會再看到這些通知"</string> - <!-- no translation found for inline_blocking_helper (3055064577771478591) --> - <skip /> + <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> <string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string> @@ -683,9 +688,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"剪貼簿"</item> <item msgid="5742013440802239414">"按鍵碼"</item> - <item msgid="8802889973626281575">"鍵盤切換工具"</item> - <item msgid="7095517796293767867">"旋轉建議"</item> - <item msgid="8494159969042135235">"無"</item> + <item msgid="1951959982985094069">"確認旋轉、鍵盤切換工具"</item> + <item msgid="8175437057325747277">"無"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"一般"</item> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 9c425b0b85e5..ffc5b6d34afc 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"開啟攝影機"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"應用程式圖示"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"說明訊息區域"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> <string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string> <string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先通知"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 已關閉"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"已開啟 Wi-Fi"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有 Wi-Fi 網路"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"鬧鐘"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」在安全模式中為停用狀態。"</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"拖曳到這裡即可使用分割畫面"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑動即可切換應用程式"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string> @@ -500,25 +502,18 @@ <string name="volume_zen_end_now" msgid="6930243045593601084">"立即停用"</string> <string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string> <string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string> - <!-- no translation found for accessibility_output_chooser (8185317493017988680) --> - <skip /> + <string name="accessibility_output_chooser" msgid="8185317493017988680">"切換輸出裝置"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。"</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住 [返回] 按鈕和主螢幕按鈕即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。"</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住主螢幕按鈕即可取消固定。"</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"如要取消固定這個螢幕畫面,請按住「返回」按鈕和「總覽」按鈕"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"如要取消固定這個螢幕畫面,請按住「返回」按鈕和主螢幕按鈕"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"不用了,謝謝"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"已固定螢幕畫面"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定螢幕畫面"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string> @@ -541,8 +536,13 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕觸即可設為震動。"</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕觸即可設為靜音。"</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 個音量控制項。向上滑動即可關閉。"</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制項"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"「%s」音量控制項"</string> + <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) --> + <skip /> + <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) --> + <skip /> <string name="output_title" msgid="5355078100792942802">"媒體輸出"</string> <string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string> <string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string> @@ -692,9 +692,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"剪貼簿"</item> <item msgid="5742013440802239414">"按鍵碼"</item> - <item msgid="8802889973626281575">"鍵盤切換工具"</item> - <item msgid="7095517796293767867">"旋轉建議"</item> - <item msgid="8494159969042135235">"無"</item> + <item msgid="1951959982985094069">"確認旋轉,鍵盤切換工具"</item> + <item msgid="8175437057325747277">"無"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"一般"</item> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index d291a198f843..1195ebc33818 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -103,6 +103,8 @@ <string name="camera_label" msgid="7261107956054836961">"vula ikhamera"</string> <string name="recents_caption_resize" msgid="3517056471774958200">"Khetha isakhiwo somsebenzi omusha"</string> <string name="cancel" msgid="6442560571259935130">"Khansela"</string> + <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) --> + <skip /> <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string> <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Isithonjana sohlelo lokusebenza"</string> <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Indawo yosizo lomlayezo"</string> @@ -272,6 +274,8 @@ <string name="dessert_case" msgid="1295161776223959221">"Isikhwama soswidi"</string> <string name="start_dreams" msgid="5640361424498338327">"Isigcini sihenqo"</string> <string name="ethernet_label" msgid="7967563676324087464">"I-Ethernet"</string> + <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) --> + <skip /> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ungaphazamisi"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Okubalulekile kuphela"</string> <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ama-alamu kuphela"</string> @@ -308,8 +312,7 @@ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"I-Wi-Fi icimile"</string> <string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"I-Wi-Fi ivuliwe"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Awekho amanethiwekhi we-Wi-Fi atholakalayo"</string> - <!-- no translation found for quick_settings_alarm_title (2416759007342260676) --> - <skip /> + <string name="quick_settings_alarm_title" msgid="2416759007342260676">"I-alamu"</string> <string name="quick_settings_cast_title" msgid="7709016546426454729">"Abalingisi"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Ukusakaza"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Idivayisi engenalo igama"</string> @@ -359,7 +362,6 @@ <string name="recents_launch_disabled_message" msgid="1624523193008871793">"I-<xliff:g id="APP">%s</xliff:g> ikhutshaziwe kumodi yokuphepha."</string> <string name="recents_stack_action_button_label" msgid="6593727103310426253">"Sula konke"</string> <string name="recents_drag_hint_message" msgid="2649739267073203985">"Hudulela lapha ukuze usebenzise ukuhlukanisa kwesikrini"</string> - <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza"</string> <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Hlukanisa okuvundlile"</string> <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Hlukanisa okumile"</string> <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Hlukanisa kwezifiso"</string> @@ -503,21 +505,15 @@ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Shintsha idivayisi yokukhipha"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Isikrini siphiniwe"</string> <string name="screen_pinning_description" msgid="8909878447196419623">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina."</string> - <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) --> - <skip /> + <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Lokhu kuyigcina ibonakala uze uyisuse. Thinta uphinde ubambe okuthi Emuva nokuthi Ekhaya ukuze ususe ukuphina."</string> <string name="screen_pinning_description_accessible" msgid="426190689254018656">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe Ukubuka konke ukuze ususe ukuphina."</string> - <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) --> - <skip /> - <!-- no translation found for screen_pinning_toast (2266705122951934150) --> - <skip /> - <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) --> - <skip /> + <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Ekhaya ukuze ususe ukuphina."</string> + <string name="screen_pinning_toast" msgid="2266705122951934150">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe izinkinobho zokubuyela emuva nezokubuka konke"</string> + <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe izinkinobho nezithi Emuva nethi Ekhaya"</string> <string name="screen_pinning_positive" msgid="3783985798366751226">"Ngiyitholile"</string> <string name="screen_pinning_negative" msgid="3741602308343880268">"Cha ngiyabonga"</string> - <!-- no translation found for screen_pinning_start (1022122128489278317) --> - <skip /> - <!-- no translation found for screen_pinning_exit (5187339744262325372) --> - <skip /> + <string name="screen_pinning_start" msgid="1022122128489278317">"Isikrini siphiniwe"</string> + <string name="screen_pinning_exit" msgid="5187339744262325372">"Isikrini sisuswe ukuphina"</string> <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fihla i-<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string> <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Izovela ngesikhathi esilandelayo uma uvule lesi silungiselelo."</string> <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fihla"</string> @@ -540,8 +536,7 @@ <string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string> <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Thepha ukuze usethele ekudlidlizeni."</string> <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Thepha ukuze uthulise."</string> - <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s izilawuli zevolumu ziyaboniswa. Swayiphela phezulu ukuze ulahle."</string> - <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Izilawuli zevolumi zifihliwe"</string> + <string name="volume_dialog_title" msgid="7272969888820035876">"%s izilawuli zevolomu"</string> <string name="output_title" msgid="5355078100792942802">"Okukhiphayo kwemidiya"</string> <string name="output_calls_title" msgid="8717692905017206161">"Okukhiphayo kwekholi yefoni"</string> <string name="output_none_found" msgid="5544982839808921091">"Awekho amadivayisi atholiwe"</string> @@ -691,9 +686,8 @@ <string-array name="nav_bar_buttons"> <item msgid="1545641631806817203">"Ibhodi lokumanathisela"</item> <item msgid="5742013440802239414">"Ikhodi yokhiye"</item> - <item msgid="8802889973626281575">"Isishintshi sekhibhodi"</item> - <item msgid="7095517796293767867">"Isiphakamiso sokuzungezisa"</item> - <item msgid="8494159969042135235">"Lutho"</item> + <item msgid="1951959982985094069">"Qinisekisa ukuzungezisa, isishintshi sekhibhodi"</item> + <item msgid="8175437057325747277">"Akunalutho"</item> </string-array> <string-array name="nav_bar_layouts"> <item msgid="8077901629964902399">"Okujwayelekile"</item> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 627b4bcfc104..dc230d497fc2 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -259,16 +259,28 @@ <dimen name="notification_panel_width">@dimen/match_parent</dimen> + <dimen name="brightness_mirror_height">108dp</dimen> + <!-- The width of the panel that holds the quick settings. --> <dimen name="qs_panel_width">@dimen/notification_panel_width</dimen> <!-- the amount the volume panel should be offset at the end from the view next to it (or - the scren edge, in portrait--> - <dimen name="volume_dialog_base_margin">12dp</dimen> + the screen edge, in portrait--> + <dimen name="volume_dialog_base_margin">8dp</dimen> + + <dimen name="volume_dialog_panel_width">64dp</dimen> + + <dimen name="volume_dialog_slider_height">101dp</dimen> + + <dimen name="volume_dialog_row_height">252dp</dimen> + + <dimen name="volume_dialog_ringer_size">64dp</dimen> - <dimen name="volume_dialog_panel_width">100dp</dimen> + <dimen name="volume_dialog_tap_target_size">48dp</dimen> - <dimen name="output_chooser_panel_width">320dp</dimen> + <dimen name="volume_dialog_spacer">4dp</dimen> + + <dimen name="volume_dialog_slider_margin_top">13dp</dimen> <!-- Gravity for the notification panel --> <integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top --> @@ -290,7 +302,7 @@ <dimen name="qs_tile_height">106dp</dimen> <dimen name="qs_tile_margin">19dp</dimen> - <dimen name="qs_tile_margin_top">32dp</dimen> + <dimen name="qs_tile_margin_top">18dp</dimen> <dimen name="qs_quick_tile_size">48dp</dimen> <dimen name="qs_quick_tile_padding">12dp</dimen> <dimen name="qs_header_gear_translation">16dp</dimen> @@ -309,14 +321,13 @@ <dimen name="qs_tile_padding_bottom">16dp</dimen> <dimen name="qs_tile_spacing">4dp</dimen> <dimen name="qs_panel_padding_bottom">0dp</dimen> - <dimen name="qs_panel_padding_top">32dp</dimen> + <dimen name="qs_panel_padding_top">30dp</dimen> <dimen name="qs_detail_header_height">56dp</dimen> <dimen name="qs_detail_header_padding">0dp</dimen> <dimen name="qs_detail_image_width">56dp</dimen> <dimen name="qs_detail_image_height">56dp</dimen> <dimen name="qs_detail_image_padding">16dp</dimen> <dimen name="qs_detail_item_height">48dp</dimen> - <dimen name="qs_brightness_padding_top">6dp</dimen> <dimen name="qs_detail_header_text_size">20sp</dimen> <dimen name="qs_detail_button_text_size">14sp</dimen> <dimen name="qs_detail_item_primary_text_size">16sp</dimen> @@ -334,9 +345,9 @@ <dimen name="qs_detail_item_icon_width">32dp</dimen> <dimen name="qs_detail_item_icon_marginStart">0dp</dimen> <dimen name="qs_detail_item_icon_marginEnd">20dp</dimen> - <dimen name="qs_header_padding_start">16dp</dimen> - <dimen name="qs_header_padding_end">24dp</dimen> - <dimen name="qs_header_tooltip_height">32dp</dimen> + <dimen name="qs_header_tooltip_height">18dp</dimen> + <dimen name="qs_header_alarm_icon_size">18dp</dimen> + <dimen name="qs_header_alarm_text_margin_start">6dp</dimen> <dimen name="qs_footer_padding_start">16dp</dimen> <dimen name="qs_footer_padding_end">24dp</dimen> <dimen name="qs_footer_icon_size">16dp</dimen> @@ -363,6 +374,9 @@ <!-- Padding between subtitles and the following text in the QSFooter dialog --> <dimen name="qs_footer_dialog_subtitle_padding">20dp</dimen> + <dimen name="seek_bar_height">3dp</dimen> + <dimen name="seek_bar_corner_radius">3dp</dimen> + <!-- Zen mode panel: condition item button padding --> <dimen name="zen_mode_condition_detail_button_padding">8dp</dimen> @@ -427,15 +441,10 @@ <!-- Minimum distance the user has to drag down to go to the full shade. --> <dimen name="keyguard_drag_down_min_distance">100dp</dimen> - <!-- The fraction of the screen height where the clock on the Keyguard has its center. The - max value is used when no notifications are displaying, and the min value is when the - highest possible number of notifications are showing. --> - <fraction name="keyguard_clock_y_fraction_max">45%</fraction> - <fraction name="keyguard_clock_y_fraction_min">19.8%</fraction> - - <!-- The margin between the clock and the notifications on Keyguard. See - keyguard_clock_height_fraction_* for the difference between min and max.--> + <!-- The margin between the clock and the notifications on Keyguard.--> <dimen name="keyguard_clock_notifications_margin">30dp</dimen> + <!-- Minimum margin between clock and top of screen or ambient indication --> + <dimen name="keyguard_clock_top_margin">26dp</dimen> <dimen name="heads_up_scrim_height">250dp</dimen> <item name="scrim_behind_alpha" format="float" type="dimen">0.62</item> @@ -873,9 +882,6 @@ burn-in on AOD --> <dimen name="burn_in_prevention_offset_y">50dp</dimen> - <!-- padding between the notification stack and the keyguard status view when dozing --> - <dimen name="dozing_stack_padding">30dp</dimen> - <dimen name="corner_size">16dp</dimen> <dimen name="top_padding">0dp</dimen> <dimen name="bottom_padding">48dp</dimen> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 71a3ac57f216..920dd98b400a 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1346,6 +1346,10 @@ <string name="volume_dialog_title">%s volume controls</string> + <string name="volume_dialog_ringer_guidance_vibrate">Calls and notifications will vibrate</string> + <string name="volume_dialog_ringer_guidance_silent">Calls and notifications will be muted</string> + <string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring</string> + <string name="output_title">Media output</string> <string name="output_calls_title">Phone call output</string> <string name="output_none_found">No devices found</string> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java index ddd27b0b38ba..a0e7752e13fa 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java @@ -17,15 +17,12 @@ package com.android.systemui.shared.recents.model; import android.content.Context; -import android.content.pm.ActivityInfo; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.HandlerThread; import android.util.Log; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.PackageManagerWrapper; /** * Background task resource loader @@ -40,8 +37,7 @@ class BackgroundTaskLoader implements Runnable { private final Handler mMainThreadHandler; private final TaskResourceLoadQueue mLoadQueue; - private final TaskKeyLruCache<Drawable> mIconCache; - private final BitmapDrawable mDefaultIcon; + private final IconLoader mIconLoader; private boolean mStarted; private boolean mCancelled; @@ -51,11 +47,9 @@ class BackgroundTaskLoader implements Runnable { /** Constructor, creates a new loading thread that loads task resources in the background */ public BackgroundTaskLoader(TaskResourceLoadQueue loadQueue, - TaskKeyLruCache<Drawable> iconCache, BitmapDrawable defaultIcon, - OnIdleChangedListener onIdleChangedListener) { + IconLoader iconLoader, OnIdleChangedListener onIdleChangedListener) { mLoadQueue = loadQueue; - mIconCache = iconCache; - mDefaultIcon = defaultIcon; + mIconLoader = iconLoader; mMainThreadHandler = new Handler(); mOnIdleChangedListener = onIdleChangedListener; mLoadThread = new HandlerThread("Recents-TaskResourceLoader", @@ -140,32 +134,7 @@ class BackgroundTaskLoader implements Runnable { // Load the next item from the queue final Task t = mLoadQueue.nextTask(); if (t != null) { - Drawable cachedIcon = mIconCache.get(t.key); - - // Load the icon if it is stale or we haven't cached one yet - if (cachedIcon == null) { - cachedIcon = ActivityManagerWrapper.getInstance().getBadgedTaskDescriptionIcon( - mContext, t.taskDescription, t.key.userId, mContext.getResources()); - - if (cachedIcon == null) { - ActivityInfo info = PackageManagerWrapper.getInstance().getActivityInfo( - t.key.getComponent(), t.key.userId); - if (info != null) { - if (DEBUG) Log.d(TAG, "Loading icon: " + t.key); - cachedIcon = ActivityManagerWrapper.getInstance().getBadgedActivityIcon( - info, t.key.userId); - } - } - - if (cachedIcon == null) { - cachedIcon = mDefaultIcon; - } - - // At this point, even if we can't load the icon, we will set the - // default icon. - mIconCache.put(t.key, cachedIcon); - } - + final Drawable icon = mIconLoader.getIcon(t); if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key); final ThumbnailData thumbnailData = ActivityManagerWrapper.getInstance().getTaskThumbnail(t.key.id, @@ -173,9 +142,8 @@ class BackgroundTaskLoader implements Runnable { if (!mCancelled) { // Notify that the task data has changed - final Drawable finalIcon = cachedIcon; mMainThreadHandler.post( - () -> t.notifyTaskDataLoaded(thumbnailData, finalIcon)); + () -> t.notifyTaskDataLoaded(thumbnailData, icon)); } } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java new file mode 100644 index 000000000000..3bc1d9a0588c --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.systemui.shared.recents.model; + +import android.app.ActivityManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.os.UserHandle; +import android.util.IconDrawableFactory; +import android.util.Log; +import android.util.LruCache; + +import com.android.systemui.shared.system.PackageManagerWrapper; + +public abstract class IconLoader { + + private static final String TAG = "IconLoader"; + + protected final Context mContext; + protected final TaskKeyLruCache<Drawable> mIconCache; + protected final LruCache<ComponentName, ActivityInfo> mActivityInfoCache; + + public IconLoader(Context context, TaskKeyLruCache<Drawable> iconCache, LruCache<ComponentName, + ActivityInfo> activityInfoCache) { + mContext = context; + mIconCache = iconCache; + mActivityInfoCache = activityInfoCache; + } + + /** + * Returns the activity info for the given task key, retrieving one from the system if the + * task key is expired. + * + * TODO: Move this to an ActivityInfoCache class + */ + public ActivityInfo getAndUpdateActivityInfo(Task.TaskKey taskKey) { + ComponentName cn = taskKey.getComponent(); + ActivityInfo activityInfo = mActivityInfoCache.get(cn); + if (activityInfo == null) { + activityInfo = PackageManagerWrapper.getInstance().getActivityInfo(cn, taskKey.userId); + if (cn == null || activityInfo == null) { + Log.e(TAG, "Unexpected null component name or activity info: " + cn + ", " + + activityInfo); + return null; + } + mActivityInfoCache.put(cn, activityInfo); + } + return activityInfo; + } + + public Drawable getIcon(Task t) { + Drawable cachedIcon = mIconCache.get(t.key); + if (cachedIcon == null) { + cachedIcon = createNewIconForTask(t.key, t.taskDescription, true /* returnDefault */); + mIconCache.put(t.key, cachedIcon); + } + return cachedIcon; + } + + /** + * Returns the cached task icon if the task key is not expired, updating the cache if it is. + */ + public Drawable getAndInvalidateIfModified(Task.TaskKey taskKey, + ActivityManager.TaskDescription td, boolean loadIfNotCached) { + // Return the cached activity icon if it exists + Drawable icon = mIconCache.getAndInvalidateIfModified(taskKey); + if (icon != null) { + return icon; + } + + if (loadIfNotCached) { + icon = createNewIconForTask(taskKey, td, false /* returnDefault */); + if (icon != null) { + mIconCache.put(taskKey, icon); + return icon; + } + } + + // We couldn't load any icon + return null; + } + + private Drawable createNewIconForTask(Task.TaskKey taskKey, + ActivityManager.TaskDescription desc, boolean returnDefault) { + int userId = taskKey.userId; + Bitmap tdIcon = desc.getInMemoryIcon(); + if (tdIcon != null) { + return createDrawableFromBitmap(tdIcon, userId); + } + if (desc.getIconResource() != 0) { + // TODO: Use task context here + try { + return createBadgedDrawable(mContext.getDrawable(desc.getIconResource()), userId); + } catch (Resources.NotFoundException e) { + Log.e(TAG, "Could not find icon drawable from resource", e); + } + } + + tdIcon = ActivityManager.TaskDescription.loadTaskDescriptionIcon( + desc.getIconFilename(), userId); + if (tdIcon != null) { + return createDrawableFromBitmap(tdIcon, userId); + } + + // Load the icon from the activity info and cache it + ActivityInfo activityInfo = getAndUpdateActivityInfo(taskKey); + if (activityInfo != null) { + Drawable icon = getBadgedActivityIcon(activityInfo, userId); + if (icon != null) { + return icon; + } + } + + // At this point, even if we can't load the icon, we will set the default icon. + return returnDefault ? getDefaultIcon(userId) : null; + } + + public abstract Drawable getDefaultIcon(int userId); + + protected Drawable createDrawableFromBitmap(Bitmap icon, int userId) { + return createBadgedDrawable(new BitmapDrawable(mContext.getResources(), icon), userId); + } + + protected abstract Drawable createBadgedDrawable(Drawable icon, int userId); + + /** + * @return the activity icon for the ActivityInfo for a user, badging if necessary. + */ + protected abstract Drawable getBadgedActivityIcon(ActivityInfo info, int userId); + + public static class DefaultIconLoader extends IconLoader { + + private final BitmapDrawable mDefaultIcon; + private final IconDrawableFactory mDrawableFactory; + + public DefaultIconLoader(Context context, TaskKeyLruCache<Drawable> iconCache, + LruCache<ComponentName, ActivityInfo> activityInfoCache) { + super(context, iconCache, activityInfoCache); + + // Create the default assets + Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); + icon.eraseColor(0); + mDefaultIcon = new BitmapDrawable(context.getResources(), icon); + mDrawableFactory = IconDrawableFactory.newInstance(context); + } + + @Override + public Drawable getDefaultIcon(int userId) { + return mDefaultIcon; + } + + @Override + protected Drawable createBadgedDrawable(Drawable icon, int userId) { + if (userId != UserHandle.myUserId()) { + icon = mContext.getPackageManager().getUserBadgedIcon(icon, new UserHandle(userId)); + } + return icon; + } + + @Override + protected Drawable getBadgedActivityIcon(ActivityInfo info, int userId) { + return mDrawableFactory.getBadgedIcon(info, info.applicationInfo, userId); + } + } +} diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java index 4834bb18f53c..76204dfc81cf 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java @@ -123,7 +123,7 @@ public class RecentsTaskLoadPlan { ? loader.getAndUpdateContentDescription(taskKey, t.taskDescription) : ""; Drawable icon = isStackTask - ? loader.getAndUpdateActivityIcon(taskKey, t.taskDescription, res, false) + ? loader.getAndUpdateActivityIcon(taskKey, t.taskDescription, false) : null; ThumbnailData thumbnail = loader.getAndUpdateThumbnail(taskKey, false /* loadIfNotCached */, false /* storeInCache */); @@ -179,7 +179,7 @@ public class RecentsTaskLoadPlan { if (opts.loadIcons && (isRunningTask || isVisibleTask)) { if (task.icon == null) { - task.icon = loader.getAndUpdateActivityIcon(taskKey, task.taskDescription, res, + task.icon = loader.getAndUpdateActivityIcon(taskKey, task.taskDescription, true); } } diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java index 0f68026c7464..1309a6065c8a 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java @@ -21,9 +21,6 @@ import android.content.ComponentCallbacks2; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; -import android.content.res.Resources; -import android.graphics.Bitmap; -import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Looper; import android.os.Trace; @@ -36,7 +33,6 @@ import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan.PreloadOpti import com.android.systemui.shared.recents.model.Task.TaskKey; import com.android.systemui.shared.recents.model.TaskKeyLruCache.EvictionCallback; import com.android.systemui.shared.system.ActivityManagerWrapper; -import com.android.systemui.shared.system.PackageManagerWrapper; import java.io.PrintWriter; import java.util.Map; @@ -61,8 +57,6 @@ public class RecentsTaskLoader { // Disable all thumbnail loading. public static final int SVELTE_DISABLE_LOADING = 3; - private final Context mContext; - // This activity info LruCache is useful because it can be expensive to retrieve ActivityInfos // for many tasks, which we use to get the activity labels and icons. Unlike the other caches // below, this is per-package so we can't invalidate the items in the cache based on the last @@ -73,6 +67,7 @@ public class RecentsTaskLoader { private final TaskKeyLruCache<String> mActivityLabelCache; private final TaskKeyLruCache<String> mContentDescriptionCache; private final TaskResourceLoadQueue mLoadQueue; + private final IconLoader mIconLoader; private final BackgroundTaskLoader mLoader; private final HighResThumbnailLoader mHighResThumbnailLoader; @GuardedBy("this") @@ -86,7 +81,6 @@ public class RecentsTaskLoader { private int mDefaultTaskBarBackgroundColor; private int mDefaultTaskViewBackgroundColor; - private final BitmapDrawable mDefaultIcon; private EvictionCallback mClearActivityInfoOnEviction = new EvictionCallback() { @Override @@ -99,16 +93,10 @@ public class RecentsTaskLoader { public RecentsTaskLoader(Context context, int maxThumbnailCacheSize, int maxIconCacheSize, int svelteLevel) { - mContext = context; mMaxThumbnailCacheSize = maxThumbnailCacheSize; mMaxIconCacheSize = maxIconCacheSize; mSvelteLevel = svelteLevel; - // Create the default assets - Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8); - icon.eraseColor(0); - mDefaultIcon = new BitmapDrawable(context.getResources(), icon); - // Initialize the proxy, cache and loaders int numRecentTasks = ActivityManager.getMaxRecentTasksStatic(); mHighResThumbnailLoader = new HighResThumbnailLoader(ActivityManagerWrapper.getInstance(), @@ -119,10 +107,17 @@ public class RecentsTaskLoader { mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks, mClearActivityInfoOnEviction); mActivityInfoCache = new LruCache<>(numRecentTasks); - mLoader = new BackgroundTaskLoader(mLoadQueue, mIconCache, mDefaultIcon, + + mIconLoader = createNewIconLoader(context, mIconCache, mActivityInfoCache); + mLoader = new BackgroundTaskLoader(mLoadQueue, mIconLoader, mHighResThumbnailLoader::setTaskLoadQueueIdle); } + protected IconLoader createNewIconLoader(Context context,TaskKeyLruCache<Drawable> iconCache, + LruCache<ComponentName, ActivityInfo> activityInfoCache) { + return new IconLoader.DefaultIconLoader(context, iconCache, activityInfoCache); + } + /** * Sets the default task bar/view colors if none are provided by the app. */ @@ -187,7 +182,7 @@ public class RecentsTaskLoader { */ public void loadTaskData(Task t) { Drawable icon = mIconCache.getAndInvalidateIfModified(t.key); - icon = icon != null ? icon : mDefaultIcon; + icon = icon != null ? icon : mIconLoader.getDefaultIcon(t.key.userId); mLoadQueue.addTask(t); t.notifyTaskDataLoaded(t.thumbnail, icon); } @@ -195,7 +190,7 @@ public class RecentsTaskLoader { /** Releases the task resource data back into the pool. */ public void unloadTaskData(Task t) { mLoadQueue.removeTask(t); - t.notifyTaskDataUnloaded(mDefaultIcon); + t.notifyTaskDataUnloaded(mIconLoader.getDefaultIcon(t.key.userId)); } /** Completely removes the resource data from the pool. */ @@ -205,7 +200,7 @@ public class RecentsTaskLoader { mActivityLabelCache.remove(t.key); mContentDescriptionCache.remove(t.key); if (notifyTaskDataUnloaded) { - t.notifyTaskDataUnloaded(mDefaultIcon); + t.notifyTaskDataUnloaded(mIconLoader.getDefaultIcon(t.key.userId)); } } @@ -326,35 +321,8 @@ public class RecentsTaskLoader { * Returns the cached task icon if the task key is not expired, updating the cache if it is. */ Drawable getAndUpdateActivityIcon(TaskKey taskKey, ActivityManager.TaskDescription td, - Resources res, boolean loadIfNotCached) { - // Return the cached activity icon if it exists - Drawable icon = mIconCache.getAndInvalidateIfModified(taskKey); - if (icon != null) { - return icon; - } - - if (loadIfNotCached) { - // Return and cache the task description icon if it exists - icon = ActivityManagerWrapper.getInstance().getBadgedTaskDescriptionIcon(mContext, td, - taskKey.userId, res); - if (icon != null) { - mIconCache.put(taskKey, icon); - return icon; - } - - // Load the icon from the activity info and cache it - ActivityInfo activityInfo = getAndUpdateActivityInfo(taskKey); - if (activityInfo != null) { - icon = ActivityManagerWrapper.getInstance().getBadgedActivityIcon(activityInfo, - taskKey.userId); - if (icon != null) { - mIconCache.put(taskKey, icon); - return icon; - } - } - } - // We couldn't load any icon - return null; + boolean loadIfNotCached) { + return mIconLoader.getAndInvalidateIfModified(taskKey, td, loadIfNotCached); } /** @@ -417,18 +385,7 @@ public class RecentsTaskLoader { * task key is expired. */ ActivityInfo getAndUpdateActivityInfo(TaskKey taskKey) { - ComponentName cn = taskKey.getComponent(); - ActivityInfo activityInfo = mActivityInfoCache.get(cn); - if (activityInfo == null) { - activityInfo = PackageManagerWrapper.getInstance().getActivityInfo(cn, taskKey.userId); - if (cn == null || activityInfo == null) { - Log.e(TAG, "Unexpected null component name or activity info: " + cn + ", " + - activityInfo); - return null; - } - mActivityInfoCache.put(cn, activityInfo); - } - return activityInfo; + return mIconLoader.getAndUpdateActivityInfo(taskKey); } /** diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index 138910cb9820..0103cad4a6c4 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -17,7 +17,6 @@ package com.android.systemui.shared.system; import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; -import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE; import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS; import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; @@ -40,25 +39,19 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; -import android.content.res.Resources; -import android.content.res.Resources.NotFoundException; import android.graphics.Bitmap; import android.graphics.Rect; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.provider.Settings; -import android.util.IconDrawableFactory; import android.util.Log; import android.view.IRecentsAnimationController; import android.view.IRecentsAnimationRunner; import android.view.RemoteAnimationTarget; -import android.view.WindowManagerGlobal; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task.TaskKey; import com.android.systemui.shared.recents.model.ThumbnailData; @@ -74,14 +67,12 @@ public class ActivityManagerWrapper { private static final ActivityManagerWrapper sInstance = new ActivityManagerWrapper(); private final PackageManager mPackageManager; - private final IconDrawableFactory mDrawableFactory; private final BackgroundExecutor mBackgroundExecutor; private final TaskStackChangeListeners mTaskStackChangeListeners; private ActivityManagerWrapper() { final Context context = AppGlobals.getInitialApplication(); mPackageManager = context.getPackageManager(); - mDrawableFactory = IconDrawableFactory.newInstance(context); mBackgroundExecutor = BackgroundExecutor.get(); mTaskStackChangeListeners = new TaskStackChangeListeners(Looper.getMainLooper()); } @@ -156,58 +147,6 @@ public class ActivityManagerWrapper { } /** - * @return the task description icon, loading and badging it if it necessary. - */ - public Drawable getBadgedTaskDescriptionIcon(Context context, - ActivityManager.TaskDescription taskDescription, int userId, Resources res) { - Bitmap tdIcon = taskDescription.getInMemoryIcon(); - Drawable dIcon = null; - if (tdIcon != null) { - dIcon = new BitmapDrawable(res, tdIcon); - } else if (taskDescription.getIconResource() != 0) { - try { - dIcon = context.getDrawable(taskDescription.getIconResource()); - } catch (NotFoundException e) { - Log.e(TAG, "Could not find icon drawable from resource", e); - } - } else { - tdIcon = ActivityManager.TaskDescription.loadTaskDescriptionIcon( - taskDescription.getIconFilename(), userId); - if (tdIcon != null) { - dIcon = new BitmapDrawable(res, tdIcon); - } - } - if (dIcon != null) { - return getBadgedIcon(dIcon, userId); - } - return null; - } - - /** - * @return the given icon for a user, badging if necessary. - */ - private Drawable getBadgedIcon(Drawable icon, int userId) { - if (userId != UserHandle.myUserId()) { - icon = mPackageManager.getUserBadgedIcon(icon, new UserHandle(userId)); - } - return icon; - } - - /** - * @return the activity icon for the ActivityInfo for a user, badging if necessary. - */ - public Drawable getBadgedActivityIcon(ActivityInfo info, int userId) { - return mDrawableFactory.getBadgedIcon(info, info.applicationInfo, userId); - } - - /** - * @return the application icon for the ApplicationInfo for a user, badging if necessary. - */ - public Drawable getBadgedApplicationIcon(ApplicationInfo appInfo, int userId) { - return mDrawableFactory.getBadgedIcon(appInfo, userId); - } - - /** * @return the activity label, badging if necessary. */ public String getBadgedActivityLabel(ActivityInfo info, int userId) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java index f1a5ca9fba93..474fc90a1c3f 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java @@ -197,16 +197,6 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { return false; } - @Override - public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { - if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { - event.getText().add(mSecurityContainer.getCurrentSecurityModeContentDescription()); - return true; - } else { - return super.dispatchPopulateAccessibilityEvent(event); - } - } - protected KeyguardSecurityContainer getSecurityContainer() { return mSecurityContainer; } @@ -255,6 +245,10 @@ public class KeyguardHostView extends FrameLayout implements SecurityCallback { } } + public CharSequence getAccessibilityTitleForCurrentMode() { + return mSecurityContainer.getTitle(); + } + public void userActivity() { if (mViewMediatorCallback != null) { mViewMediatorCallback.userActivity(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java index ff5f5e77b3f9..75c52d8ead65 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java @@ -361,4 +361,10 @@ public class KeyguardPasswordView extends KeyguardAbsKeyInputView } return false; } + + @Override + public CharSequence getTitle() { + return getContext().getString( + com.android.internal.R.string.keyguard_accessibility_password_unlock); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java index cb066a10a9c9..651831eea517 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java @@ -491,4 +491,10 @@ public class KeyguardPatternView extends LinearLayout implements KeyguardSecurit public boolean hasOverlappingRendering() { return false; } + + @Override + public CharSequence getTitle() { + return getContext().getString( + com.android.internal.R.string.keyguard_accessibility_pattern_unlock); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java index 6539ccffc61b..1d3f9a13c631 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java @@ -252,4 +252,10 @@ public abstract class KeyguardPinBasedInputView extends KeyguardAbsKeyInputView } return false; } + + @Override + public CharSequence getTitle() { + return getContext().getString( + com.android.internal.R.string.keyguard_accessibility_pin_unlock); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 8dc4609f1b9d..c3413d9d76bb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -119,19 +119,8 @@ public class KeyguardSecurityContainer extends FrameLayout implements KeyguardSe return false; } - public void announceCurrentSecurityMethod() { - View v = (View) getSecurityView(mCurrentSecuritySelection); - if (v != null) { - v.announceForAccessibility(v.getContentDescription()); - } - } - - public CharSequence getCurrentSecurityModeContentDescription() { - View v = (View) getSecurityView(mCurrentSecuritySelection); - if (v != null) { - return v.getContentDescription(); - } - return ""; + public CharSequence getTitle() { + return mSecurityViewFlipper.getTitle(); } private KeyguardSecurityView getSecurityView(SecurityMode securityMode) { diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java index 360dba3bc0ea..6e445ff0e26d 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java @@ -127,4 +127,12 @@ public interface KeyguardSecurityView { * animation started and {@code finishRunnable} will not be run */ boolean startDisappearAnimation(Runnable finishRunnable); + + /** + * The localized name of the security view, provided to accessibility. This may be the content + * description, but content descriptions have other implications, so the title is kept separate. + * + * @return The View's title. + */ + CharSequence getTitle(); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java index a2ff8f7896aa..3aede569147a 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java @@ -173,6 +173,15 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard } @Override + public CharSequence getTitle() { + KeyguardSecurityView ksv = getSecurityView(); + if (ksv != null) { + return ksv.getTitle(); + } + return ""; + } + + @Override protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { return p instanceof LayoutParams; } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java index 703b20531390..c71c433bb016 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java @@ -390,5 +390,11 @@ public class KeyguardSimPinView extends KeyguardPinBasedInputView { public boolean startDisappearAnimation(Runnable finishRunnable) { return false; } + + @Override + public CharSequence getTitle() { + return getContext().getString( + com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java index 347c9792ec95..1b61568276ce 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java @@ -460,6 +460,12 @@ public class KeyguardSimPukView extends KeyguardPinBasedInputView { public boolean startDisappearAnimation(Runnable finishRunnable) { return false; } + + @Override + public CharSequence getTitle() { + return getContext().getString( + com.android.internal.R.string.keyguard_accessibility_sim_puk_unlock); + } } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java index 5d1bdabeeac8..b54d09a66535 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java @@ -16,6 +16,7 @@ package com.android.keyguard; +import android.annotation.ColorInt; import android.app.PendingIntent; import android.arch.lifecycle.LiveData; import android.arch.lifecycle.Observer; @@ -34,6 +35,7 @@ import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.graphics.ColorUtils; import com.android.settingslib.Utils; import com.android.systemui.Dependency; @@ -160,8 +162,8 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe mRow.addView(button); PendingIntent pendingIntent = null; - if (rc.getContentIntent() != null) { - pendingIntent = rc.getContentIntent().getAction(); + if (rc.getPrimaryAction() != null) { + pendingIntent = rc.getPrimaryAction().getAction(); } mClickActions.put(button, pendingIntent); @@ -307,10 +309,17 @@ public class KeyguardSliceView extends LinearLayout implements View.OnClickListe } } - public int getTextColor() { + @VisibleForTesting + int getTextColor() { return ColorUtils.blendARGB(mTextColor, Color.WHITE, mDarkAmount); } + @VisibleForTesting + void setTextColor(@ColorInt int textColor) { + mTextColor = textColor; + updateTextColors(); + } + /** * Representation of an item that appears under the clock on main keyguard message. */ diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index f3f8d91f794b..6098e4e67088 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -736,7 +736,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { private DisplayClientState mDisplayClientState = new DisplayClientState(); - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @VisibleForTesting + final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { @@ -773,6 +774,13 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { maxChargingMicroWatt)); mHandler.sendMessage(msg); } else if (TelephonyIntents.ACTION_SIM_STATE_CHANGED.equals(action)) { + // ACTION_SIM_STATE_CHANGED is rebroadcast after unlocking the device to + // keep compatibility with apps that aren't direct boot aware. + // SysUI should just ignore this broadcast because it was already received + // and processed previously. + if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, false)) { + return; + } SimData args = SimData.fromIntent(intent); if (DEBUG_SIM_STATES) { Log.v(TAG, "action " + action @@ -1508,7 +1516,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { /** * Handle {@link #MSG_SIM_STATE_CHANGE} */ - private void handleSimStateChange(int subId, int slotId, State state) { + @VisibleForTesting + protected void handleSimStateChange(int subId, int slotId, State state) { if (DEBUG_SIM_STATES) { Log.d(TAG, "handleSimStateChange(subId=" + subId + ", slotId=" diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java index 8b577400357d..ee573fbeaf33 100644 --- a/packages/SystemUI/src/com/android/systemui/Prefs.java +++ b/packages/SystemUI/src/com/android/systemui/Prefs.java @@ -30,27 +30,28 @@ public final class Prefs { @Retention(RetentionPolicy.SOURCE) @StringDef({ - Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, - Key.DEBUG_MODE_ENABLED, - Key.HOTSPOT_TILE_LAST_USED, - Key.COLOR_INVERSION_TILE_LAST_USED, - Key.DND_TILE_VISIBLE, - Key.DND_TILE_COMBINED_ICON, - Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, - Key.DND_CONFIRMED_SILENCE_INTRODUCTION, - Key.DND_FAVORITE_BUCKET_INDEX, - Key.DND_NONE_SELECTED, - Key.DND_FAVORITE_ZEN, - Key.QS_HOTSPOT_ADDED, - Key.QS_DATA_SAVER_ADDED, - Key.QS_DATA_SAVER_DIALOG_SHOWN, - Key.QS_INVERT_COLORS_ADDED, - Key.QS_WORK_ADDED, - Key.QS_NIGHTDISPLAY_ADDED, - Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, - Key.SEEN_MULTI_USER, - Key.NUM_APPS_LAUNCHED, - Key.HAS_SEEN_RECENTS_ONBOARDING, + Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, + Key.DEBUG_MODE_ENABLED, + Key.HOTSPOT_TILE_LAST_USED, + Key.COLOR_INVERSION_TILE_LAST_USED, + Key.DND_TILE_VISIBLE, + Key.DND_TILE_COMBINED_ICON, + Key.DND_CONFIRMED_PRIORITY_INTRODUCTION, + Key.DND_CONFIRMED_SILENCE_INTRODUCTION, + Key.DND_FAVORITE_BUCKET_INDEX, + Key.DND_NONE_SELECTED, + Key.DND_FAVORITE_ZEN, + Key.QS_HOTSPOT_ADDED, + Key.QS_DATA_SAVER_ADDED, + Key.QS_DATA_SAVER_DIALOG_SHOWN, + Key.QS_INVERT_COLORS_ADDED, + Key.QS_WORK_ADDED, + Key.QS_NIGHTDISPLAY_ADDED, + Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, + Key.SEEN_MULTI_USER, + Key.NUM_APPS_LAUNCHED, + Key.HAS_SEEN_RECENTS_ONBOARDING, + Key.SEEN_RINGER_GUIDANCE_COUNT }) public @interface Key { @Deprecated @@ -85,6 +86,7 @@ public final class Prefs { String SEEN_MULTI_USER = "HasSeenMultiUser"; String NUM_APPS_LAUNCHED = "NumAppsLaunched"; String HAS_SEEN_RECENTS_ONBOARDING = "HasSeenRecentsOnboarding"; + String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount"; } public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) { diff --git a/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java b/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java index f201165a3989..be3168c3b208 100644 --- a/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java +++ b/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java @@ -16,6 +16,9 @@ package com.android.systemui.net; +import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE; +import static android.net.NetworkTemplate.MATCH_MOBILE; + import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; @@ -32,11 +35,6 @@ import android.view.WindowManager; import com.android.systemui.R; -import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE; -import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER; -import static android.net.NetworkTemplate.MATCH_MOBILE_4G; -import static android.net.NetworkTemplate.MATCH_MOBILE_ALL; - /** * Notify user that a {@link NetworkTemplate} is over its * {@link NetworkPolicy#limitBytes}, giving them the choice of acknowledging or @@ -85,11 +83,7 @@ public class NetworkOverLimitActivity extends Activity { private static int getLimitedDialogTitleForTemplate(NetworkTemplate template) { switch (template.getMatchRule()) { - case MATCH_MOBILE_3G_LOWER: - return R.string.data_usage_disabled_dialog_3g_title; - case MATCH_MOBILE_4G: - return R.string.data_usage_disabled_dialog_4g_title; - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: return R.string.data_usage_disabled_dialog_mobile_title; default: return R.string.data_usage_disabled_dialog_title; diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java index f0e4ccc139ca..1e0d4d01f167 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java @@ -26,12 +26,14 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager.NameNotFoundException; +import android.os.Handler; import android.util.Pair; public class PipAppOpsListener { private static final String TAG = PipAppOpsListener.class.getSimpleName(); private Context mContext; + private Handler mHandler; private IActivityManager mActivityManager; private AppOpsManager mAppOpsManager; @@ -50,7 +52,7 @@ public class PipAppOpsListener { if (appInfo.packageName.equals(topPipActivityInfo.first.getPackageName()) && mAppOpsManager.checkOpNoThrow(OP_PICTURE_IN_PICTURE, appInfo.uid, packageName) != MODE_ALLOWED) { - mMotionHelper.dismissPip(); + mHandler.post(() -> mMotionHelper.dismissPip()); } } } catch (NameNotFoundException e) { @@ -63,6 +65,7 @@ public class PipAppOpsListener { public PipAppOpsListener(Context context, IActivityManager activityManager, PipMotionHelper motionHelper) { mContext = context; + mHandler = new Handler(mContext.getMainLooper()); mActivityManager = activityManager; mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mMotionHelper = motionHelper; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 175cddc55761..2a4bb607673e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -66,10 +66,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha private TouchAnimator mNonfirstPageDelayedAnimator; private TouchAnimator mBrightnessAnimator; - /** - * Whether we're in the middle of animating between the collapsed and expanded states. - */ - private boolean mIsAnimating; private boolean mOnKeyguard; private boolean mAllowFancy; @@ -94,9 +90,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha Log.w(TAG, "QS Not using page layout"); } panel.setPageListener(this); - - // At time of creation, the QS panel is never animating. - mIsAnimating = false; } public void onRtlChanged() { @@ -251,11 +244,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha } else { mBrightnessAnimator = null; } - View headerView = mQsPanel.getHeaderView(); - if (headerView!= null) { - firstPageBuilder.addFloat(headerView, "translationY", heightDiff, 0); - mAllViews.add(headerView); - } mFirstPageAnimator = firstPageBuilder .setListener(this) .build(); @@ -342,21 +330,11 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha @Override public void onAnimationAtStart() { - if (mIsAnimating) { - mQsPanel.onCollapse(); - } - mIsAnimating = false; - mQuickQsPanel.setVisibility(View.VISIBLE); } @Override public void onAnimationAtEnd() { - if (mIsAnimating) { - mQsPanel.onExpanded(); - } - mIsAnimating = false; - mQuickQsPanel.setVisibility(View.INVISIBLE); final int N = mQuickQsViews.size(); for (int i = 0; i < N; i++) { @@ -366,11 +344,6 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha @Override public void onAnimationStarted() { - if (!mIsAnimating) { - mQsPanel.onAnimating(); - } - mIsAnimating = true; - mQuickQsPanel.setVisibility(mOnKeyguard ? View.INVISIBLE : View.VISIBLE); if (mOnFirstPage) { final int N = mQuickQsViews.size(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java index d437f49d0e96..5758762b06a0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java @@ -272,21 +272,27 @@ public class QSFragment extends Fragment implements QS { mContainer.setExpansion(expansion); final float translationScaleY = expansion - 1; if (!mHeaderAnimating) { - int height = mHeader.getHeight(); - getView().setTranslationY(mKeyguardShowing ? (translationScaleY * height) - : headerTranslation); + getView().setTranslationY( + mKeyguardShowing + ? translationScaleY * mHeader.getHeight() + : headerTranslation); } if (expansion == mLastQSExpansion) { return; } mLastQSExpansion = expansion; - mHeader.setExpansion(mKeyguardShowing ? 1 : expansion); - mFooter.setExpansion(mKeyguardShowing ? 1 : expansion); + + boolean fullyExpanded = expansion == 1; int heightDiff = mQSPanel.getBottom() - mHeader.getBottom() + mHeader.getPaddingBottom() + mFooter.getHeight(); + float panelTranslationY = translationScaleY * heightDiff; + + // Let the views animate their contents correctly by giving them the necessary context. + mHeader.setExpansion(mKeyguardShowing, expansion, panelTranslationY); + mFooter.setExpansion(mKeyguardShowing ? 1 : expansion); mQSPanel.setTranslationY(translationScaleY * heightDiff); - boolean fullyExpanded = expansion == 1; mQSDetail.setFullyExpanded(fullyExpanded); + if (fullyExpanded) { // Always draw within the bounds of the view when fully expanded. mQSPanel.setClipBounds(null); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 476cb401871e..143ad21c998c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -29,7 +29,6 @@ import android.os.Message; import android.service.quicksettings.Tile; import android.util.AttributeSet; import android.view.LayoutInflater; -import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; @@ -54,11 +53,11 @@ import com.android.systemui.tuner.TunerService.Tunable; import java.util.ArrayList; import java.util.Collection; -/** View that represents the quick settings tile panel. **/ +/** View that represents the quick settings tile panel (when expanded/pulled down). **/ public class QSPanel extends LinearLayout implements Tunable, Callback, BrightnessMirrorListener { public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness"; - public static final String QS_SHOW_LONG_PRESS_TOOLTIP = "qs_show_long_press"; + public static final String QS_SHOW_HEADER = "qs_show_header"; protected final Context mContext; protected final ArrayList<TileRecord> mRecords = new ArrayList<TileRecord>(); @@ -74,7 +73,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne private BrightnessController mBrightnessController; protected QSTileHost mHost; - protected QSTooltipView mTooltipView; protected QSSecurityFooter mFooter; private boolean mGridContentVisible = true; @@ -96,11 +94,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne setOrientation(VERTICAL); - mTooltipView = (QSTooltipView) LayoutInflater.from(mContext) - .inflate(R.layout.quick_settings_header, this, false); - - addView(mTooltipView); - mBrightnessView = LayoutInflater.from(mContext).inflate( R.layout.quick_settings_brightness_dialog, this, false); addView(mBrightnessView); @@ -152,7 +145,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne super.onAttachedToWindow(); final TunerService tunerService = Dependency.get(TunerService.class); tunerService.addTunable(this, QS_SHOW_BRIGHTNESS); - tunerService.addTunable(this, QS_SHOW_LONG_PRESS_TOOLTIP); if (mHost != null) { setTiles(mHost.getTiles()); @@ -186,8 +178,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne public void onTuningChanged(String key, String newValue) { if (QS_SHOW_BRIGHTNESS.equals(key)) { updateViewVisibilityForTuningValue(mBrightnessView, newValue); - } else if (QS_SHOW_LONG_PRESS_TOOLTIP.equals(key)) { - updateViewVisibilityForTuningValue(mTooltipView, newValue); } } @@ -229,10 +219,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne return mBrightnessView; } - View getHeaderView() { - return mTooltipView; - } - public void setCallback(QSDetail.Callback callback) { mCallback = callback; } @@ -254,8 +240,7 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne public void updateResources() { final Resources res = mContext.getResources(); - setPadding(0, res.getDimensionPixelSize(R.dimen.qs_brightness_padding_top), - 0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); + setPadding(0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_top), 0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom)); for (TileRecord r : mRecords) { r.tile.clearState(); } @@ -289,21 +274,6 @@ public class QSPanel extends LinearLayout implements Tunable, Callback, Brightne if (mCustomizePanel != null && mCustomizePanel.isShown()) { mCustomizePanel.hide(mCustomizePanel.getWidth() / 2, mCustomizePanel.getHeight() / 2); } - - // Instantly hide the header here since we don't want it to still be animating. - mTooltipView.setVisibility(View.INVISIBLE); - } - - /** - * Called when the panel is fully animated out/expanded. This is different from the state - * tracked by {@link #mExpanded}, which only checks if the panel is even partially pulled out. - */ - public void onExpanded() { - mTooltipView.fadeIn(); - } - - public void onAnimating() { - mTooltipView.fadeOut(); } public void setExpanded(boolean expanded) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java deleted file mode 100644 index d1f9741ba6c2..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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 com.android.systemui.qs; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.content.Context; -import android.os.Handler; -import android.util.AttributeSet; -import android.view.View; -import android.widget.LinearLayout; - -import com.android.systemui.Prefs; - -import java.util.concurrent.TimeUnit; - - -/** - * Tooltip/header view for the Quick Settings panel. - */ -public class QSTooltipView extends LinearLayout { - - private static final int FADE_ANIMATION_DURATION_MS = 300; - private static final long AUTO_FADE_OUT_DELAY_MS = TimeUnit.SECONDS.toMillis(6); - private static final int TOOLTIP_NOT_YET_SHOWN_COUNT = 0; - public static final int MAX_TOOLTIP_SHOWN_COUNT = 3; - - private final Handler mHandler = new Handler(); - private final Runnable mAutoFadeOutRunnable = () -> fadeOut(); - - private int mShownCount; - - public QSTooltipView(Context context) { - this(context, null); - } - - public QSTooltipView(Context context, AttributeSet attrs) { - super(context, attrs); - mShownCount = getStoredShownCount(); - } - - /** Returns the latest stored tooltip shown count from SharedPreferences. */ - private int getStoredShownCount() { - return Prefs.getInt( - mContext, - Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, - TOOLTIP_NOT_YET_SHOWN_COUNT); - } - - /** - * Fades in the header view if we can show the tooltip - short circuits any running animation. - */ - public void fadeIn() { - if (mShownCount < MAX_TOOLTIP_SHOWN_COUNT) { - animate().cancel(); - setVisibility(View.VISIBLE); - animate() - .alpha(1f) - .setDuration(FADE_ANIMATION_DURATION_MS) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - mHandler.postDelayed(mAutoFadeOutRunnable, AUTO_FADE_OUT_DELAY_MS); - } - }) - .start(); - - // Increment and drop the shown count in prefs for the next time we're deciding to - // fade in the tooltip. We first sanity check that the tooltip count hasn't changed yet - // in prefs (say, from a long press). - if (getStoredShownCount() <= mShownCount) { - Prefs.putInt(mContext, Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, ++mShownCount); - } - } - } - - /** - * Fades out the header view if it's partially visible - short circuits any running animation. - */ - public void fadeOut() { - animate().cancel(); - if (getVisibility() == View.VISIBLE && getAlpha() != 0f) { - mHandler.removeCallbacks(mAutoFadeOutRunnable); - animate() - .alpha(0f) - .setDuration(FADE_ANIMATION_DURATION_MS) - .setListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - perhapsMakeViewInvisible(); - } - }) - .start(); - } else { - perhapsMakeViewInvisible(); - } - } - - /** - * Only update visibility if the view is currently being shown. Otherwise, it's already been - * hidden by some other manner. - */ - private void perhapsMakeViewInvisible() { - if (getVisibility() == View.VISIBLE) { - setVisibility(View.INVISIBLE); - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index f0684e19cc76..2270b608b07b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -20,7 +20,6 @@ import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; -import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.Space; @@ -123,7 +122,7 @@ public class QuickQSPanel extends QSPanel { @Override public void onTuningChanged(String key, String newValue) { - if (QS_SHOW_BRIGHTNESS.equals(key) || QS_SHOW_LONG_PRESS_TOOLTIP.equals(key)) { + if (QS_SHOW_BRIGHTNESS.equals(key)) { // No Brightness or Tooltip for you! super.onTuningChanged(key, "0"); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java index 4d7333b99eee..78481d3b07e0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java @@ -15,24 +15,30 @@ package com.android.systemui.qs; import static android.app.StatusBarManager.DISABLE2_QUICK_SETTINGS; -import static android.app.StatusBarManager.DISABLE_NONE; +import static com.android.systemui.keyguard.KeyguardSliceProvider.formatNextAlarm; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.app.AlarmManager; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Color; import android.graphics.Rect; +import android.os.Handler; import android.provider.AlarmClock; import android.support.annotation.VisibleForTesting; +import android.text.TextUtils; +import android.text.format.DateUtils; import android.util.AttributeSet; import android.view.View; import android.widget.RelativeLayout; -import android.widget.TextClock; +import android.widget.TextView; import com.android.settingslib.Utils; import com.android.systemui.BatteryMeterView; import com.android.systemui.Dependency; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.R.id; import com.android.systemui.SysUiServiceProvider; @@ -43,11 +49,23 @@ import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController.TintedIconManager; import com.android.systemui.statusbar.policy.DarkIconDispatcher; import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver; +import com.android.systemui.statusbar.policy.NextAlarmController; -public class QuickStatusBarHeader extends RelativeLayout - implements CommandQueue.Callbacks, View.OnClickListener { +/** + * View that contains the top-most bits of the screen (primarily the status bar with date, time, and + * battery) and also contains the {@link QuickQSPanel} along with some of the panel's inner + * contents. + */ +public class QuickStatusBarHeader extends RelativeLayout implements CommandQueue.Callbacks, + View.OnClickListener, NextAlarmController.NextAlarmChangeCallback { + + /** Delay for auto fading out the long press tooltip after it's fully visible (in ms). */ + private static final long AUTO_FADE_OUT_DELAY_MS = DateUtils.SECOND_IN_MILLIS * 6; + private static final int FADE_ANIMATION_DURATION_MS = 300; + private static final int TOOLTIP_NOT_YET_SHOWN_COUNT = 0; + public static final int MAX_TOOLTIP_SHOWN_COUNT = 3; - private ActivityStarter mActivityStarter; + private final Handler mHandler = new Handler(); private QSPanel mQsPanel; @@ -58,20 +76,39 @@ public class QuickStatusBarHeader extends RelativeLayout protected QuickQSPanel mHeaderQsPanel; protected QSTileHost mHost; private TintedIconManager mIconManager; - private TouchAnimator mAlphaAnimator; + private TouchAnimator mStatusIconsAlphaAnimator; + private TouchAnimator mHeaderTextContainerAlphaAnimator; private View mQuickQsStatusIcons; - private View mDate; + private View mHeaderTextContainerView; + /** View corresponding to the next alarm info (including the icon). */ + private View mNextAlarmView; + /** Tooltip for educating users that they can long press on icons to see more details. */ + private View mLongPressTooltipView; + /** {@link TextView} containing the actual text indicating when the next alarm will go off. */ + private TextView mNextAlarmTextView; + + private NextAlarmController mAlarmController; + private String mNextAlarmText; + /** Counts how many times the long press tooltip has been shown to the user. */ + private int mShownCount; + + /** + * Runnable for automatically fading out the long press tooltip (as if it were animating away). + */ + private final Runnable mAutoFadeOutTooltipRunnable = () -> hideLongPressTooltip(false); public QuickStatusBarHeader(Context context, AttributeSet attrs) { super(context, attrs); + + mAlarmController = Dependency.get(NextAlarmController.class); + mShownCount = getStoredShownCount(); } @Override protected void onFinishInflate() { super.onFinishInflate(); - Resources res = getResources(); mHeaderQsPanel = findViewById(R.id.quick_qs_panel); mDate = findViewById(R.id.date); @@ -79,8 +116,11 @@ public class QuickStatusBarHeader extends RelativeLayout mQuickQsStatusIcons = findViewById(R.id.quick_qs_status_icons); mIconManager = new TintedIconManager(findViewById(R.id.statusIcons)); - // RenderThread is doing more harm than good when touching the header (to expand quick - // settings), so disable it for this view + // Views corresponding to the header info section (e.g. tooltip and next alarm). + mHeaderTextContainerView = findViewById(R.id.header_text_container); + mLongPressTooltipView = findViewById(R.id.long_press_tooltip); + mNextAlarmView = findViewById(R.id.next_alarm); + mNextAlarmTextView = findViewById(R.id.next_alarm_text); updateResources(); @@ -98,8 +138,6 @@ public class QuickStatusBarHeader extends RelativeLayout BatteryMeterView battery = findViewById(R.id.battery); battery.setForceShowPercent(true); - - mActivityStarter = Dependency.get(ActivityStarter.class); } private void applyDarkness(int id, Rect tintArea, float intensity, int color) { @@ -129,21 +167,26 @@ public class QuickStatusBarHeader extends RelativeLayout } private void updateResources() { - updateAlphaAnimator(); + // Update height, especially due to landscape mode restricting space. + mHeaderTextContainerView.getLayoutParams().height = + mContext.getResources().getDimensionPixelSize(R.dimen.qs_header_tooltip_height); + mHeaderTextContainerView.setLayoutParams(mHeaderTextContainerView.getLayoutParams()); + + updateStatusIconAlphaAnimator(); + updateHeaderTextContainerAlphaAnimator(); } - private void updateAlphaAnimator() { - mAlphaAnimator = new TouchAnimator.Builder() + private void updateStatusIconAlphaAnimator() { + mStatusIconsAlphaAnimator = new TouchAnimator.Builder() .addFloat(mQuickQsStatusIcons, "alpha", 1, 0) .build(); } - public int getCollapsedHeight() { - return getHeight(); - } - - public int getExpandedHeight() { - return getHeight(); + private void updateHeaderTextContainerAlphaAnimator() { + mHeaderTextContainerAlphaAnimator = new TouchAnimator.Builder() + .addFloat(mHeaderTextContainerView, "alpha", 0, 1) + .setStartDelay(.5f) + .build(); } public void setExpanded(boolean expanded) { @@ -153,12 +196,49 @@ public class QuickStatusBarHeader extends RelativeLayout updateEverything(); } - public void setExpansion(float headerExpansionFraction) { - if (mAlphaAnimator != null ) { - mAlphaAnimator.setPosition(headerExpansionFraction); + /** + * Animates the inner contents based on the given expansion details. + * + * @param isKeyguardShowing whether or not we're showing the keyguard (a.k.a. lockscreen) + * @param expansionFraction how much the QS panel is expanded/pulled out (up to 1f) + * @param panelTranslationY how much the panel has physically moved down vertically (required + * for keyguard animations only) + */ + public void setExpansion(boolean isKeyguardShowing, float expansionFraction, + float panelTranslationY) { + final float keyguardExpansionFraction = isKeyguardShowing ? 1f : expansionFraction; + if (mStatusIconsAlphaAnimator != null) { + mStatusIconsAlphaAnimator.setPosition(keyguardExpansionFraction); + } + + if (isKeyguardShowing) { + // If the keyguard is showing, we want to offset the text so that it comes in at the + // same time as the panel as it slides down. + mHeaderTextContainerView.setTranslationY(panelTranslationY); + } else { + mHeaderTextContainerView.setTranslationY(0f); + } + + if (mHeaderTextContainerAlphaAnimator != null) { + mHeaderTextContainerAlphaAnimator.setPosition(keyguardExpansionFraction); + } + + // Check the original expansion fraction - we don't want to show the tooltip until the + // panel is pulled all the way out. + if (expansionFraction == 1f) { + // QS is fully expanded, bring in the tooltip. + showLongPressTooltip(); } } + /** Returns the latest stored tooltip shown count from SharedPreferences. */ + private int getStoredShownCount() { + return Prefs.getInt( + mContext, + Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, + TOOLTIP_NOT_YET_SHOWN_COUNT); + } + @Override public void disable(int state1, int state2, boolean animate) { final boolean disabled = (state2 & DISABLE2_QUICK_SETTINGS) != 0; @@ -191,6 +271,12 @@ public class QuickStatusBarHeader extends RelativeLayout } mHeaderQsPanel.setListening(listening); mListening = listening; + + if (listening) { + mAlarmController.addCallback(this); + } else { + mAlarmController.removeCallback(this); + } } @Override @@ -201,6 +287,125 @@ public class QuickStatusBarHeader extends RelativeLayout } } + @Override + public void onNextAlarmChanged(AlarmManager.AlarmClockInfo nextAlarm) { + mNextAlarmText = nextAlarm != null ? formatNextAlarm(mContext, nextAlarm) : null; + if (mNextAlarmText != null) { + hideLongPressTooltip(true /* shouldFadeInAlarmText */); + } else { + hideAlarmText(); + } + updateHeaderTextContainerAlphaAnimator(); + } + + /** + * Animates in the long press tooltip (as long as the next alarm text isn't currently occupying + * the space). + */ + public void showLongPressTooltip() { + // If we have alarm text to show, don't bother fading in the tooltip. + if (!TextUtils.isEmpty(mNextAlarmText)) { + return; + } + + if (mShownCount < MAX_TOOLTIP_SHOWN_COUNT) { + mLongPressTooltipView.animate().cancel(); + mLongPressTooltipView.setVisibility(View.VISIBLE); + mLongPressTooltipView.animate() + .alpha(1f) + .setDuration(FADE_ANIMATION_DURATION_MS) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mHandler.postDelayed( + mAutoFadeOutTooltipRunnable, AUTO_FADE_OUT_DELAY_MS); + } + }) + .start(); + + // Increment and drop the shown count in prefs for the next time we're deciding to + // fade in the tooltip. We first sanity check that the tooltip count hasn't changed yet + // in prefs (say, from a long press). + if (getStoredShownCount() <= mShownCount) { + Prefs.putInt(mContext, Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, ++mShownCount); + } + } + } + + /** + * Fades out the long press tooltip if it's partially visible - short circuits any running + * animation. Additionally has the ability to fade in the alarm info text. + * + * @param shouldShowAlarmText whether we should fade in the next alarm text + */ + private void hideLongPressTooltip(boolean shouldShowAlarmText) { + mLongPressTooltipView.animate().cancel(); + if (mLongPressTooltipView.getVisibility() == View.VISIBLE + && mLongPressTooltipView.getAlpha() != 0f) { + mHandler.removeCallbacks(mAutoFadeOutTooltipRunnable); + mLongPressTooltipView.animate() + .alpha(0f) + .setDuration(FADE_ANIMATION_DURATION_MS) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mLongPressTooltipView.setVisibility(View.INVISIBLE); + + if (shouldShowAlarmText) { + showAlarmText(); + } + } + }) + .start(); + } else { + mLongPressTooltipView.setVisibility(View.INVISIBLE); + + if (shouldShowAlarmText) { + showAlarmText(); + } + } + } + + /** + * Fades in the updated alarm text. Note that if there's already an alarm showing, this will + * immediately hide it and fade in the updated time. + */ + private void showAlarmText() { + mNextAlarmView.setAlpha(0f); + mNextAlarmView.setVisibility(View.VISIBLE); + mNextAlarmTextView.setText(mNextAlarmText); + + mNextAlarmView.animate() + .alpha(1f) + .setDuration(FADE_ANIMATION_DURATION_MS) + .start(); + } + + /** + * Fades out and hides the next alarm text. This also resets the text contents to null in + * preparation for the next alarm update. + */ + private void hideAlarmText() { + if (mNextAlarmView.getVisibility() == View.VISIBLE) { + mNextAlarmView.animate() + .alpha(0f) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + // Reset the alpha regardless of how the animation ends for the next + // time we show this view/want to animate it. + mNextAlarmView.setVisibility(View.INVISIBLE); + mNextAlarmView.setAlpha(1f); + mNextAlarmTextView.setText(null); + } + }) + .start(); + } else { + // Next alarm view is already hidden, only need to clear the text. + mNextAlarmTextView.setText(null); + } + } + public void updateEverything() { post(() -> setClickable(false)); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java index bf9746eafaf0..77c3bfab8de9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java @@ -23,7 +23,6 @@ import com.android.systemui.plugins.qs.*; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tiles.AirplaneModeTile; -import com.android.systemui.qs.tiles.AlarmTile; import com.android.systemui.qs.tiles.BatterySaverTile; import com.android.systemui.qs.tiles.BluetoothTile; import com.android.systemui.qs.tiles.CastTile; @@ -70,7 +69,6 @@ public class QSFactoryImpl implements QSFactory { else if (tileSpec.equals("saver")) return new DataSaverTile(mHost); else if (tileSpec.equals("night")) return new NightDisplayTile(mHost); else if (tileSpec.equals("nfc")) return new NfcTile(mHost); - else if (tileSpec.equals("alarm")) return new AlarmTile(mHost); // Intent tiles. else if (tileSpec.startsWith(IntentTile.PREFIX)) return IntentTile.create(mHost, tileSpec); else if (tileSpec.startsWith(CustomTile.PREFIX)) return CustomTile.create(mHost, tileSpec); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java index 016cbd6f6675..04dbb88adde0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java @@ -50,7 +50,7 @@ import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTile.State; import com.android.systemui.qs.PagedTileLayout.TilePage; import com.android.systemui.qs.QSHost; -import com.android.systemui.qs.QSTooltipView; +import com.android.systemui.qs.QuickStatusBarHeader; import java.util.ArrayList; @@ -197,7 +197,7 @@ public abstract class QSTileImpl<TState extends State> implements QSTile { Prefs.putInt( mContext, Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, - QSTooltipView.MAX_TOOLTIP_SHOWN_COUNT); + QuickStatusBarHeader.MAX_TOOLTIP_SHOWN_COUNT); } public LogMaker populate(LogMaker logMaker) { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.java deleted file mode 100644 index ff3fe731ad4f..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AlarmTile.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * 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 com.android.systemui.qs.tiles; - -import static android.service.quicksettings.Tile.STATE_ACTIVE; -import static android.service.quicksettings.Tile.STATE_UNAVAILABLE; - -import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.QS_ALARM; -import static com.android.systemui.keyguard.KeyguardSliceProvider.formatNextAlarm; - -import android.app.AlarmManager.AlarmClockInfo; -import android.app.PendingIntent; -import android.content.Intent; -import android.provider.AlarmClock; - -import com.android.systemui.Dependency; -import com.android.systemui.R; -import com.android.systemui.plugins.ActivityStarter; -import com.android.systemui.qs.QSTileHost; -import com.android.systemui.qs.tileimpl.QSTileImpl; -import com.android.systemui.statusbar.policy.NextAlarmController; -import com.android.systemui.statusbar.policy.NextAlarmController.NextAlarmChangeCallback; - -public class AlarmTile extends QSTileImpl implements NextAlarmChangeCallback { - private final NextAlarmController mController; - private String mNextAlarm; - private PendingIntent mIntent; - - public AlarmTile(QSTileHost host) { - super(host); - mController = Dependency.get(NextAlarmController.class); - } - - @Override - public State newTileState() { - return new BooleanState(); - } - - @Override - protected void handleClick() { - if (mIntent != null) { - Dependency.get(ActivityStarter.class).postStartActivityDismissingKeyguard(mIntent); - } - } - - @Override - protected void handleUpdateState(State state, Object arg) { - state.state = mNextAlarm != null ? STATE_ACTIVE : STATE_UNAVAILABLE; - state.label = getTileLabel(); - state.secondaryLabel = mNextAlarm; - state.icon = ResourceIcon.get(R.drawable.stat_sys_alarm); - ((BooleanState) state).value = mNextAlarm != null; - } - - @Override - public void onNextAlarmChanged(AlarmClockInfo nextAlarm) { - if (nextAlarm != null) { - mNextAlarm = formatNextAlarm(mContext, nextAlarm); - mIntent = nextAlarm.getShowIntent(); - } else { - mNextAlarm = null; - mIntent = null; - } - refreshState(); - } - - @Override - public int getMetricsCategory() { - return QS_ALARM; - } - - @Override - public Intent getLongClickIntent() { - return new Intent(AlarmClock.ACTION_SET_ALARM); - } - - @Override - protected void handleSetListening(boolean listening) { - if (listening) { - mController.addCallback(this); - } else { - mController.removeCallback(this); - } - } - - @Override - public CharSequence getTileLabel() { - return mContext.getString(R.string.status_bar_alarm); - } -}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java index 3597929229e6..5aace97faf6c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java @@ -16,12 +16,16 @@ package com.android.systemui.qs.tiles; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_MODE; + import android.annotation.Nullable; import android.app.ActivityManager; import android.content.Intent; +import android.metrics.LogMaker; import android.provider.Settings; import android.service.quicksettings.Tile; import android.support.annotation.StringRes; +import android.util.Log; import android.widget.Switch; import com.android.internal.app.ColorDisplayController; @@ -65,6 +69,15 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> @Override protected void handleClick() { + // Enroll in forced auto mode if eligible. + if ("1".equals(Settings.Global.getString(mContext.getContentResolver(), + Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE)) + && mController.getAutoModeRaw() == -1) { + mController.setAutoMode(ColorDisplayController.AUTO_MODE_CUSTOM); + Log.i("NightDisplayTile", "Enrolled in forced night display auto mode"); + } + + // Change current activation state. final boolean activated = !mState.value; mController.setActivated(activated); } @@ -147,6 +160,11 @@ public class NightDisplayTile extends QSTileImpl<BooleanState> } @Override + public LogMaker populate(LogMaker logMaker) { + return super.populate(logMaker).addTaggedData(FIELD_QS_MODE, mController.getAutoModeRaw()); + } + + @Override public Intent getLongClickIntent() { return new Intent(Settings.ACTION_NIGHT_DISPLAY_SETTINGS); } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java index 0272a9038ba8..842899b62635 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java @@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.Nullable; +import android.app.AppGlobals; import android.content.ComponentName; import android.content.Context; import android.content.pm.ActivityInfo; @@ -37,6 +38,7 @@ import android.graphics.drawable.RippleDrawable; import android.os.CountDownTimer; import android.support.v4.graphics.ColorUtils; import android.util.AttributeSet; +import android.util.IconDrawableFactory; import android.view.Gravity; import android.view.View; import android.view.ViewAnimationUtils; @@ -65,6 +67,8 @@ import com.android.systemui.shared.recents.model.Task; public class TaskViewHeader extends FrameLayout implements View.OnClickListener, View.OnLongClickListener { + private static IconDrawableFactory sDrawableFactory; + private static final float HIGHLIGHT_LIGHTNESS_INCREMENT = 0.075f; private static final float OVERLAY_LIGHTNESS_INCREMENT = -0.0625f; private static final int OVERLAY_REVEAL_DURATION = 250; @@ -628,7 +632,7 @@ public class TaskViewHeader extends FrameLayout activityInfo.applicationInfo, userId)); mAppTitleView.setTextColor(mTask.useLightOnPrimaryColor ? mTaskBarViewLightTextColor : mTaskBarViewDarkTextColor); - mAppIconView.setImageDrawable(ActivityManagerWrapper.getInstance().getBadgedApplicationIcon( + mAppIconView.setImageDrawable(getIconDrawableFactory().getBadgedIcon( activityInfo.applicationInfo, userId)); mAppInfoView.setImageDrawable(mTask.useLightOnPrimaryColor ? mLightInfoIcon @@ -671,4 +675,11 @@ public class TaskViewHeader extends FrameLayout revealAnim.start(); } } + + private static IconDrawableFactory getIconDrawableFactory() { + if (sDrawableFactory == null) { + sDrawableFactory = IconDrawableFactory.newInstance(AppGlobals.getInitialApplication()); + } + return sDrawableFactory; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 699e8cf145bc..380c08eb1738 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -152,7 +152,6 @@ public class KeyguardBouncer { mKeyguardView.requestLayout(); } mShowingSoon = false; - mKeyguardView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); } }; @@ -264,6 +263,7 @@ public class KeyguardBouncer { mStatusBarHeight = mRoot.getResources().getDimensionPixelOffset( com.android.systemui.R.dimen.status_bar_height); mRoot.setVisibility(View.INVISIBLE); + mRoot.setAccessibilityPaneTitle(mKeyguardView.getAccessibilityTitleForCurrentMode()); final WindowInsets rootInsets = mRoot.getRootWindowInsets(); if (rootInsets != null) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java index 389be1ad6d77..0cf26df7b377 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java @@ -19,11 +19,10 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.statusbar.notification.NotificationUtils.interpolate; import android.content.res.Resources; -import android.graphics.Path; import android.util.MathUtils; -import android.view.animation.AccelerateInterpolator; -import android.view.animation.PathInterpolator; +import com.android.keyguard.KeyguardStatusView; +import com.android.systemui.Interpolators; import com.android.systemui.R; /** @@ -31,54 +30,83 @@ import com.android.systemui.R; */ public class KeyguardClockPositionAlgorithm { - private static final float SLOW_DOWN_FACTOR = 0.4f; - - private static final float CLOCK_RUBBERBAND_FACTOR_MIN = 0.08f; - private static final float CLOCK_RUBBERBAND_FACTOR_MAX = 0.8f; - private static final float CLOCK_SCALE_FADE_START = 0.95f; - private static final float CLOCK_SCALE_FADE_END = 0.75f; - private static final float CLOCK_SCALE_FADE_END_NO_NOTIFS = 0.5f; - - private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MIN = 1.4f; - private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MAX = 3.2f; - private static final long MILLIS_PER_MINUTES = 1000 * 60; private static final float BURN_IN_PREVENTION_PERIOD_Y = 521; private static final float BURN_IN_PREVENTION_PERIOD_X = 83; + /** + * How much the clock height influences the shade position. + * 0 means nothing, 1 means move the shade up by the height of the clock + * 0.5f means move the shade up by half of the size of the clock. + */ + private static float CLOCK_HEIGHT_WEIGHT = 0.7f; + + /** + * Margin between the bottom of the clock and the notification shade. + */ private int mClockNotificationsMargin; - private float mClockYFractionMin; - private float mClockYFractionMax; - private int mMaxKeyguardNotifications; - private int mMaxPanelHeight; + + /** + * Current height of {@link NotificationPanelView}, considering how much the + * user collapsed it. + */ private float mExpandedHeight; - private int mNotificationCount; + + /** + * Height of the parent view - display size in px. + */ private int mHeight; + + /** + * Height of {@link KeyguardStatusView}. + */ private int mKeyguardStatusHeight; - private float mEmptyDragAmount; - private float mDensity; - private int mBurnInPreventionOffsetX; - private int mBurnInPreventionOffsetY; /** - * The number (fractional) of notifications the "more" card counts when calculating how many - * notifications are currently visible for the y positioning of the clock. + * Height of notification stack: Sum of height of each notification. + */ + private int mNotificationStackHeight; + + /** + * Minimum top margin to avoid overlap with status bar. */ - private float mMoreCardNotificationAmount; + private int mMinTopMargin; - private static final PathInterpolator sSlowDownInterpolator; + /** + * Maximum bottom padding to avoid overlap with {@link KeyguardBottomAreaView} or + * the ambient indication. + */ + private int mMaxShadeBottom; - static { - Path path = new Path(); - path.moveTo(0, 0); - path.cubicTo(0.3f, 0.875f, 0.6f, 1f, 1f, 1f); - sSlowDownInterpolator = new PathInterpolator(path); - } + /** + * Margin that we should respect within the available space. + */ + private int mContainerPadding; - private AccelerateInterpolator mAccelerateInterpolator = new AccelerateInterpolator(); - private int mClockBottom; + /** + * Position where clock should be when the panel is collapsed. + */ + private int mClockYTarget; + + /** + * @see NotificationPanelView#getMaxPanelHeight() + */ + private float mMaxPanelHeight; + + /** + * Burn-in prevention x translation. + */ + private int mBurnInPreventionOffsetX; + + /** + * Burn-in prevention y translation. + */ + private int mBurnInPreventionOffsetY; + + /** + * Doze/AOD transition amount. + */ private float mDarkAmount; - private int mDozingStackPadding; /** * Refreshes the dimension values. @@ -86,79 +114,95 @@ public class KeyguardClockPositionAlgorithm { public void loadDimens(Resources res) { mClockNotificationsMargin = res.getDimensionPixelSize( R.dimen.keyguard_clock_notifications_margin); - mClockYFractionMin = res.getFraction(R.fraction.keyguard_clock_y_fraction_min, 1, 1); - mClockYFractionMax = res.getFraction(R.fraction.keyguard_clock_y_fraction_max, 1, 1); - mMoreCardNotificationAmount = - (float) res.getDimensionPixelSize(R.dimen.notification_shelf_height) / - res.getDimensionPixelSize(R.dimen.notification_min_height); - mDensity = res.getDisplayMetrics().density; + mContainerPadding = res.getDimensionPixelSize( + R.dimen.keyguard_clock_top_margin); mBurnInPreventionOffsetX = res.getDimensionPixelSize( R.dimen.burn_in_prevention_offset_x); mBurnInPreventionOffsetY = res.getDimensionPixelSize( R.dimen.burn_in_prevention_offset_y); - mDozingStackPadding = res.getDimensionPixelSize(R.dimen.dozing_stack_padding); } - public void setup(int maxKeyguardNotifications, int maxPanelHeight, float expandedHeight, - int notificationCount, int height, int keyguardStatusHeight, float emptyDragAmount, - int clockBottom, float dark) { - mMaxKeyguardNotifications = maxKeyguardNotifications; - mMaxPanelHeight = maxPanelHeight; + public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight, + float expandedHeight, float maxPanelHeight, int parentHeight, int keyguardStatusHeight, + float dark) { + mMinTopMargin = minTopMargin; + mMaxShadeBottom = maxShadeBottom; + mNotificationStackHeight = notificationStackHeight; mExpandedHeight = expandedHeight; - mNotificationCount = notificationCount; - mHeight = height; + mMaxPanelHeight = maxPanelHeight; + mHeight = parentHeight; mKeyguardStatusHeight = keyguardStatusHeight; - mEmptyDragAmount = emptyDragAmount; - mClockBottom = clockBottom; mDarkAmount = dark; - } - public float getMinStackScrollerPadding(int height, int keyguardStatusHeight) { - return mClockYFractionMin * height + keyguardStatusHeight / 2 - + mClockNotificationsMargin; + // Where the clock should stop when swiping up. + // This should be outside of the display when unlocked or + // under then status bar when the bouncer will be shown + mClockYTarget = -mKeyguardStatusHeight; + // TODO: on bouncer animation follow-up CL + // mClockYTarget = mMinTopMargin + mContainerPadding; } public void run(Result result) { - int y = getClockY() - mKeyguardStatusHeight / 2; - float clockAdjustment = getClockYExpansionAdjustment(); - float topPaddingAdjMultiplier = getTopPaddingAdjMultiplier(); - result.stackScrollerPaddingAdjustment = (int) (clockAdjustment*topPaddingAdjMultiplier); + final int y = getClockY(); result.clockY = y; - int clockNotificationsPadding = mClockNotificationsMargin - + result.stackScrollerPaddingAdjustment; - int padding = y + clockNotificationsPadding; - result.clockScale = getClockScale(mKeyguardStatusHeight + padding, - y, y + mClockNotificationsMargin + mKeyguardStatusHeight); - result.clockAlpha = getClockAlpha(result.clockScale); - - result.stackScrollerPadding = mClockBottom + y + mDozingStackPadding; + result.clockAlpha = getClockAlpha(y); + result.stackScrollerPadding = y + mKeyguardStatusHeight; result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount); } - private float getClockScale(int notificationPadding, int clockY, int startPadding) { - float scaleMultiplier = getNotificationAmountT() == 0 ? 6.0f : 5.0f; - float scaleEnd = clockY - mKeyguardStatusHeight * scaleMultiplier; - float distanceToScaleEnd = notificationPadding - scaleEnd; - float progress = distanceToScaleEnd / (startPadding - scaleEnd); - progress = Math.max(0.0f, Math.min(progress, 1.0f)); - progress = mAccelerateInterpolator.getInterpolation(progress); - progress *= Math.pow(1 + mEmptyDragAmount / mDensity / 300, 0.3f); - return interpolate(progress, 1, mDarkAmount); + public float getMinStackScrollerPadding() { + return mMinTopMargin + mKeyguardStatusHeight + mClockNotificationsMargin; + } + + private int getMaxClockY() { + return mHeight / 2 - mKeyguardStatusHeight - mClockNotificationsMargin; } - private float getClockYFraction() { - float t = getNotificationAmountT(); - t = Math.min(t, 1.0f); - return MathUtils.lerp(mClockYFractionMax, mClockYFractionMin, t); + public int getExpandedClockBottom() { + return getExpandedClockPosition() + mKeyguardStatusHeight; + } + + /** + * Vertically align the clock and the shade in the available space considering only + * a percentage of the clock height defined by {@code CLOCK_HEIGHT_WEIGHT}. + * @return Clock Y in pixels. + */ + private int getExpandedClockPosition() { + final int availableHeight = mMaxShadeBottom - mMinTopMargin; + final int containerCenter = mMinTopMargin + availableHeight / 2; + + float y = containerCenter - mKeyguardStatusHeight * CLOCK_HEIGHT_WEIGHT + - mClockNotificationsMargin - mNotificationStackHeight / 2; + if (y < mMinTopMargin + mContainerPadding) { + y = mMinTopMargin + mContainerPadding; + } + + // Don't allow the clock base to be under half of the screen + final float maxClockY = getMaxClockY(); + if (y > maxClockY) { + y = maxClockY; + } + + return (int) y; } private int getClockY() { // Dark: Align the bottom edge of the clock at about half of the screen: - float clockYDark = (mClockYFractionMax * mHeight + - (float) mKeyguardStatusHeight / 2 - mClockBottom) - + burnInPreventionOffsetY(); - float clockYRegular = getClockYFraction() * mHeight; - return (int) interpolate(clockYRegular, clockYDark, mDarkAmount); + final float clockYDark = getMaxClockY() + burnInPreventionOffsetY(); + float clockYRegular = getExpandedClockPosition(); + + // Move clock up while collapsing the shade + final float shadeExpansion = mExpandedHeight / mMaxPanelHeight; + final float clockY = MathUtils.lerp(mClockYTarget, clockYRegular, shadeExpansion); + + return (int) MathUtils.lerp(clockY, clockYDark, mDarkAmount); + } + + private float getClockAlpha(int y) { + float alphaKeyguard = Math.max(0, Math.min(1, (y - mMinTopMargin) + / Math.max(1f, getExpandedClockPosition() - mMinTopMargin))); + alphaKeyguard = Interpolators.ACCELERATE.getInterpolation(alphaKeyguard); + return MathUtils.lerp(alphaKeyguard, 1f, mDarkAmount); } private float burnInPreventionOffsetY() { @@ -190,61 +234,17 @@ public class KeyguardClockPositionAlgorithm { return interpolate(0, amplitude, interpolationAmount); } - private float getClockYExpansionAdjustment() { - float rubberbandFactor = getClockYExpansionRubberbandFactor(); - float value = (rubberbandFactor * (mMaxPanelHeight - mExpandedHeight)); - float t = value / mMaxPanelHeight; - float slowedDownValue = -sSlowDownInterpolator.getInterpolation(t) * SLOW_DOWN_FACTOR - * mMaxPanelHeight; - if (mNotificationCount == 0) { - return (-2*value + slowedDownValue)/3; - } else { - return slowedDownValue; - } - } - - private float getClockYExpansionRubberbandFactor() { - float t = getNotificationAmountT(); - t = Math.min(t, 1.0f); - t = (float) Math.pow(t, 0.3f); - return (1 - t) * CLOCK_RUBBERBAND_FACTOR_MAX + t * CLOCK_RUBBERBAND_FACTOR_MIN; - } - - private float getTopPaddingAdjMultiplier() { - float t = getNotificationAmountT(); - t = Math.min(t, 1.0f); - return (1 - t) * CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MIN - + t * CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MAX; - } - - private float getClockAlpha(float scale) { - float fadeEnd = getNotificationAmountT() == 0.0f - ? CLOCK_SCALE_FADE_END_NO_NOTIFS - : CLOCK_SCALE_FADE_END; - float alpha = (scale - fadeEnd) - / (CLOCK_SCALE_FADE_START - fadeEnd); - return Math.max(0, Math.min(1, alpha)); - } - - /** - * @return a value from 0 to 1 depending on how many notification there are - */ - private float getNotificationAmountT() { - return mNotificationCount - / (mMaxKeyguardNotifications + mMoreCardNotificationAmount); - } - public static class Result { /** - * The y translation of the clock. + * The x translation of the clock. */ - public int clockY; + public int clockX; /** - * The scale of the Clock + * The y translation of the clock. */ - public float clockScale; + public int clockY; /** * The alpha value of the clock. @@ -255,14 +255,5 @@ public class KeyguardClockPositionAlgorithm { * The top padding of the stack scroller, in pixels. */ public int stackScrollerPadding; - - /** - * The top padding adjustment of the stack scroller, in pixels. This value is used to adjust - * the padding, but not the overall panel size. - */ - public int stackScrollerPaddingAdjustment; - - /** The x translation of the clock. */ - public int clockX; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java index 09acf3e4b53b..2375b6a07bf6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java @@ -87,10 +87,10 @@ public class KeyguardStatusBarView extends RelativeLayout super.onFinishInflate(); mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container); mSystemIconsContainer = findViewById(R.id.system_icons_container); - mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch); - mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar); - mCarrierLabel = (TextView) findViewById(R.id.keyguard_carrier_text); - mBatteryView = (BatteryMeterView) mSystemIconsContainer.findViewById(R.id.battery); + mMultiUserSwitch = findViewById(R.id.multi_user_switch); + mMultiUserAvatar = findViewById(R.id.multi_user_avatar); + mCarrierLabel = findViewById(R.id.keyguard_carrier_text); + mBatteryView = mSystemIconsContainer.findViewById(R.id.battery); loadDimens(); updateUserSwitcher(); @@ -220,7 +220,7 @@ public class KeyguardStatusBarView extends RelativeLayout Dependency.get(ConfigurationController.class).addCallback(this); mIconManager = new TintedIconManager(findViewById(R.id.statusIcons)); Dependency.get(StatusBarIconController.class).addIconGroup(mIconManager); - onOverlayChanged(); + onThemeChanged(); } @Override @@ -291,12 +291,9 @@ public class KeyguardStatusBarView extends RelativeLayout .setDuration(300) .setStartDelay(0) .setInterpolator(Interpolators.ALPHA_OUT) - .withEndAction(new Runnable() { - @Override - public void run() { - mMultiUserSwitch.setAlpha(1f); - getOverlay().remove(mMultiUserSwitch); - } + .withEndAction(() -> { + mMultiUserSwitch.setAlpha(1f); + getOverlay().remove(mMultiUserSwitch); }) .start(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java index dc400e63394b..62151cfa258b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java @@ -115,6 +115,8 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100; private final static int ROTATE_BUTTON_LOOP_DURATION_MS = 2000; + private static final int NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION = 3; + /** Allow some time inbetween the long press for back and recents. */ private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200; @@ -156,6 +158,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false); private Animator mRotateHideAnimator; + private ViewRippler mViewRippler = new ViewRippler(); private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() { @Override @@ -167,6 +170,9 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void onRecentsAnimationStarted() { mNavigationBarView.setRecentsAnimationStarted(true); + + // Use navbar dragging as a signal to hide the rotate button + setRotateSuggestionButtonState(false); } @Override @@ -446,10 +452,11 @@ public class NavigationBarFragment extends Fragment implements Callbacks { } if (visible) { // Appear and change (cannot force) - // Stop any currently running hide animations + // Stop and clear any currently running hide animations if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { - mRotateHideAnimator.pause(); + mRotateHideAnimator.cancel(); } + mRotateHideAnimator = null; // Reset the alpha if any has changed due to hide animation view.setAlpha(1f); @@ -460,12 +467,16 @@ public class NavigationBarFragment extends Fragment implements Callbacks { animIcon.start(); } + if (!isRotateSuggestionIntroduced()) mViewRippler.start(view); + // Set visibility, may fail if a11y service is active. // If invisible, call will stop animation. mNavigationBarView.setRotateButtonVisibility(true); } else { // Hide + mViewRippler.stop(); // Prevent any pending ripples, force hide or not + if (force) { // If a hide animator is running stop it and make invisible if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) { @@ -515,6 +526,25 @@ public class NavigationBarFragment extends Fragment implements Callbacks { return 6000; } + private boolean isRotateSuggestionIntroduced() { + ContentResolver cr = getContext().getContentResolver(); + return Settings.Secure.getInt(cr, Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED, 0) + >= NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION; + } + + private void incrementNumAcceptedRotationSuggestionsIfNeeded() { + // Get the number of accepted suggestions + ContentResolver cr = getContext().getContentResolver(); + final int numSuggestions = Settings.Secure.getInt(cr, + Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED, 0); + + // Increment the number of accepted suggestions only if it would change intro mode + if (numSuggestions < NUM_ACCEPTED_ROTATION_SUGGESTIONS_FOR_INTRODUCTION) { + Settings.Secure.putInt(cr, Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED, + numSuggestions + 1); + } + } + // Injected from StatusBar at creation. public void setCurrentSysuiVisibility(int systemUiVisibility) { mSystemUiVisibility = systemUiVisibility; @@ -580,8 +610,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private boolean shouldDisableNavbarGestures() { return !mStatusBar.isDeviceProvisioned() - || (mDisabledFlags1 & StatusBarManager.DISABLE_SEARCH) != 0 - || mNavigationBarView.getRecentsButton().getVisibility() != View.VISIBLE; + || (mDisabledFlags1 & StatusBarManager.DISABLE_SEARCH) != 0; } private void repositionNavigationBar() { @@ -600,13 +629,10 @@ public class NavigationBarFragment extends Fragment implements Callbacks { // Change the cancel pin gesture to home and back if recents button is invisible boolean recentsVisible = mNavigationBarView.isRecentsButtonVisible(); - ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); ButtonDispatcher backButton = mNavigationBarView.getBackButton(); if (recentsVisible) { - homeButton.setOnLongClickListener(this::onHomeLongClick); backButton.setOnLongClickListener(this::onLongPressBackRecents); } else { - homeButton.setOnLongClickListener(this::onLongPressBackHome); backButton.setOnLongClickListener(this::onLongPressBackHome); } } @@ -629,6 +655,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { ButtonDispatcher homeButton = mNavigationBarView.getHomeButton(); homeButton.setOnTouchListener(this::onHomeTouch); + homeButton.setOnLongClickListener(this::onHomeLongClick); ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton(); accessibilityButton.setOnClickListener(this::onAccessibilityClick); @@ -681,6 +708,9 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @VisibleForTesting boolean onHomeLongClick(View v) { + if (!mNavigationBarView.isRecentsButtonVisible() && mNavigationBarView.inScreenPinning()) { + return onLongPressBackHome(v); + } if (shouldDisableNavbarGestures()) { return false; } @@ -857,6 +887,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks { private void onRotateSuggestionClick(View v) { mMetricsLogger.action(MetricsEvent.ACTION_ROTATION_SUGGESTION_ACCEPTED); + incrementNumAcceptedRotationSuggestionsIfNeeded(); mRotationLockController.setRotationLockedAtAngle(true, mLastRotationSuggestion); } @@ -978,8 +1009,40 @@ public class NavigationBarFragment extends Fragment implements Callbacks { @Override public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) { - setRotateSuggestionButtonState(false); + // Only hide the icon if the top task changes its requestedOrientation + // Launcher can alter its requestedOrientation while it's not on top, don't hide on this + final boolean top = ActivityManagerWrapper.getInstance().getRunningTask().id == taskId; + if (top) setRotateSuggestionButtonState(false); + } + } + + private class ViewRippler { + private static final int RIPPLE_OFFSET_MS = 50; + private static final int RIPPLE_INTERVAL_MS = 2000; + private View mRoot; + + public void start(View root) { + stop(); // Stop any pending ripple animations + + mRoot = root; + + // Schedule pending ripples, offset the 1st to avoid problems with visibility change + mRoot.postOnAnimationDelayed(mRipple, RIPPLE_OFFSET_MS); + mRoot.postOnAnimationDelayed(mRipple, RIPPLE_INTERVAL_MS); + mRoot.postOnAnimationDelayed(mRipple, 2*RIPPLE_INTERVAL_MS); + } + + public void stop() { + if (mRoot != null) mRoot.removeCallbacks(mRipple); } + + private final Runnable mRipple = new Runnable() { + @Override + public void run() { // Cause the ripple to fire via false presses + mRoot.setPressed(true); + mRoot.setPressed(false); + } + }; } public static View create(Context context, FragmentListener listener) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java index 57d78ddde4dc..320b56f98c85 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java @@ -149,7 +149,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture } public boolean onInterceptTouchEvent(MotionEvent event) { - if (mNavigationBarView.inScreenPinning()) { + if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()) { return false; } @@ -182,7 +182,7 @@ public class NavigationBarGestureHelper implements TunerService.Tunable, Gesture } public boolean onTouchEvent(MotionEvent event) { - if (mNavigationBarView.inScreenPinning()) { + if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()) { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 3b129fc5e08d..9d2480b22460 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -37,6 +37,7 @@ import android.graphics.Rect; import android.os.PowerManager; import android.util.AttributeSet; import android.util.FloatProperty; +import android.util.Log; import android.util.MathUtils; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -172,7 +173,6 @@ public class NotificationPanelView extends PanelView implements private Animator mClockAnimator; private int mClockAnimationTargetX = Integer.MIN_VALUE; private int mClockAnimationTargetY = Integer.MIN_VALUE; - private int mTopPaddingAdjustment; private KeyguardClockPositionAlgorithm mClockPositionAlgorithm = new KeyguardClockPositionAlgorithm(); private KeyguardClockPositionAlgorithm.Result mClockPositionResult = @@ -205,7 +205,6 @@ public class NotificationPanelView extends PanelView implements private int mQsFalsingThreshold; private float mKeyguardStatusBarAnimateAlpha = 1f; - private float mQsClockAlphaOverride = 1f; private int mOldLayoutDirection; private HeadsUpTouchHelper mHeadsUpTouchHelper; private boolean mIsExpansionFromHeadsUp; @@ -244,6 +243,7 @@ public class NotificationPanelView extends PanelView implements private int mQsNotificationTopPadding; private float mExpandOffset; private boolean mHideIconsDuringNotificationLaunch = true; + private int mStackScrollerMeasuringPass; public NotificationPanelView(Context context, AttributeSet attrs) { super(context, attrs); @@ -459,17 +459,17 @@ public class NotificationPanelView extends PanelView implements if (mStatusBarState != StatusBarState.KEYGUARD) { stackScrollerPadding = (mQs != null ? mQs.getHeader().getHeight() : 0) + mQsPeekHeight + mQsNotificationTopPadding; - mTopPaddingAdjustment = 0; } else { + final int totalHeight = getHeight(); + final int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding); mClockPositionAlgorithm.setup( - mStatusBar.getMaxNotificationsWhileLocked(), - getMaxPanelHeight(), + mStatusBarMinHeight, + totalHeight - bottomPadding, + calculatePanelHeightShade() - mNotificationStackScroller.getTopPadding(), getExpandedHeight(), - mNotificationStackScroller.getNotGoneChildCount(), - getHeight(), + getMaxPanelHeight(), + totalHeight, mKeyguardStatusView.getHeight(), - mEmptyDragAmount, - mKeyguardStatusView.getClockBottom(), mDarkAmount); mClockPositionAlgorithm.run(mClockPositionResult); if (animate || mClockAnimator != null) { @@ -478,14 +478,16 @@ public class NotificationPanelView extends PanelView implements mKeyguardStatusView.setX(mClockPositionResult.clockX); mKeyguardStatusView.setY(mClockPositionResult.clockY); } - updateClock(mClockPositionResult.clockAlpha, mClockPositionResult.clockScale); + updateClock(); stackScrollerPadding = mClockPositionResult.stackScrollerPadding; - mTopPaddingAdjustment = mClockPositionResult.stackScrollerPaddingAdjustment; } mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding); mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX); mKeyguardBottomArea.setBurnInXOffset(mClockPositionResult.clockX); + + mStackScrollerMeasuringPass++; requestScrollerTopPaddingUpdate(animate); + mStackScrollerMeasuringPass = 0; } /** @@ -493,8 +495,7 @@ public class NotificationPanelView extends PanelView implements * @return the maximum keyguard notifications that can fit on the screen */ public int computeMaxKeyguardNotifications(int maximum) { - float minPadding = mClockPositionAlgorithm.getMinStackScrollerPadding(getHeight(), - mKeyguardStatusView.getHeight()); + float minPadding = mClockPositionAlgorithm.getMinStackScrollerPadding(); int notificationPadding = Math.max(1, getResources().getDimensionPixelSize( R.dimen.notification_divider_height)); NotificationShelf shelf = mNotificationStackScroller.getNotificationShelf(); @@ -579,12 +580,10 @@ public class NotificationPanelView extends PanelView implements }); } - private void updateClock(float alpha, float scale) { + private void updateClock() { if (!mKeyguardStatusViewAnimating) { - mKeyguardStatusView.setAlpha(alpha * mQsClockAlphaOverride); + mKeyguardStatusView.setAlpha(mClockPositionResult.clockAlpha); } - mKeyguardStatusView.setScaleX(scale); - mKeyguardStatusView.setScaleY(scale); } public void animateToFullShade(long delay) { @@ -1310,15 +1309,6 @@ public class NotificationPanelView extends PanelView implements mQsNavbarScrim.setAlpha(getQsExpansionFraction()); } - // Fade clock when QS is on top of it - float newClockAlpha = (height - mKeyguardStatusView.getY()) / - mKeyguardStatusView.getHeight(); - newClockAlpha = 1 - MathUtils.constrain(newClockAlpha, 0, 1); - if (newClockAlpha != mQsClockAlphaOverride) { - mQsClockAlphaOverride = Interpolators.ALPHA_OUT.getInterpolation(newClockAlpha); - updateClock(mClockPositionResult.clockAlpha, mClockPositionResult.clockScale); - } - if (mAccessibilityManager.isEnabled()) { setAccessibilityPaneTitle(determineAccessibilityPaneTitle()); } @@ -1356,15 +1346,15 @@ public class NotificationPanelView extends PanelView implements && (mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted)) { // Either QS pushes the notifications down when fully expanded, or QS is fully above the - // notifications (mostly on tablets). maxNotifications denotes the normal top padding - // on Keyguard, maxQs denotes the top padding from the quick settings panel. We need to - // take the maximum and linearly interpolate with the panel expansion for a nice motion. - int maxNotifications = mClockPositionResult.stackScrollerPadding - - mClockPositionResult.stackScrollerPaddingAdjustment; - int maxQs = mQsMaxExpansionHeight + mQsNotificationTopPadding; + // notifications (mostly on tablets). maxNotificationPadding denotes the normal top + // padding on Keyguard, maxQsPadding denotes the top padding from the quick settings + // panel. We need to take the maximum and linearly interpolate with the panel expansion + // for a nice motion. + int maxNotificationPadding = mClockPositionResult.stackScrollerPadding; + int maxQsPadding = mQsMaxExpansionHeight + mQsNotificationTopPadding; int max = mStatusBarState == StatusBarState.KEYGUARD - ? Math.max(maxNotifications, maxQs) - : maxQs; + ? Math.max(maxNotificationPadding, maxQsPadding) + : maxQsPadding; return (int) interpolate(getExpandedFraction(), mQsMinExpansionHeight, max); } else if (mQsSizeChangeAnimator != null) { @@ -1507,7 +1497,7 @@ public class NotificationPanelView extends PanelView implements if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) { maxHeight = calculatePanelHeightQsExpanded(); } else { - maxHeight = calculatePanelHeightShade(); + maxHeight = Math.max(calculatePanelHeightShade(), calculatePanelHeightShadeExpanded()); } maxHeight = Math.max(maxHeight, min); return maxHeight; @@ -1524,7 +1514,15 @@ public class NotificationPanelView extends PanelView implements @Override protected void onHeightUpdated(float expandedHeight) { if (!mQsExpanded || mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted) { - positionClockAndNotifications(); + // Updating the clock position will set the top padding which might + // trigger a new panel height and re-position the clock. + // This is a circular dependency and should be avoided, otherwise we'll have + // a stack overflow. + if (mStackScrollerMeasuringPass > 2) { + if (DEBUG) Log.d(TAG, "Unstable notification panel height. Aborting."); + } else { + positionClockAndNotifications(); + } } if (mQsExpandImmediate || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null && !mQsExpansionFromOverscroll) { @@ -1568,12 +1566,18 @@ public class NotificationPanelView extends PanelView implements private int calculatePanelHeightShade() { int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin(); - int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin - - mTopPaddingAdjustment; + int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin; maxHeight += mNotificationStackScroller.getTopPaddingOverflow(); return maxHeight; } + private int calculatePanelHeightShadeExpanded() { + return mNotificationStackScroller.getHeight() + - mNotificationStackScroller.getEmptyBottomMargin() + - mNotificationStackScroller.getTopPadding() + + mClockPositionAlgorithm.getExpandedClockBottom(); + } + private int calculatePanelHeightQsExpanded() { float notificationHeight = mNotificationStackScroller.getHeight() - mNotificationStackScroller.getEmptyBottomMargin() @@ -1598,8 +1602,7 @@ public class NotificationPanelView extends PanelView implements } float totalHeight = Math.max( maxQsHeight, mStatusBarState == StatusBarState.KEYGUARD - ? mClockPositionResult.stackScrollerPadding - mTopPaddingAdjustment - : 0) + ? mClockPositionResult.stackScrollerPadding : 0) + notificationHeight + mNotificationStackScroller.getTopPaddingOverflow(); if (totalHeight > mNotificationStackScroller.getHeight()) { float fullyCollapsedHeight = maxQsHeight @@ -2272,8 +2275,9 @@ public class NotificationPanelView extends PanelView implements } @Override - protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (DEBUG) { Paint p = new Paint(); p.setColor(Color.RED); @@ -2288,6 +2292,9 @@ public class NotificationPanelView extends PanelView implements p.setColor(Color.YELLOW); canvas.drawLine(0, calculatePanelHeightShade(), getWidth(), calculatePanelHeightShade(), p); + p.setColor(Color.GRAY); + canvas.drawLine(0, calculatePanelHeightShadeExpanded(), getWidth(), + calculatePanelHeightShadeExpanded(), p); p.setColor(Color.MAGENTA); canvas.drawLine(0, calculateQsTopPadding(), getWidth(), calculateQsTopPadding(), p); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 747a551defe6..c326feeb3d52 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -762,20 +762,31 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (action.equals(AudioManager.RINGER_MODE_CHANGED_ACTION) || - action.equals(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION)) { - updateVolumeZen(); - } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { - updateSimState(intent); - } else if (action.equals(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED)) { - updateTTY(intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE, - TelecomManager.TTY_MODE_OFF)); - } else if (action.equals(Intent.ACTION_MANAGED_PROFILE_AVAILABLE) || - action.equals(Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE) || - action.equals(Intent.ACTION_MANAGED_PROFILE_REMOVED)) { - updateManagedProfile(); - } else if (action.equals(AudioManager.ACTION_HEADSET_PLUG)) { - updateHeadsetPlug(intent); + switch (action) { + case AudioManager.RINGER_MODE_CHANGED_ACTION: + case AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION: + updateVolumeZen(); + break; + case TelephonyIntents.ACTION_SIM_STATE_CHANGED: + // Avoid rebroadcast because SysUI is direct boot aware. + if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, + false)) { + break; + } + updateSimState(intent); + break; + case TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED: + updateTTY(intent.getIntExtra(TelecomManager.EXTRA_CURRENT_TTY_MODE, + TelecomManager.TTY_MODE_OFF)); + break; + case Intent.ACTION_MANAGED_PROFILE_AVAILABLE: + case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE: + case Intent.ACTION_MANAGED_PROFILE_REMOVED: + updateManagedProfile(); + break; + case AudioManager.ACTION_HEADSET_PLUG: + updateHeadsetPlug(intent); + break; } } }; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java index dc0ea1cba653..00aff53595ff 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java @@ -124,9 +124,10 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene @Override public void onAnimationEnd(Animator animation) { mNavigationBarView.getHomeButton().setClickable(true); - mHomeButtonView = null; mQuickScrubActive = false; mTranslation = 0; + mQuickScrubEndAnimator.setCurrentPlayTime(mQuickScrubEndAnimator.getDuration()); + mHomeButtonView = null; } }; @@ -147,8 +148,7 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene mIsVertical ? (absVelY > velocityX) : (velocityX > absVelY); if (isValidFling) { mDraggingActive = false; - mButtonAnimator.setIntValues((int) mTranslation, 0); - mButtonAnimator.start(); + animateEnd(); mHandler.removeCallbacks(mLongPressRunnable); try { final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy(); @@ -176,8 +176,10 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene mTrackAnimator = ObjectAnimator.ofFloat(); mTrackAnimator.addUpdateListener(mTrackAnimatorListener); + mTrackAnimator.setFloatValues(0); mButtonAnimator = ObjectAnimator.ofInt(); mButtonAnimator.addUpdateListener(mButtonTranslationListener); + mButtonAnimator.setIntValues(0); mQuickScrubEndAnimator = new AnimatorSet(); mQuickScrubEndAnimator.playTogether(mTrackAnimator, mButtonAnimator); mQuickScrubEndAnimator.setDuration(ANIM_DURATION_MS); @@ -226,7 +228,7 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene int x = (int) event.getX(); int y = (int) event.getY(); // End any existing quickscrub animations before starting the new transition - if (mQuickScrubEndAnimator != null) { + if (mHomeButtonView != null) { mQuickScrubEndAnimator.end(); } mHomeButtonView = homeButton.getCurrentView(); @@ -380,7 +382,7 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene } private void startQuickScrub() { - if (!mQuickScrubActive) { + if (!mQuickScrubActive && mDraggingActive) { mQuickScrubActive = true; mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light); mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark); @@ -394,15 +396,16 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene } catch (RemoteException e) { Log.e(TAG, "Failed to send start of quick scrub.", e); } + } else { + // After long press do not allow quick scrub/switch + mTouchDownX = -1; } } private void endQuickScrub(boolean animate) { mHandler.removeCallbacks(mLongPressRunnable); if (mDraggingActive || mQuickScrubActive) { - mButtonAnimator.setIntValues((int) mTranslation, 0); - mTrackAnimator.setFloatValues(mTrackAlpha, 0); - mQuickScrubEndAnimator.start(); + animateEnd(); try { mOverviewEventSender.getProxy().onQuickScrubEnd(); if (DEBUG_OVERVIEW_PROXY) { @@ -411,9 +414,9 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene } catch (RemoteException e) { Log.e(TAG, "Failed to send end of quick scrub.", e); } - if (!animate) { - mQuickScrubEndAnimator.end(); - } + } + if (mHomeButtonView != null && !animate) { + mQuickScrubEndAnimator.end(); } mDraggingActive = false; } @@ -430,6 +433,13 @@ public class QuickScrubController extends GestureDetector.SimpleOnGestureListene mHandler.removeCallbacks(mLongPressRunnable); } + private void animateEnd() { + mButtonAnimator.setIntValues((int) mTranslation, 0); + mTrackAnimator.setFloatValues(mTrackAlpha, 0); + mQuickScrubEndAnimator.setCurrentPlayTime(0); + mQuickScrubEndAnimator.start(); + } + private int getDimensionPixelSize(Context context, @DimenRes int resId) { return context.getResources().getDimensionPixelSize(resId); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 255e5e48dbae..d8d388c4be08 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -167,6 +167,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private Callback mCallback; private boolean mWallpaperSupportsAmbientMode; private boolean mScreenOn; + private float mNotificationDensity; // Scrim blanking callbacks private Choreographer.FrameCallback mPendingFrameCallback; @@ -251,7 +252,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mCurrentInFrontTint = state.getFrontTint(); mCurrentBehindTint = state.getBehindTint(); mCurrentInFrontAlpha = state.getFrontAlpha(); - mCurrentBehindAlpha = state.getBehindAlpha(); + mCurrentBehindAlpha = state.getBehindAlpha(mNotificationDensity); applyExpansionToAlpha(); // Cancel blanking transitions that were pending before we requested a new state @@ -396,12 +397,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, // Either darken of make the scrim transparent when you // pull down the shade float interpolatedFract = getInterpolatedFraction(); + float alphaBehind = mState.getBehindAlpha(mNotificationDensity); if (mDarkenWhileDragging) { - mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, - mScrimBehindAlphaKeyguard, interpolatedFract); + mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, alphaBehind, + interpolatedFract); mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED; } else { - mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard, + mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; } @@ -415,15 +417,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, public void setNotificationCount(int notificationCount) { final float maxNotificationDensity = 3; float notificationDensity = Math.min(notificationCount / maxNotificationDensity, 1f); - float newAlpha = MathUtils.map(0, 1, - GRADIENT_SCRIM_ALPHA, GRADIENT_SCRIM_ALPHA_BUSY, - notificationDensity); - if (mScrimBehindAlphaKeyguard != newAlpha) { - mScrimBehindAlphaKeyguard = newAlpha; + if (mNotificationDensity == notificationDensity) { + return; + } + mNotificationDensity = notificationDensity; - if (mState == ScrimState.KEYGUARD || mState == ScrimState.BOUNCER) { - scheduleUpdate(); - } + if (mState == ScrimState.KEYGUARD) { + applyExpansionToAlpha(); + scheduleUpdate(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index 381e4af31853..053c5a3b5966 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.graphics.Color; import android.os.Trace; +import android.util.MathUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.statusbar.ScrimView; @@ -55,6 +56,13 @@ public enum ScrimState { mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; mCurrentInFrontAlpha = 0; } + + @Override + public float getBehindAlpha(float busynessFactor) { + return MathUtils.map(0 /* start */, 1 /* stop */, + ScrimController.GRADIENT_SCRIM_ALPHA, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, + busynessFactor); + } }, /** @@ -183,7 +191,7 @@ public enum ScrimState { return mCurrentInFrontAlpha; } - public float getBehindAlpha() { + public float getBehindAlpha(float busyness) { return mCurrentBehindAlpha; } 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 4ffe5fe019c0..933c952903cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -4985,7 +4985,7 @@ public class StatusBar extends SystemUI implements DemoMode, notificationKey)) { // Show work challenge, do not run PendingIntent and // remove notification - collapsePanel(); + collapseOnMainThread(); return; } } @@ -5026,11 +5026,7 @@ public class StatusBar extends SystemUI implements DemoMode, } } if (shouldCollapse()) { - if (Looper.getMainLooper().isCurrentThread()) { - collapsePanel(); - } else { - mStackScroller.post(this::collapsePanel); - } + collapseOnMainThread(); } try { @@ -5058,6 +5054,14 @@ public class StatusBar extends SystemUI implements DemoMode, }, afterKeyguardGone); } + private void collapseOnMainThread() { + if (Looper.getMainLooper().isCurrentThread()) { + collapsePanel(); + } else { + mStackScroller.post(this::collapsePanel); + } + } + private boolean shouldCollapse() { return mState != StatusBarState.SHADE || !mActivityLaunchAnimator.isAnimationPending(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java index a011952f1476..06a56ffdfb77 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.policy; import android.annotation.NonNull; +import android.content.res.Resources; import android.util.ArraySet; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -111,10 +112,10 @@ public class BrightnessMirrorController public void updateResources() { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mBrightnessMirror.getLayoutParams(); - lp.width = mBrightnessMirror.getResources().getDimensionPixelSize( - R.dimen.qs_panel_width); - lp.gravity = mBrightnessMirror.getResources().getInteger( - R.integer.notification_panel_layout_gravity); + Resources r = mBrightnessMirror.getResources(); + lp.width = r.getDimensionPixelSize(R.dimen.qs_panel_width); + lp.height = r.getDimensionPixelSize(R.dimen.brightness_mirror_height); + lp.gravity = r.getInteger(R.integer.notification_panel_layout_gravity); mBrightnessMirror.setLayoutParams(lp); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index baf0ebf5efaa..53637425401b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -403,54 +403,62 @@ public class NetworkControllerImpl extends BroadcastReceiver Log.d(TAG, "onReceive: intent=" + intent); } final String action = intent.getAction(); - if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION) || - action.equals(ConnectivityManager.INET_CONDITION_ACTION)) { - updateConnectivity(); - } else if (action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)) { - refreshLocale(); - updateAirplaneMode(false); - } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED)) { - // We are using different subs now, we might be able to make calls. - recalculateEmergency(); - } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED)) { - // Notify every MobileSignalController so they can know whether they are the - // data sim or not. - for (int i = 0; i < mMobileSignalControllers.size(); i++) { - MobileSignalController controller = mMobileSignalControllers.valueAt(i); - controller.handleBroadcast(intent); - } - } else if (action.equals(TelephonyIntents.ACTION_SIM_STATE_CHANGED)) { - // Might have different subscriptions now. - updateMobileControllers(); - } else if (action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) { - mLastServiceState = ServiceState.newFromBundle(intent.getExtras()); - if (mMobileSignalControllers.size() == 0) { - // If none of the subscriptions are active, we might need to recalculate - // emergency state. + switch (action) { + case ConnectivityManager.CONNECTIVITY_ACTION: + case ConnectivityManager.INET_CONDITION_ACTION: + updateConnectivity(); + break; + case Intent.ACTION_AIRPLANE_MODE_CHANGED: + refreshLocale(); + updateAirplaneMode(false); + break; + case TelephonyIntents.ACTION_DEFAULT_VOICE_SUBSCRIPTION_CHANGED: + // We are using different subs now, we might be able to make calls. recalculateEmergency(); - } - } else if (action.equals(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) { - mConfig = Config.readConfig(mContext); - mReceiverHandler.post(new Runnable() { - @Override - public void run() { - handleConfigurationChanged(); + break; + case TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED: + // Notify every MobileSignalController so they can know whether they are the + // data sim or not. + for (int i = 0; i < mMobileSignalControllers.size(); i++) { + MobileSignalController controller = mMobileSignalControllers.valueAt(i); + controller.handleBroadcast(intent); + } + break; + case TelephonyIntents.ACTION_SIM_STATE_CHANGED: + // Avoid rebroadcast because SysUI is direct boot aware. + if (intent.getBooleanExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, false)) { + break; + } + // Might have different subscriptions now. + updateMobileControllers(); + break; + case TelephonyIntents.ACTION_SERVICE_STATE_CHANGED: + mLastServiceState = ServiceState.newFromBundle(intent.getExtras()); + if (mMobileSignalControllers.size() == 0) { + // If none of the subscriptions are active, we might need to recalculate + // emergency state. + recalculateEmergency(); } - }); - } else { - int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, - SubscriptionManager.INVALID_SUBSCRIPTION_ID); - if (SubscriptionManager.isValidSubscriptionId(subId)) { - if (mMobileSignalControllers.indexOfKey(subId) >= 0) { - mMobileSignalControllers.get(subId).handleBroadcast(intent); + break; + case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: + mConfig = Config.readConfig(mContext); + mReceiverHandler.post(this::handleConfigurationChanged); + break; + default: + int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, + SubscriptionManager.INVALID_SUBSCRIPTION_ID); + if (SubscriptionManager.isValidSubscriptionId(subId)) { + if (mMobileSignalControllers.indexOfKey(subId) >= 0) { + mMobileSignalControllers.get(subId).handleBroadcast(intent); + } else { + // Can't find this subscription... We must be out of date. + updateMobileControllers(); + } } else { - // Can't find this subscription... We must be out of date. - updateMobileControllers(); + // No sub id, must be for the wifi. + mWifiSignalController.handleBroadcast(intent); } - } else { - // No sub id, must be for the wifi. - mWifiSignalController.handleBroadcast(intent); - } + break; } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java index d74a59e75933..a794e1977891 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java @@ -461,7 +461,7 @@ public class RemoteInputView extends LinearLayout implements View.OnClickListene @Override protected void onVisibilityChanged(View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); - if (changedView == this) { + if (changedView == this && mOnVisibilityChangedListener != null) { mOnVisibilityChangedListener.accept(visibility == VISIBLE); } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java deleted file mode 100644 index 6ed07f8d2c37..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java +++ /dev/null @@ -1,534 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.volume; - -import static android.support.v7.media.MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTED; -import static android.support.v7.media.MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTING; -import static android.support.v7.media.MediaRouter.UNSELECT_REASON_DISCONNECTED; - -import static com.android.settingslib.bluetooth.Utils.getBtClassDrawableWithDescription; - -import android.app.Dialog; -import android.bluetooth.BluetoothClass; -import android.bluetooth.BluetoothDevice; -import android.bluetooth.BluetoothProfile; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.net.wifi.WifiManager; -import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.SystemClock; -import android.support.v7.media.MediaControlIntent; -import android.support.v7.media.MediaRouteSelector; -import android.support.v7.media.MediaRouter; -import android.telecom.TelecomManager; -import android.util.Log; -import android.util.Pair; -import android.view.Window; -import android.view.WindowManager; - -import com.android.internal.logging.MetricsLogger; -import com.android.internal.logging.nano.MetricsProto; -import com.android.settingslib.Utils; -import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.systemui.Dependency; -import com.android.systemui.HardwareUiLayout; -import com.android.systemui.Interpolators; -import com.android.systemui.R; -import com.android.systemui.plugins.VolumeDialogController; -import com.android.systemui.statusbar.policy.BluetoothController; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; - -public class OutputChooserDialog extends Dialog - implements DialogInterface.OnDismissListener, OutputChooserLayout.Callback { - - private static final String TAG = Util.logTag(OutputChooserDialog.class); - private static final int MAX_DEVICES = 10; - - private static final long UPDATE_DELAY_MS = 300L; - private static final int MSG_UPDATE_ITEMS = 1; - - private final Context mContext; - private final BluetoothController mBluetoothController; - private WifiManager mWifiManager; - private OutputChooserLayout mView; - private final MediaRouterWrapper mRouter; - private final MediaRouterCallback mRouterCallback; - private long mLastUpdateTime; - static final boolean INCLUDE_MEDIA_ROUTES = false; - private boolean mIsInCall; - protected boolean isAttached; - - private final MediaRouteSelector mRouteSelector; - private Drawable mDefaultIcon; - private Drawable mTvIcon; - private Drawable mSpeakerIcon; - private Drawable mSpeakerGroupIcon; - private HardwareUiLayout mHardwareLayout; - private final VolumeDialogController mController; - - public OutputChooserDialog(Context context, MediaRouterWrapper router) { - super(context, com.android.systemui.R.style.qs_theme); - mContext = context; - mBluetoothController = Dependency.get(BluetoothController.class); - mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - TelecomManager tm = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); - mIsInCall = tm.isInCall(); - mRouter = router; - mRouterCallback = new MediaRouterCallback(); - mRouteSelector = new MediaRouteSelector.Builder() - .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) - .build(); - - final IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); - context.registerReceiver(mReceiver, filter); - - mController = Dependency.get(VolumeDialogController.class); - - // Window initialization - Window window = getWindow(); - window.requestFeature(Window.FEATURE_NO_TITLE); - window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND - | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - window.addFlags( - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL - | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED - | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH - | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); - window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY); - } - - protected void setIsInCall(boolean inCall) { - mIsInCall = inCall; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.output_chooser); - setCanceledOnTouchOutside(true); - setOnDismissListener(this::onDismiss); - - mView = findViewById(R.id.output_chooser); - mHardwareLayout = HardwareUiLayout.get(mView); - mHardwareLayout.setOutsideTouchListener(view -> dismiss()); - mHardwareLayout.setSwapOrientation(false); - mView.setCallback(this); - - if (mIsInCall) { - mView.setTitle(R.string.output_calls_title); - } else { - mView.setTitle(R.string.output_title); - } - - mDefaultIcon = mContext.getDrawable(R.drawable.ic_cast); - mTvIcon = mContext.getDrawable(R.drawable.ic_tv); - mSpeakerIcon = mContext.getDrawable(R.drawable.ic_speaker); - mSpeakerGroupIcon = mContext.getDrawable(R.drawable.ic_speaker_group); - - final boolean wifiOff = !mWifiManager.isWifiEnabled(); - final boolean btOff = !mBluetoothController.isBluetoothEnabled(); - if (wifiOff && btOff) { - mView.setEmptyState(getDisabledServicesMessage(wifiOff, btOff)); - } - // time out after 5 seconds - mView.postDelayed(() -> updateItems(true), 5000); - } - - protected void cleanUp() {} - - - @Override - protected void onStart() { - super.onStart(); - } - - @Override - public void onAttachedToWindow() { - super.onAttachedToWindow(); - - if (!mIsInCall && INCLUDE_MEDIA_ROUTES) { - mRouter.addCallback(mRouteSelector, mRouterCallback, - MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN); - } - mBluetoothController.addCallback(mCallback); - mController.addCallback(mControllerCallbackH, mHandler); - isAttached = true; - } - - @Override - public void onDetachedFromWindow() { - isAttached = false; - mRouter.removeCallback(mRouterCallback); - mController.removeCallback(mControllerCallbackH); - mBluetoothController.removeCallback(mCallback); - super.onDetachedFromWindow(); - } - - @Override - public void onDismiss(DialogInterface unused) { - mContext.unregisterReceiver(mReceiver); - cleanUp(); - } - - @Override - public void show() { - super.show(); - Dependency.get(MetricsLogger.class).visible(MetricsProto.MetricsEvent.OUTPUT_CHOOSER); - mHardwareLayout.setTranslationX(getAnimTranslation()); - mHardwareLayout.setAlpha(0); - mHardwareLayout.animate() - .alpha(1) - .translationX(0) - .setDuration(300) - .setInterpolator(Interpolators.FAST_OUT_SLOW_IN) - .withEndAction(() -> getWindow().getDecorView().requestAccessibilityFocus()) - .start(); - } - - @Override - public void dismiss() { - Dependency.get(MetricsLogger.class).hidden(MetricsProto.MetricsEvent.OUTPUT_CHOOSER); - mHardwareLayout.setTranslationX(0); - mHardwareLayout.setAlpha(1); - mHardwareLayout.animate() - .alpha(0) - .translationX(getAnimTranslation()) - .setDuration(300) - .withEndAction(() -> super.dismiss()) - .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator()) - .start(); - } - - private float getAnimTranslation() { - return getContext().getResources().getDimension( - com.android.systemui.R.dimen.output_chooser_panel_width) / 2; - } - - @Override - public void onDetailItemClick(OutputChooserLayout.Item item) { - if (item == null || item.tag == null) return; - if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_BT) { - final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag; - if (device.getMaxConnectionState() == BluetoothProfile.STATE_DISCONNECTED) { - Dependency.get(MetricsLogger.class).action( - MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_CONNECT); - mBluetoothController.connect(device); - } - } else if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER) { - final MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) item.tag; - if (route.isEnabled()) { - Dependency.get(MetricsLogger.class).action( - MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_CONNECT); - route.select(); - } - } - } - - @Override - public void onDetailItemDisconnect(OutputChooserLayout.Item item) { - if (item == null || item.tag == null) return; - if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_BT) { - final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag; - Dependency.get(MetricsLogger.class).action( - MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_DISCONNECT); - mBluetoothController.disconnect(device); - } else if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER) { - Dependency.get(MetricsLogger.class).action( - MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_DISCONNECT); - mRouter.unselect(UNSELECT_REASON_DISCONNECTED); - } - } - - private void updateItems(boolean timeout) { - if (SystemClock.uptimeMillis() - mLastUpdateTime < UPDATE_DELAY_MS) { - mHandler.removeMessages(MSG_UPDATE_ITEMS); - mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_UPDATE_ITEMS, timeout), - mLastUpdateTime + UPDATE_DELAY_MS); - return; - } - mLastUpdateTime = SystemClock.uptimeMillis(); - if (mView == null) return; - ArrayList<OutputChooserLayout.Item> items = new ArrayList<>(); - - // Add bluetooth devices - addBluetoothDevices(items); - - // Add remote displays - if (!mIsInCall && INCLUDE_MEDIA_ROUTES) { - addRemoteDisplayRoutes(items); - } - - items.sort(ItemComparator.sInstance); - - if (items.size() == 0 && timeout) { - String emptyMessage = mContext.getString(R.string.output_none_found); - final boolean wifiOff = !mWifiManager.isWifiEnabled(); - final boolean btOff = !mBluetoothController.isBluetoothEnabled(); - if (wifiOff || btOff) { - emptyMessage = getDisabledServicesMessage(wifiOff, btOff); - } - mView.setEmptyState(emptyMessage); - } - - mView.setItems(items.toArray(new OutputChooserLayout.Item[items.size()])); - } - - private String getDisabledServicesMessage(boolean wifiOff, boolean btOff) { - return mContext.getString(R.string.output_none_found_service_off, - wifiOff && btOff ? mContext.getString(R.string.output_service_bt_wifi) - : wifiOff ? mContext.getString(R.string.output_service_wifi) - : mContext.getString(R.string.output_service_bt)); - } - - private void addBluetoothDevices(List<OutputChooserLayout.Item> items) { - final Collection<CachedBluetoothDevice> devices = mBluetoothController.getDevices(); - if (devices != null) { - int connectedDevices = 0; - int count = 0; - for (CachedBluetoothDevice device : devices) { - if (mBluetoothController.getBondState(device) == BluetoothDevice.BOND_NONE) continue; - final int majorClass = device.getBtClass().getMajorDeviceClass(); - if (majorClass != BluetoothClass.Device.Major.AUDIO_VIDEO - && majorClass != BluetoothClass.Device.Major.UNCATEGORIZED) { - continue; - } - final OutputChooserLayout.Item item = new OutputChooserLayout.Item(); - item.iconResId = R.drawable.ic_qs_bluetooth_on; - item.line1 = device.getName(); - item.tag = device; - item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_BT; - int state = device.getMaxConnectionState(); - if (state == BluetoothProfile.STATE_CONNECTED) { - item.iconResId = R.drawable.ic_qs_bluetooth_connected; - int batteryLevel = device.getBatteryLevel(); - if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) { - Pair<Drawable, String> pair = - getBtClassDrawableWithDescription(getContext(), device); - item.icon = pair.first; - item.line2 = mContext.getString( - R.string.quick_settings_connected_battery_level, - Utils.formatPercentage(batteryLevel)); - } else { - item.line2 = mContext.getString(R.string.quick_settings_connected); - } - item.canDisconnect = true; - items.add(connectedDevices, item); - connectedDevices++; - } else if (state == BluetoothProfile.STATE_CONNECTING) { - item.iconResId = R.drawable.ic_qs_bluetooth_connecting; - item.line2 = mContext.getString(R.string.quick_settings_connecting); - items.add(connectedDevices, item); - } else { - items.add(item); - } - if (++count == MAX_DEVICES) { - break; - } - } - } - } - - private void addRemoteDisplayRoutes(List<OutputChooserLayout.Item> items) { - List<MediaRouter.RouteInfo> routes = mRouter.getRoutes(); - for(MediaRouter.RouteInfo route : routes) { - if (route.isDefaultOrBluetooth() || !route.isEnabled() - || !route.matchesSelector(mRouteSelector)) { - continue; - } - final OutputChooserLayout.Item item = new OutputChooserLayout.Item(); - item.icon = getIconDrawable(route); - item.line1 = route.getName(); - item.tag = route; - item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER; - if (route.getConnectionState() == CONNECTION_STATE_CONNECTING) { - mContext.getString(R.string.quick_settings_connecting); - } else { - item.line2 = route.getDescription(); - } - - if (route.getConnectionState() == CONNECTION_STATE_CONNECTED) { - item.canDisconnect = true; - } - items.add(item); - } - } - - private Drawable getIconDrawable(MediaRouter.RouteInfo route) { - Uri iconUri = route.getIconUri(); - if (iconUri != null) { - try { - InputStream is = getContext().getContentResolver().openInputStream(iconUri); - Drawable drawable = Drawable.createFromStream(is, null); - if (drawable != null) { - return drawable; - } - } catch (IOException e) { - Log.w(TAG, "Failed to load " + iconUri, e); - // Falls back. - } - } - return getDefaultIconDrawable(route); - } - - private Drawable getDefaultIconDrawable(MediaRouter.RouteInfo route) { - // If the type of the receiver device is specified, use it. - switch (route.getDeviceType()) { - case MediaRouter.RouteInfo.DEVICE_TYPE_TV: - return mTvIcon; - case MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER: - return mSpeakerIcon; - } - - // Otherwise, make the best guess based on other route information. - if (route instanceof MediaRouter.RouteGroup) { - // Only speakers can be grouped for now. - return mSpeakerGroupIcon; - } - return mDefaultIcon; - } - - private final class MediaRouterCallback extends MediaRouter.Callback { - @Override - public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) { - updateItems(false); - } - - @Override - public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) { - updateItems(false); - } - - @Override - public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) { - updateItems(false); - } - - @Override - public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) { - updateItems(false); - } - } - - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) { - if (D.BUG) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS"); - cancel(); - cleanUp(); - } - } - }; - - private final BluetoothController.Callback mCallback = new BluetoothController.Callback() { - @Override - public void onBluetoothStateChange(boolean enabled) { - updateItems(false); - } - - @Override - public void onBluetoothDevicesChanged() { - updateItems(false); - } - }; - - static final class ItemComparator implements Comparator<OutputChooserLayout.Item> { - public static final ItemComparator sInstance = new ItemComparator(); - - @Override - public int compare(OutputChooserLayout.Item lhs, OutputChooserLayout.Item rhs) { - // Connected item(s) first - if (lhs.canDisconnect != rhs.canDisconnect) { - return Boolean.compare(rhs.canDisconnect, lhs.canDisconnect); - } - // Bluetooth items before media routes - if (lhs.deviceType != rhs.deviceType) { - return Integer.compare(lhs.deviceType, rhs.deviceType); - } - // then by name - return lhs.line1.toString().compareToIgnoreCase(rhs.line1.toString()); - } - } - - private final Handler mHandler = new Handler() { - @Override - public void handleMessage(Message message) { - switch (message.what) { - case MSG_UPDATE_ITEMS: - updateItems((Boolean) message.obj); - break; - } - } - }; - - private final VolumeDialogController.Callbacks mControllerCallbackH - = new VolumeDialogController.Callbacks() { - @Override - public void onShowRequested(int reason) { - dismiss(); - } - - @Override - public void onDismissRequested(int reason) {} - - @Override - public void onScreenOff() { - dismiss(); - } - - @Override - public void onStateChanged(VolumeDialogController.State state) {} - - @Override - public void onLayoutDirectionChanged(int layoutDirection) {} - - @Override - public void onConfigurationChanged() {} - - @Override - public void onShowVibrateHint() {} - - @Override - public void onShowSilentHint() {} - - @Override - public void onShowSafetyWarning(int flags) {} - - @Override - public void onAccessibilityModeChanged(Boolean showA11yStream) {} - - @Override - public void onConnectedDeviceChanged(String deviceName) {} - }; -}
\ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java deleted file mode 100644 index d4c6f897846e..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.volume; - -import android.content.Context; -import android.content.res.Configuration; -import android.graphics.drawable.Drawable; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.android.systemui.FontSizeUtils; -import com.android.systemui.R; -import com.android.systemui.qs.AutoSizingList; - -/** - * Limited height list of devices. - */ -public class OutputChooserLayout extends LinearLayout { - private static final String TAG = "OutputChooserLayout"; - private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - - private final Context mContext; - private final H mHandler = new H(); - private final Adapter mAdapter = new Adapter(); - - private String mTag; - private Callback mCallback; - private boolean mItemsVisible = true; - private AutoSizingList mItemList; - private View mEmpty; - private TextView mEmptyText; - private TextView mTitle; - - private Item[] mItems; - - public OutputChooserLayout(Context context, AttributeSet attrs) { - super(context, attrs); - mContext = context; - mTag = TAG; - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - mItemList = findViewById(android.R.id.list); - mItemList.setVisibility(GONE); - mItemList.setAdapter(mAdapter); - mEmpty = findViewById(android.R.id.empty); - mEmpty.setVisibility(GONE); - mEmptyText = mEmpty.findViewById(R.id.empty_text); - mTitle = findViewById(R.id.title); - } - - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - FontSizeUtils.updateFontSize(mEmptyText, R.dimen.qs_detail_empty_text_size); - int count = mItemList.getChildCount(); - for (int i = 0; i < count; i++) { - View item = mItemList.getChildAt(i); - FontSizeUtils.updateFontSize(item, R.id.empty_text, - R.dimen.qs_detail_item_primary_text_size); - FontSizeUtils.updateFontSize(item, android.R.id.summary, - R.dimen.qs_detail_item_secondary_text_size); - FontSizeUtils.updateFontSize(item, android.R.id.title, - R.dimen.qs_detail_header_text_size); - } - } - - public void setTitle(int title) { - mTitle.setText(title); - } - - public void setEmptyState(String text) { - mEmptyText.setText(text); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - if (DEBUG) Log.d(mTag, "onAttachedToWindow"); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (DEBUG) Log.d(mTag, "onDetachedFromWindow"); - mCallback = null; - } - - public void setCallback(Callback callback) { - mHandler.removeMessages(H.SET_CALLBACK); - mHandler.obtainMessage(H.SET_CALLBACK, callback).sendToTarget(); - } - - public void setItems(Item[] items) { - mHandler.removeMessages(H.SET_ITEMS); - mHandler.obtainMessage(H.SET_ITEMS, items).sendToTarget(); - } - - public void setItemsVisible(boolean visible) { - mHandler.removeMessages(H.SET_ITEMS_VISIBLE); - mHandler.obtainMessage(H.SET_ITEMS_VISIBLE, visible ? 1 : 0, 0).sendToTarget(); - } - - private void handleSetCallback(Callback callback) { - mCallback = callback; - } - - private void handleSetItems(Item[] items) { - final int itemCount = items != null ? items.length : 0; - mEmpty.setVisibility(itemCount == 0 ? VISIBLE : GONE); - mItemList.setVisibility(itemCount == 0 ? GONE : VISIBLE); - mItems = items; - mAdapter.notifyDataSetChanged(); - } - - private void handleSetItemsVisible(boolean visible) { - if (mItemsVisible == visible) return; - mItemsVisible = visible; - for (int i = 0; i < mItemList.getChildCount(); i++) { - mItemList.getChildAt(i).setVisibility(mItemsVisible ? VISIBLE : INVISIBLE); - } - } - - private class Adapter extends BaseAdapter { - - @Override - public int getCount() { - return mItems != null ? mItems.length : 0; - } - - @Override - public Object getItem(int position) { - return mItems[position]; - } - - @Override - public long getItemId(int position) { - return 0; - } - - @Override - public View getView(int position, View view, ViewGroup parent) { - final Item item = mItems[position]; - if (view == null) { - view = LayoutInflater.from(mContext).inflate(R.layout.output_chooser_item, parent, - false); - } - view.setVisibility(mItemsVisible ? VISIBLE : INVISIBLE); - final ImageView iv = view.findViewById(android.R.id.icon); - if (item.icon != null) { - iv.setImageDrawable(item.icon); - } else { - iv.setImageResource(item.iconResId); - } - final TextView title = view.findViewById(android.R.id.title); - title.setText(item.line1); - final TextView summary = view.findViewById(android.R.id.summary); - final boolean twoLines = !TextUtils.isEmpty(item.line2); - title.setMaxLines(twoLines ? 1 : 2); - summary.setVisibility(twoLines ? VISIBLE : GONE); - summary.setText(twoLines ? item.line2 : null); - view.setOnClickListener(v -> { - if (mCallback != null) { - mCallback.onDetailItemClick(item); - } - }); - - final ImageView icon2 = view.findViewById(android.R.id.icon2); - if (item.canDisconnect) { - icon2.setImageResource(R.drawable.ic_qs_cancel); - icon2.setVisibility(VISIBLE); - icon2.setClickable(true); - icon2.setOnClickListener(v -> { - if (mCallback != null) { - mCallback.onDetailItemDisconnect(item); - } - }); - } else if (item.icon2 != -1) { - icon2.setVisibility(VISIBLE); - icon2.setImageResource(item.icon2); - icon2.setClickable(false); - } else { - icon2.setVisibility(GONE); - } - - return view; - } - }; - - private class H extends Handler { - private static final int SET_ITEMS = 1; - private static final int SET_CALLBACK = 2; - private static final int SET_ITEMS_VISIBLE = 3; - - public H() { - super(Looper.getMainLooper()); - } - - @Override - public void handleMessage(Message msg) { - if (msg.what == SET_ITEMS) { - handleSetItems((Item[]) msg.obj); - } else if (msg.what == SET_CALLBACK) { - handleSetCallback((OutputChooserLayout.Callback) msg.obj); - } else if (msg.what == SET_ITEMS_VISIBLE) { - handleSetItemsVisible(msg.arg1 != 0); - } - } - } - - public static class Item { - public static int DEVICE_TYPE_BT = 1; - public static int DEVICE_TYPE_MEDIA_ROUTER = 2; - public int iconResId; - public Drawable icon; - public Drawable overlay; - public CharSequence line1; - public CharSequence line2; - public Object tag; - public boolean canDisconnect; - public int icon2 = -1; - public int deviceType = 0; - } - - public interface Callback { - void onDetailItemClick(Item item); - void onDetailItemDisconnect(Item item); - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 3c29b7740102..7c71b2a058f5 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -110,11 +110,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa private boolean mShowA11yStream; private boolean mShowVolumeDialog; private boolean mShowSafetyWarning; - private DeviceCallback mDeviceCallback = new DeviceCallback(); private final NotificationManager mNotificationManager; - @GuardedBy("mLock") - private List<AudioDeviceInfo> mConnectedDevices = new ArrayList<>(); - private Object mLock = new Object(); private boolean mDestroyed; private VolumePolicy mVolumePolicy; @@ -192,7 +188,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } catch (SecurityException e) { Log.w(TAG, "No access to media sessions", e); } - mAudio.registerAudioDeviceCallback(mDeviceCallback, mWorker); } public void setVolumePolicy(VolumePolicy policy) { @@ -218,7 +213,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mMediaSessions.destroy(); mObserver.destroy(); mReceiver.destroy(); - mAudio.unregisterAudioDeviceCallback(mDeviceCallback); mWorkerThread.quitSafely(); } @@ -842,18 +836,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa }); } } - - @Override - public void onConnectedDeviceChanged(String deviceName) { - for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) { - entry.getValue().post(new Runnable() { - @Override - public void run() { - entry.getKey().onConnectedDeviceChanged(deviceName); - } - }); - } - } } @@ -1060,33 +1042,6 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } } - protected final class DeviceCallback extends AudioDeviceCallback { - public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) { - synchronized (mLock) { - for (AudioDeviceInfo info : addedDevices) { - if (info.isSink() - && (info.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP - || info.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_SCO)) { - mConnectedDevices.add(info); - mCallbacks.onConnectedDeviceChanged(info.getProductName().toString()); - } - } - } - } - - public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) { - synchronized (mLock) { - for (AudioDeviceInfo info : removedDevices) { - mConnectedDevices.remove(info); - } - - if (mConnectedDevices.size() == 0) { - mCallbacks.onConnectedDeviceChanged(null); - } - } - } - } - public interface UserActivityListener { void onUserActivity(); } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 1e8e98ca2e42..90a9fc877fea 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -18,22 +18,22 @@ package com.android.systemui.volume; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK; import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC; +import static android.media.AudioManager.RINGER_MODE_MAX; +import static android.media.AudioManager.RINGER_MODE_NORMAL; +import static android.media.AudioManager.RINGER_MODE_SILENT; +import static android.media.AudioManager.RINGER_MODE_VIBRATE; import static android.media.AudioManager.STREAM_ACCESSIBILITY; -import static com.android.systemui.volume.Events.DISMISS_REASON_OUTPUT_CHOOSER; import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED; -import static com.android.systemui.volume.Events.DISMISS_REASON_TOUCH_OUTSIDE; import android.accessibilityservice.AccessibilityServiceInfo; import android.animation.ObjectAnimator; -import android.annotation.NonNull; import android.annotation.SuppressLint; import android.app.Dialog; import android.app.KeyguardManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Color; @@ -48,9 +48,7 @@ import android.os.Message; import android.os.SystemClock; import android.provider.Settings; import android.provider.Settings.Global; -import android.support.v7.media.MediaRouter; import android.text.InputFilter; -import android.text.TextUtils; import android.util.Log; import android.util.Slog; import android.util.SparseBooleanArray; @@ -60,7 +58,6 @@ import android.view.MotionEvent; import android.view.View; import android.view.View.AccessibilityDelegate; import android.view.View.OnAttachStateChangeListener; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; @@ -72,9 +69,11 @@ import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; +import android.widget.Toast; import com.android.settingslib.Utils; import com.android.systemui.Dependency; +import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.VolumeDialog; @@ -108,18 +107,16 @@ public class VolumeDialogImpl implements VolumeDialog { private CustomDialog mDialog; private ViewGroup mDialogView; private ViewGroup mDialogRowsView; - private ViewGroup mFooter; + private ViewGroup mRinger; private ImageButton mRingerIcon; + private ImageButton mSettingsIcon; private ImageView mZenIcon; - private TextView mRingerStatus; - private TextView mRingerTitle; private final List<VolumeRow> mRows = new ArrayList<>(); private ConfigurableTexts mConfigurableTexts; private final SparseBooleanArray mDynamic = new SparseBooleanArray(); private final KeyguardManager mKeyguard; private final AccessibilityManagerWrapper mAccessibilityMgr; private final Object mSafetyWarningLock = new Object(); - private final Object mOutputChooserLock = new Object(); private final Accessibility mAccessibility = new Accessibility(); private final ColorStateList mActiveSliderTint; private final ColorStateList mInactiveSliderTint; @@ -133,7 +130,6 @@ public class VolumeDialogImpl implements VolumeDialog { private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE; private State mState; private SafetyWarningDialog mSafetyWarning; - private OutputChooserDialog mOutputChooserDialog; private boolean mHovering = false; public VolumeDialogImpl(Context context) { @@ -215,11 +211,10 @@ public class VolumeDialogImpl implements VolumeDialog { uiLayout.updateRotation(); mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows); - mFooter = mDialog.findViewById(R.id.footer); - mRingerIcon = mFooter.findViewById(R.id.ringer_icon); - mRingerStatus = mFooter.findViewById(R.id.ringer_status); - mRingerTitle = mFooter.findViewById(R.id.ringer_title); - mZenIcon = mFooter.findViewById(R.id.dnd_icon); + mRinger = mDialog.findViewById(R.id.ringer); + mRingerIcon = mRinger.findViewById(R.id.ringer_icon); + mZenIcon = mRinger.findViewById(R.id.dnd_icon); + mSettingsIcon = mDialog.findViewById(R.id.settings); if (mRows.isEmpty()) { addRow(AudioManager.STREAM_MUSIC, @@ -244,6 +239,7 @@ public class VolumeDialogImpl implements VolumeDialog { updateRowsH(getActiveRow()); initRingerH(); + initSettingsH(); } protected ViewGroup getDialogView() { @@ -358,10 +354,6 @@ public class VolumeDialogImpl implements VolumeDialog { row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); row.anim = null; - row.outputChooser = row.view.findViewById(R.id.output_chooser); - row.outputChooser.setOnClickListener(mClickOutputChooser); - row.connectedDevice = row.view.findViewById(R.id.volume_row_connected_device); - row.icon = row.view.findViewById(R.id.volume_row_icon); row.icon.setImageResource(iconRes); if (row.stream != AudioSystem.STREAM_ACCESSIBILITY) { @@ -396,6 +388,15 @@ public class VolumeDialogImpl implements VolumeDialog { } } + public void initSettingsH() { + mSettingsIcon.setOnClickListener(v -> { + Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + dismissH(DISMISS_REASON_SETTINGS_CLICKED); + Dependency.get(ActivityStarter.class).startActivity(intent, true /* dismissShade */); + }); + } + public void initRingerH() { mRingerIcon.setOnClickListener(v -> { Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, AudioManager.STREAM_RING, @@ -406,34 +407,55 @@ public class VolumeDialogImpl implements VolumeDialog { } // normal -> vibrate -> silent -> normal (skip vibrate if device doesn't have // a vibrator. + int newRingerMode; final boolean hasVibrator = mController.hasVibrator(); if (mState.ringerModeInternal == AudioManager.RINGER_MODE_NORMAL) { if (hasVibrator) { mController.vibrate(); - mController.setRingerMode(AudioManager.RINGER_MODE_VIBRATE, false); + newRingerMode = AudioManager.RINGER_MODE_VIBRATE; } else { - mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false); + newRingerMode = AudioManager.RINGER_MODE_SILENT; } } else if (mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) { - mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false); + newRingerMode = AudioManager.RINGER_MODE_SILENT; } else { - mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false); + newRingerMode = AudioManager.RINGER_MODE_NORMAL; if (ss.level == 0) { mController.setStreamVolume(AudioManager.STREAM_RING, 1); } } updateRingerH(); - }); - mRingerIcon.setOnLongClickListener(v -> { - Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - dismissH(DISMISS_REASON_SETTINGS_CLICKED); - Dependency.get(ActivityStarter.class).startActivity(intent, true /* dismissShade */); - return true; + + mController.setRingerMode(newRingerMode, false); + maybeShowToastH(newRingerMode); }); updateRingerH(); } + private void maybeShowToastH(int newRingerMode) { + int seenToastCount = Prefs.getInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, 0); + + if (seenToastCount > VolumePrefs.SHOW_RINGER_TOAST_COUNT) { + return; + } + int toastText; + switch (newRingerMode) { + case RINGER_MODE_NORMAL: + toastText = R.string.volume_dialog_ringer_guidance_ring; + break; + case RINGER_MODE_SILENT: + toastText = R.string.volume_dialog_ringer_guidance_silent; + break; + case RINGER_MODE_VIBRATE: + default: + toastText = R.string.volume_dialog_ringer_guidance_vibrate; + } + + Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show(); + seenToastCount++; + Prefs.putInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, seenToastCount); + } + public void show(int reason) { mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget(); } @@ -501,15 +523,6 @@ public class VolumeDialogImpl implements VolumeDialog { } } - private boolean isAttached() { - return mDialogView != null && mDialogView.isAttachedToWindow(); - } - - private boolean hasTouchFeature() { - final PackageManager pm = mContext.getPackageManager(); - return pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN); - } - private boolean shouldBeVisibleH(VolumeRow row, VolumeRow activeRow) { boolean isActive = row == activeRow; if (row.stream == AudioSystem.STREAM_ACCESSIBILITY) { @@ -536,20 +549,12 @@ public class VolumeDialogImpl implements VolumeDialog { final boolean isActive = row == activeRow; final boolean shouldBeVisible = shouldBeVisibleH(row, activeRow); Util.setVisOrGone(row.view, shouldBeVisible); - Util.setVisOrGone(row.header, shouldBeVisible); if (row.view.isShown()) { updateVolumeRowSliderTintH(row, isActive); } } } - protected void updateConnectedDeviceH(String deviceName) { - for (final VolumeRow row : mRows) { - row.connectedDevice.setText(deviceName); - Util.setVisOrGone(row.connectedDevice, !TextUtils.isEmpty(deviceName)); - } - } - protected void updateRingerH() { if (mState != null) { final StreamState ss = mState.states.get(AudioManager.STREAM_RING); @@ -560,12 +565,10 @@ public class VolumeDialogImpl implements VolumeDialog { enableRingerViewsH(mState.zenMode == Global.ZEN_MODE_OFF || !mState.disallowRinger); switch (mState.ringerModeInternal) { case AudioManager.RINGER_MODE_VIBRATE: - mRingerStatus.setText(R.string.volume_ringer_status_vibrate); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate); mRingerIcon.setTag(Events.ICON_STATE_VIBRATE); break; case AudioManager.RINGER_MODE_SILENT: - mRingerStatus.setText(R.string.volume_ringer_status_silent); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute); mRingerIcon.setContentDescription(mContext.getString( R.string.volume_stream_content_description_unmute, @@ -576,14 +579,12 @@ public class VolumeDialogImpl implements VolumeDialog { default: boolean muted = (mAutomute && ss.level == 0) || ss.muted; if (muted) { - mRingerStatus.setText(R.string.volume_ringer_status_silent); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute); mRingerIcon.setContentDescription(mContext.getString( R.string.volume_stream_content_description_unmute, getStreamLabelH(ss))); mRingerIcon.setTag(Events.ICON_STATE_MUTE); } else { - mRingerStatus.setText(R.string.volume_ringer_status_normal); mRingerIcon.setImageResource(R.drawable.ic_volume_ringer); if (mController.hasVibrator()) { mRingerIcon.setContentDescription(mContext.getString( @@ -603,12 +604,11 @@ public class VolumeDialogImpl implements VolumeDialog { } /** - * Toggles enable state of views in a VolumeRow (not including seekbar, outputChooser or icon) + * Toggles enable state of views in a VolumeRow (not including seekbar or icon) * Hides/shows zen icon * @param enable whether to enable volume row views and hide dnd icon */ private void enableVolumeRowViewsH(VolumeRow row, boolean enable) { - row.header.setEnabled(enable); row.dndIcon.setVisibility(enable ? View.GONE : View.VISIBLE); } @@ -618,8 +618,6 @@ public class VolumeDialogImpl implements VolumeDialog { * @param enable whether to enable ringer views and hide dnd icon */ private void enableRingerViewsH(boolean enable) { - mRingerTitle.setEnabled(enable); - mRingerStatus.setEnabled(enable); mRingerIcon.setEnabled(enable); mZenIcon.setVisibility(enable ? View.GONE : View.VISIBLE); } @@ -889,24 +887,6 @@ public class VolumeDialogImpl implements VolumeDialog { rescheduleTimeoutH(); } - private void showOutputChooserH() { - synchronized (mOutputChooserLock) { - if (mOutputChooserDialog != null) { - return; - } - mOutputChooserDialog = new OutputChooserDialog(mContext, - new MediaRouterWrapper(MediaRouter.getInstance(mContext))) { - @Override - protected void cleanUp() { - synchronized (mOutputChooserLock) { - mOutputChooserDialog = null; - } - } - }; - mOutputChooserDialog.show(); - } - } - private String getStreamLabelH(StreamState ss) { if (ss.remoteLabel != null) { return ss.remoteLabel; @@ -919,14 +899,6 @@ public class VolumeDialogImpl implements VolumeDialog { } } - private final OnClickListener mClickOutputChooser = new OnClickListener() { - @Override - public void onClick(View v) { - dismissH(DISMISS_REASON_OUTPUT_CHOOSER); - showOutputChooserH(); - } - }; - private final VolumeDialogController.Callbacks mControllerCallbackH = new VolumeDialogController.Callbacks() { @Override @@ -991,11 +963,6 @@ public class VolumeDialogImpl implements VolumeDialog { } } - - @Override - public void onConnectedDeviceChanged(String deviceName) { - updateConnectedDeviceH(deviceName); - } }; private final class H extends Handler { @@ -1184,8 +1151,6 @@ public class VolumeDialogImpl implements VolumeDialog { private ObjectAnimator anim; // slider progress animation for non-touch-related updates private int animTargetProgress; private int lastAudibleLevel = 1; - private View outputChooser; - private TextView connectedDevice; private ImageView dndIcon; } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java index 04339eb8e802..173400f5e31a 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java @@ -43,6 +43,8 @@ public class VolumePrefs { public static final String PREF_ADJUST_ALARMS = "pref_adjust_alarms"; public static final String PREF_ADJUST_NOTIFICATION = "pref_adjust_notification"; + public static final int SHOW_RINGER_TOAST_COUNT = 9; + public static final boolean DEFAULT_SHOW_HEADERS = true; public static final boolean DEFAULT_ENABLE_AUTOMUTE = true; public static final boolean DEFAULT_ENABLE_SILENT_MODE = true; diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java new file mode 100644 index 000000000000..7686948e3852 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java @@ -0,0 +1,54 @@ +/* + * 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 com.android.keyguard; + +import android.graphics.Color; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper.RunWithLooper; +import android.view.LayoutInflater; + +import com.android.systemui.SysuiTestCase; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@SmallTest +@RunWithLooper +@RunWith(AndroidTestingRunner.class) +public class KeyguardSliceViewTest extends SysuiTestCase { + private KeyguardSliceView mKeyguardSliceView; + + @Before + public void setUp() throws Exception { + mKeyguardSliceView = (KeyguardSliceView) LayoutInflater.from(getContext()) + .inflate(R.layout.keyguard_status_area, null); + } + + @Test + public void getTextColor_whiteTextWhenAOD() { + // Set text color to red since the default is white and test would always pass + mKeyguardSliceView.setTextColor(Color.RED); + mKeyguardSliceView.setDark(0); + Assert.assertEquals("Should be using regular text color", Color.RED, + mKeyguardSliceView.getTextColor()); + mKeyguardSliceView.setDark(1); + Assert.assertEquals("Should be using AOD text color", Color.WHITE, + mKeyguardSliceView.getTextColor()); + } +}
\ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java new file mode 100644 index 000000000000..21483aac2ff2 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -0,0 +1,72 @@ +/* + * 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 com.android.keyguard; + +import android.content.Intent; +import android.test.suitebuilder.annotation.SmallTest; +import android.testing.AndroidTestingRunner; +import android.testing.TestableLooper; +import android.testing.TestableLooper.RunWithLooper; + +import com.android.internal.telephony.IccCardConstants; +import com.android.internal.telephony.TelephonyIntents; +import com.android.systemui.SysuiTestCase; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.concurrent.atomic.AtomicBoolean; + +@SmallTest +@RunWith(AndroidTestingRunner.class) +@RunWithLooper +public class KeyguardUpdateMonitorTest extends SysuiTestCase { + + private TestableLooper mTestableLooper; + + @Before + public void setup() { + mTestableLooper = TestableLooper.get(this); + } + + @Test + public void testIgnoresSimStateCallback_rebroadcast() { + Intent intent = new Intent(TelephonyIntents.ACTION_SIM_STATE_CHANGED); + + AtomicBoolean simStateChanged = new AtomicBoolean(false); + KeyguardUpdateMonitor keyguardUpdateMonitor = new KeyguardUpdateMonitor(getContext()) { + @Override + protected void handleSimStateChange(int subId, int slotId, + IccCardConstants.State state) { + simStateChanged.set(true); + super.handleSimStateChange(subId, slotId, state); + } + }; + + keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent); + mTestableLooper.processAllMessages(); + Assert.assertTrue("onSimStateChanged not called", simStateChanged.get()); + + intent.putExtra(TelephonyIntents.EXTRA_REBROADCAST_ON_UNLOCK, true); + simStateChanged.set(false); + keyguardUpdateMonitor.mBroadcastReceiver.onReceive(getContext(), intent); + mTestableLooper.processAllMessages(); + Assert.assertFalse("onSimStateChanged should have been skipped", simStateChanged.get()); + } +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 8347fb098bd5..168d8d36290d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -356,6 +356,52 @@ public class ScrimControllerTest extends SysuiTestCase { Assert.assertTrue(mScrimController.wasAnimationJustCancelled()); } + /** + * Number of visible notifications affects scrim opacity. + */ + @Test + public void testNotificationDensity() { + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.finishAnimationsImmediately(); + + mScrimController.setNotificationCount(0); + mScrimController.finishAnimationsImmediately(); + Assert.assertEquals("lower density when no notifications", + ScrimController.GRADIENT_SCRIM_ALPHA, mScrimBehind.getViewAlpha(), 0.01f); + + mScrimController.setNotificationCount(3); + mScrimController.finishAnimationsImmediately(); + Assert.assertEquals("stronger density when notifications are visible", + ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, mScrimBehind.getViewAlpha(), 0.01f); + } + + /** + * Moving from/to states conserves old notification density. + */ + @Test + public void testConservesNotificationDensity() { + testConservesNotificationDensity(0 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA); + testConservesNotificationDensity(3 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY); + } + + /** + * Conserves old notification density after leaving state and coming back. + * + * @param count How many notification. + * @param expectedAlpha Expected alpha. + */ + private void testConservesNotificationDensity(int count, float expectedAlpha) { + mScrimController.setNotificationCount(count); + mScrimController.transitionTo(ScrimState.UNLOCKED); + mScrimController.finishAnimationsImmediately(); + + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.finishAnimationsImmediately(); + + Assert.assertEquals("Doesn't respect notification busyness after transition", + expectedAlpha, mScrimBehind.getViewAlpha(), 0.01f); + } + private void assertScrimTint(ScrimView scrimView, boolean tinted) { final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT; final String name = scrimView == mScrimInFront ? "front" : "back"; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java index 63920a4f36e2..7e1aba57f87b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java @@ -24,6 +24,7 @@ import android.content.pm.ShortcutManager; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import android.view.View; import android.widget.EditText; import android.widget.ImageButton; @@ -33,6 +34,7 @@ import com.android.systemui.statusbar.ExpandableNotificationRow; import com.android.systemui.statusbar.NotificationTestHelper; import com.android.systemui.statusbar.RemoteInputController; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,7 +48,7 @@ public class RemoteInputViewTest extends SysuiTestCase { private static final String TEST_RESULT_KEY = "test_result_key"; private static final String TEST_REPLY = "hello"; - private static final String TEST_ACTION = "com.android.ACTION"; + private static final String TEST_ACTION = "com.android.REMOTE_INPUT_VIEW_ACTION"; @Mock private RemoteInputController mController; @Mock private ShortcutManager mShortcutManager; @@ -67,6 +69,11 @@ public class RemoteInputViewTest extends SysuiTestCase { mView = RemoteInputView.inflate(mContext, null, row.getEntry(), mController); } + @After + public void tearDown() { + mContext.unregisterReceiver(mReceiver); + } + @Test public void testSendRemoteInput_intentContainsResultsAndSource() throws InterruptedException { PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, @@ -88,4 +95,11 @@ public class RemoteInputViewTest extends SysuiTestCase { assertEquals(RemoteInput.SOURCE_FREE_FORM_INPUT, RemoteInput.getResultsSource(resultIntent)); } + + @Test + public void testNoCrashWithoutVisibilityListener() { + mView.setOnVisibilityChangedListener(null); + mView.setVisibility(View.INVISIBLE); + mView.setVisibility(View.VISIBLE); + } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java index 58abf19dd238..a9b2c96d3ae1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java @@ -37,6 +37,7 @@ import android.widget.LinearLayout; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,7 +47,7 @@ import org.junit.runner.RunWith; @SmallTest public class SmartReplyViewTest extends SysuiTestCase { private static final String TEST_RESULT_KEY = "test_result_key"; - private static final String TEST_ACTION = "com.android.ACTION"; + private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION"; private static final String[] TEST_CHOICES = new String[]{"Hello", "What's up?", "I'm here"}; @@ -76,6 +77,11 @@ public class SmartReplyViewTest extends SysuiTestCase { mSpacing = res.getDimensionPixelSize(R.dimen.smart_reply_button_spacing); } + @After + public void tearDown() { + mContext.unregisterReceiver(mReceiver); + } + @Test public void testSendSmartReply_intentContainsResultsAndSource() throws InterruptedException { setRepliesFromRemoteInput(TEST_CHOICES); diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java deleted file mode 100644 index 922bde787a8d..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * 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 com.android.systemui.volume; - -import static com.android.systemui.volume.OutputChooserDialog.INCLUDE_MEDIA_ROUTES; - -import static junit.framework.Assert.assertTrue; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.bluetooth.BluetoothProfile; -import android.net.wifi.WifiManager; -import android.support.test.filters.SmallTest; -import android.support.test.runner.AndroidJUnit4; -import android.support.v7.media.MediaRouter; -import android.telecom.TelecomManager; -import android.testing.AndroidTestingRunner; -import android.testing.TestableLooper; -import android.widget.TextView; - -import com.android.settingslib.bluetooth.CachedBluetoothDevice; -import com.android.systemui.R; -import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.VolumeDialogController; -import com.android.systemui.statusbar.policy.BluetoothController; - -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -@Ignore -@SmallTest -@RunWith(AndroidTestingRunner.class) -@TestableLooper.RunWithLooper -public class OutputChooserDialogTest extends SysuiTestCase { - - OutputChooserDialog mDialog; - - @Mock - private VolumeDialogController mVolumeController; - @Mock - private BluetoothController mController; - @Mock - private WifiManager mWifiManager; - @Mock - private TelecomManager mTelecomManager; - - @Mock - private MediaRouterWrapper mRouter; - - - @Before - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - - mVolumeController = mDependency.injectMockDependency(VolumeDialogController.class); - mController = mDependency.injectMockDependency(BluetoothController.class); - when(mWifiManager.isWifiEnabled()).thenReturn(true); - - getContext().addMockSystemService(WifiManager.class, mWifiManager); - getContext().addMockSystemService(TelecomManager.class, mTelecomManager); - - mDialog = new OutputChooserDialog(getContext(), mRouter); - } - - @After - public void tearDown() throws Exception { - TestableLooper.get(this).processAllMessages(); - } -/* - @Test - public void testClickMediaRouterItemConnectsMedia() { - mDialog.show(); - - OutputChooserLayout.Item item = new OutputChooserLayout.Item(); - item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER; - MediaRouter.RouteInfo info = mock(MediaRouter.RouteInfo.class); - when(info.isEnabled()).thenReturn(true); - item.tag = info; - - mDialog.onDetailItemClick(item); - verify(info, times(1)).select(); - verify(mController, never()).connect(any()); - mDialog.dismiss(); - } - - @Test - public void testClickBtItemConnectsBt() { - mDialog.show(); - - OutputChooserLayout.Item item = new OutputChooserLayout.Item(); - item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_BT; - CachedBluetoothDevice btDevice = mock(CachedBluetoothDevice.class); - when(btDevice.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_DISCONNECTED); - item.tag = btDevice; - - mDialog.onDetailItemClick(item); - verify(mController, times(1)).connect(any()); - mDialog.dismiss(); - } - - @Test - public void testTitleNotInCall() { - mDialog.show(); - - assertTrue(((TextView) mDialog.findViewById(R.id.title)) - .getText().toString().contains("Media")); - mDialog.dismiss(); - } - - @Test - public void testTitleInCall() { - mDialog.setIsInCall(true); - mDialog.show(); - - assertTrue(((TextView) mDialog.findViewById(R.id.title)) - .getText().toString().contains("Phone")); - mDialog.dismiss(); - } -*/ - @Test - public void testNoMediaScanIfInCall() { - mDialog.setIsInCall(true); - mDialog.onAttachedToWindow(); - - verify(mRouter, never()).addCallback(any(), any(), anyInt()); - } - - @Test - public void testRegisterCallbacks() { - mDialog.setIsInCall(false); - mDialog.onAttachedToWindow(); - - if (INCLUDE_MEDIA_ROUTES) { - verify(mRouter, times(1)).addCallback(any(), any(), anyInt()); - } - verify(mController, times(1)).addCallback(any()); - verify(mVolumeController, times(1)).addCallback(any(), any()); - } - - @Test - public void testUnregisterCallbacks() { - mDialog.setIsInCall(false); - mDialog.onDetachedFromWindow(); - - verify(mRouter, times(1)).removeCallback(any()); - verify(mController, times(1)).removeCallback(any()); - verify(mVolumeController, times(1)).removeCallback(any()); - } -} diff --git a/packages/VpnDialogs/res/values-as/strings.xml b/packages/VpnDialogs/res/values-as/strings.xml new file mode 100644 index 000000000000..4f16c74424e6 --- /dev/null +++ b/packages/VpnDialogs/res/values-as/strings.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="prompt" msgid="3183836924226407828">"সংযোগৰ অনুৰোধ"</string> + <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g>এ নেটৱৰ্ক ট্ৰেফিক নিৰীক্ষণ কৰিবলৈ এটা ভিপিএন সংযোগ ছেট আপ কৰিবলৈ বিচাৰিছে৷ আপুনি কেৱল উৎসটোক বিশ্বাস কৰিলেহে অনুৰোধ স্বীকাৰ কৰিব৷ ভিপিএন সক্ৰিয় থকাৰ সময়ত আপোনাৰ স্ক্ৰীণৰ ওপৰত <br /> <br /> <img src=vpn_icon /> দৃশ্যমান হয়৷"</string> + <string name="legacy_title" msgid="192936250066580964">"ভিপিএন সংযোগ হৈ আছে"</string> + <string name="session" msgid="6470628549473641030">"ছেশ্বন:"</string> + <string name="duration" msgid="3584782459928719435">"সময়সীমা:"</string> + <string name="data_transmitted" msgid="7988167672982199061">"পঠিওৱা হ\'ল:"</string> + <string name="data_received" msgid="4062776929376067820">"পোৱা গ\'ল:"</string> + <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_1">%2$s</xliff:g> পেকেট / <xliff:g id="NUMBER_0">%1$s</xliff:g> বাইট"</string> + <!-- no translation found for always_on_disconnected_title (1906740176262776166) --> + <skip /> + <!-- no translation found for always_on_disconnected_message (555634519845992917) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) --> + <skip /> + <string name="configure" msgid="4905518375574791375">"কনফিগাৰ কৰক"</string> + <string name="disconnect" msgid="971412338304200056">"সংযোগ বিচ্ছিন্ন কৰক"</string> + <!-- no translation found for open_app (3717639178595958667) --> + <skip /> + <!-- no translation found for dismiss (6192859333764711227) --> + <skip /> +</resources> diff --git a/packages/VpnDialogs/res/values-or/strings.xml b/packages/VpnDialogs/res/values-or/strings.xml new file mode 100644 index 000000000000..93f56ba59a58 --- /dev/null +++ b/packages/VpnDialogs/res/values-or/strings.xml @@ -0,0 +1,43 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Copyright (C) 2011 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> + +<resources xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + <string name="prompt" msgid="3183836924226407828">"ସଂଯୋଗ ଅନୁରୋଧ"</string> + <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> ଏକ VPN ସଂଯୋଗ ସେଟ୍ ଅପ୍ କରିବାକୁ ଚାହେଁ, ଯାହା ଏହି ନେଟ୍ୱର୍କର ଟ୍ରାଫିକକୁ ମନିଟର୍ କରିବାକୁ ଅନୁମତି ଦିଏ। ଆପଣ ସୋର୍ସ ଉପରେ ବିଶ୍ୱାସ କରିବା ବଦଳରେ କେବଳ ସ୍ୱୀକାର କରନ୍ତୁ। <br /> <br /> <img src=vpn_icon /> VPN ସକ୍ରିୟ ଥିବାବେଳେ ଏହା ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ର ଉପରେ ଦେଖାଯାଏ।"</string> + <string name="legacy_title" msgid="192936250066580964">"VPN ସଂଯୋଗ ହେଲା"</string> + <string name="session" msgid="6470628549473641030">"ସେସନ୍:"</string> + <string name="duration" msgid="3584782459928719435">"ଅବଧି:"</string> + <string name="data_transmitted" msgid="7988167672982199061">"ପଠାଯାଇଛି:"</string> + <string name="data_received" msgid="4062776929376067820">"ପ୍ରାପ୍ତ ହୋଇଛି:"</string> + <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ବାଇଟ୍ସ <xliff:g id="NUMBER_1">%2$s</xliff:g> ପ୍ୟାକେଟ୍ସ"</string> + <!-- no translation found for always_on_disconnected_title (1906740176262776166) --> + <skip /> + <!-- no translation found for always_on_disconnected_message (555634519845992917) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) --> + <skip /> + <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) --> + <skip /> + <string name="configure" msgid="4905518375574791375">"କନଫିଗର୍ କରନ୍ତୁ"</string> + <string name="disconnect" msgid="971412338304200056">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string> + <!-- no translation found for open_app (3717639178595958667) --> + <skip /> + <!-- no translation found for dismiss (6192859333764711227) --> + <skip /> +</resources> diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto index 7e86ef53708e..c56002e88406 100644 --- a/proto/src/metrics_constants.proto +++ b/proto/src/metrics_constants.proto @@ -5278,11 +5278,56 @@ message MetricsEvent { // OS: P FIELD_QS_MODE = 1311; + // OPEN: Settings->Developer Options->Default USB // CATEGORY: SETTINGS // OS: P USB_DEFAULT = 1312; + // CATEGORY: The category for all actions related to TextClassifier generateLinks. + // OS: P + TEXT_CLASSIFIER_GENERATE_LINKS = 1313; + + // FIELD: milliseconds spent generating links. + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_LATENCY = 1314; + + // FIELD: length of the input text in characters. + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_TEXT_LENGTH = 1315; + + // FIELD: number of links detected. + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_NUM_LINKS = 1316; + + // FIELD: length of all links in characters. + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_LINK_LENGTH = 1317; + + // FIELD: the type of entity the stats are for. + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_ENTITY_TYPE = 1318; + + // FIELD: a random uid for a single call to generateLinks + // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS + // OS: P + FIELD_LINKIFY_CALL_ID = 1319; + + // FIELD: The compiler filter used when when optimizing the package. + // Logged together with app transition events. + // OS: P + PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1320; + + // FIELD: The reason for optimizing the package. + // Logged together with app transition events. + // OS: P + PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1321; + // ---- End P Constants, all P 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 c77dcc01b7a1..74efec93f201 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -379,6 +379,9 @@ message WifiLog { // Number of connectivity single scan requests. optional int32 num_connectivity_oneshot_scans = 93; + + // WifiWake statistics + optional WifiWakeStats wifi_wake_stats = 94; } // Information that gets logged for every WiFi connection. @@ -1159,3 +1162,39 @@ message WifiPowerStats { // Amount of time wifi is in tx (ms) optional int64 tx_time_ms = 5; } + +// Metrics for Wifi Wake +message WifiWakeStats { + // An individual session for Wifi Wake + message Session { + // A Wifi Wake lifecycle event + message Event { + // Elapsed time in milliseconds since start of session. + optional int64 elapsed_time_millis = 1; + + // Number of scans that have occurred since start of session. + optional int32 elapsed_scans = 2; + } + + // Start time of session in milliseconds. + optional int64 start_time_millis = 1; + + // The number of networks the lock was initialized with at start. + optional int32 locked_networks_at_start = 2; + + // Event for unlocking the WakeupLock. Does not occur if lock was initialized with 0 networks. + optional Event unlock_event = 3; + + // Event for triggering wakeup. + optional Event wakeup_event = 4; + + // Event for WifiWake reset event. This event marks the end of a session. + optional Event reset_event = 5; + } + + // Total number of sessions for Wifi Wake. + optional int32 num_sessions = 1; + + // Session information for every Wifi Wake session (up to a maximum of 10). + repeated Session sessions = 2; +} diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index eba983011df8..b0b95868600f 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -22,6 +22,7 @@ import static android.view.accessibility.AccessibilityNodeInfo.ACTION_ACCESSIBIL import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS; import static com.android.internal.util.FunctionalUtils.ignoreRemoteException; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.Manifest; import android.accessibilityservice.AccessibilityService; @@ -100,18 +101,20 @@ import android.view.accessibility.IAccessibilityManager; import android.view.accessibility.IAccessibilityManagerClient; import com.android.internal.R; +import com.android.internal.accessibility.AccessibilityShortcutController; +import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.PackageMonitor; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.IntPair; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.LocalServices; -import com.android.internal.accessibility.AccessibilityShortcutController; -import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo; import com.android.server.wm.WindowManagerInternal; import libcore.util.EmptyArray; + import org.xmlpull.v1.XmlPullParserException; import java.io.FileDescriptor; @@ -125,9 +128,10 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +import java.util.function.IntSupplier; /** * This class is instantiated by the system as a system level service and can be @@ -293,6 +297,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return mFingerprintGestureDispatcher; } + private UserState getUserState(int userId) { + synchronized (mLock) { + return getUserStateLocked(userId); + } + } + private UserState getUserStateLocked(int userId) { UserState state = mUserStates.get(userId); if (state == null) { @@ -540,9 +550,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub dispatchEvent = true; } if (mHasInputFilter && mInputFilter != null) { - mMainHandler.obtainMessage( - MainHandler.MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER, - AccessibilityEvent.obtain(event)).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendAccessibilityEventToInputFilter, + this, AccessibilityEvent.obtain(event))); } } } @@ -568,6 +578,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } + private void sendAccessibilityEventToInputFilter(AccessibilityEvent event) { + synchronized (mLock) { + if (mHasInputFilter && mInputFilter != null) { + mInputFilter.notifyAccessibilityEvent(event); + } + } + event.recycle(); + } + @Override public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId) { synchronized (mLock) { @@ -1024,8 +1043,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub // Disable the local managers for the old user. if (oldUserState.mUserClients.getRegisteredCallbackCount() > 0) { - mMainHandler.obtainMessage(MainHandler.MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER, - oldUserState.mUserId, 0).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendStateToClients, + this, 0, oldUserState.mUserId)); } // Announce user changes only if more that one exist. @@ -1045,12 +1065,29 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (announceNewUser) { // Schedule announcement of the current user if needed. - mMainHandler.sendEmptyMessageDelayed(MainHandler.MSG_ANNOUNCE_NEW_USER_IF_NEEDED, + mMainHandler.sendMessageDelayed( + obtainMessage(AccessibilityManagerService::announceNewUserIfNeeded, this), WAIT_FOR_USER_STATE_FULLY_INITIALIZED_MILLIS); } } } + private void announceNewUserIfNeeded() { + synchronized (mLock) { + UserState userState = getCurrentUserStateLocked(); + if (userState.isHandlingAccessibilityEvents()) { + UserManager userManager = (UserManager) mContext.getSystemService( + Context.USER_SERVICE); + String message = mContext.getString(R.string.user_switched, + userManager.getUserInfo(mCurrentUserId).name); + AccessibilityEvent event = AccessibilityEvent.obtain( + AccessibilityEvent.TYPE_ANNOUNCEMENT); + event.getText().add(message); + sendAccessibilityEventLocked(event, mCurrentUserId); + } + } + } + private void unlockUser(int userId) { synchronized (mLock) { int parentUserId = mSecurityPolicy.resolveProfileParentLocked(userId); @@ -1154,8 +1191,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } if (potentialTargets == 1) { if (state.mIsNavBarMagnificationEnabled) { - mMainHandler.obtainMessage( - MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendAccessibilityButtonToInputFilter, this)); return; } else { for (int i = state.mBoundServices.size() - 1; i >= 0; i--) { @@ -1169,12 +1206,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } else { if (state.mServiceAssignedToAccessibilityButton == null && !state.mIsNavBarMagnificationAssignedToAccessibilityButton) { - mMainHandler.obtainMessage( - MainHandler.MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::showAccessibilityButtonTargetSelection, this)); } else if (state.mIsNavBarMagnificationEnabled && state.mIsNavBarMagnificationAssignedToAccessibilityButton) { - mMainHandler.obtainMessage( - MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendAccessibilityButtonToInputFilter, this)); return; } else { for (int i = state.mBoundServices.size() - 1; i >= 0; i--) { @@ -1187,11 +1224,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } // The user may have turned off the assigned service or feature - mMainHandler.obtainMessage( - MainHandler.MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::showAccessibilityButtonTargetSelection, this)); + } + } + + private void sendAccessibilityButtonToInputFilter() { + synchronized (mLock) { + if (mHasInputFilter && mInputFilter != null) { + mInputFilter.notifyAccessibilityButtonClicked(); + } } } + private void showAccessibilityButtonTargetSelection() { + Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); + mContext.startActivityAsUser(intent, UserHandle.of(mCurrentUserId)); + } + private void notifyAccessibilityButtonVisibilityChangedLocked(boolean available) { final UserState state = getCurrentUserStateLocked(); mIsAccessibilityButtonShown = available; @@ -1555,28 +1606,54 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub && (mGlobalClients.getRegisteredCallbackCount() > 0 || userState.mUserClients.getRegisteredCallbackCount() > 0)) { userState.mLastSentClientState = clientState; - mMainHandler.obtainMessage(MainHandler.MSG_SEND_STATE_TO_CLIENTS, - clientState, userState.mUserId).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendStateToAllClients, + this, clientState, userState.mUserId)); } } - private void showAccessibilityButtonTargetSelection() { - Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - mContext.startActivityAsUser(intent, UserHandle.of(mCurrentUserId)); + private void sendStateToAllClients(int clientState, int userId) { + sendStateToClients(clientState, mGlobalClients); + sendStateToClients(clientState, userId); + } + + private void sendStateToClients(int clientState, int userId) { + sendStateToClients(clientState, getUserState(userId).mUserClients); + } + + private void sendStateToClients(int clientState, + RemoteCallbackList<IAccessibilityManagerClient> clients) { + clients.broadcast(ignoreRemoteException( + client -> client.setState(clientState))); } private void scheduleNotifyClientsOfServicesStateChange(UserState userState) { - mMainHandler.obtainMessage(MainHandler.MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS, - userState.mUserId).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendServicesStateChanged, + this, userState.mUserClients)); + } + + private void sendServicesStateChanged( + RemoteCallbackList<IAccessibilityManagerClient> userClients) { + notifyClientsOfServicesStateChange(mGlobalClients); + notifyClientsOfServicesStateChange(userClients); + } + + private void notifyClientsOfServicesStateChange( + RemoteCallbackList<IAccessibilityManagerClient> clients) { + clients.broadcast(ignoreRemoteException( + client -> client.notifyServicesStateChanged())); } private void scheduleUpdateInputFilter(UserState userState) { - mMainHandler.obtainMessage(MainHandler.MSG_UPDATE_INPUT_FILTER, userState).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::updateInputFilter, this, userState)); } private void scheduleUpdateFingerprintGestureHandling(UserState userState) { - mMainHandler.obtainMessage(MainHandler.MSG_UPDATE_FINGERPRINT, userState).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::updateFingerprintGestureHandling, + this, userState)); } private void updateInputFilter(UserState userState) { @@ -1979,7 +2056,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } ComponentName componentName = ComponentName.unflattenFromString(componentId); - if (componentName.equals(userState.mServiceAssignedToAccessibilityButton)) { + if (Objects.equals(componentName, userState.mServiceAssignedToAccessibilityButton)) { return false; } userState.mServiceAssignedToAccessibilityButton = componentName; @@ -2039,9 +2116,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return true; } else if (mEnableTouchExplorationDialog == null || !mEnableTouchExplorationDialog.isShowing()) { - mMainHandler.obtainMessage( - MainHandler.MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG, - service).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::showEnableTouchExplorationDialog, + this, service)); } } else { // Starting in JB-MR2 we request an accessibility service to declare @@ -2293,9 +2370,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private void sendAccessibilityEventLocked(AccessibilityEvent event, int userId) { // Resync to avoid calling out with the lock held event.setEventTime(SystemClock.uptimeMillis()); - mMainHandler.obtainMessage( - MainHandler.MSG_SEND_ACCESSIBILITY_EVENT, userId, 0 /* unused */, event) - .sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::sendAccessibilityEvent, + this, event, userId)); } /** @@ -2419,22 +2496,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } + //TODO remove after refactoring KeyEventDispatcherTest final class MainHandler extends Handler { - public static final int MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER = 1; - public static final int MSG_SEND_STATE_TO_CLIENTS = 2; - public static final int MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER = 3; - public static final int MSG_ANNOUNCE_NEW_USER_IF_NEEDED = 5; - public static final int MSG_UPDATE_INPUT_FILTER = 6; - public static final int MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG = 7; public static final int MSG_SEND_KEY_EVENT_TO_INPUT_FILTER = 8; - public static final int MSG_CLEAR_ACCESSIBILITY_FOCUS = 9; - public static final int MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS = 10; - public static final int MSG_UPDATE_FINGERPRINT = 11; - public static final int MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS = 12; - public static final int MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER = 13; - public static final int MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER = 14; - public static final int MSG_INIT_SERVICE = 15; - public static final int MSG_SEND_ACCESSIBILITY_EVENT = 16; public MainHandler(Looper looper) { super(looper); @@ -2442,143 +2506,25 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override public void handleMessage(Message msg) { - final int type = msg.what; - switch (type) { - case MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER: { - AccessibilityEvent event = (AccessibilityEvent) msg.obj; - synchronized (mLock) { - if (mHasInputFilter && mInputFilter != null) { - mInputFilter.notifyAccessibilityEvent(event); - } - } - event.recycle(); - } break; - - case MSG_SEND_KEY_EVENT_TO_INPUT_FILTER: { - KeyEvent event = (KeyEvent) msg.obj; - final int policyFlags = msg.arg1; - synchronized (mLock) { - if (mHasInputFilter && mInputFilter != null) { - mInputFilter.sendInputEvent(event, policyFlags); - } - } - event.recycle(); - } break; - - case MSG_SEND_STATE_TO_CLIENTS: { - final int clientState = msg.arg1; - final int userId = msg.arg2; - sendStateToClients(clientState, mGlobalClients); - sendStateToClients(clientState, getUserClientsForId(userId)); - } break; - - case MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER: { - final int userId = msg.arg1; - sendStateToClients(0, getUserClientsForId(userId)); - } break; - - case MSG_ANNOUNCE_NEW_USER_IF_NEEDED: { - announceNewUserIfNeeded(); - } break; - - case MSG_UPDATE_INPUT_FILTER: { - UserState userState = (UserState) msg.obj; - updateInputFilter(userState); - } break; - - case MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG: { - AccessibilityServiceConnection service = - (AccessibilityServiceConnection) msg.obj; - showEnableTouchExplorationDialog(service); - } break; - - case MSG_CLEAR_ACCESSIBILITY_FOCUS: { - final int windowId = msg.arg1; - getInteractionBridge().clearAccessibilityFocusNotLocked(windowId); - } break; - - case MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS: { - final int userId = msg.arg1; - notifyClientsOfServicesStateChange(mGlobalClients); - notifyClientsOfServicesStateChange(getUserClientsForId(userId)); - } break; - - case MSG_UPDATE_FINGERPRINT: { - updateFingerprintGestureHandling((UserState) msg.obj); - } break; - - case MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS: { - final int userId = msg.arg1; - final int relevantEventTypes = msg.arg2; - final UserState userState; - synchronized (mLock) { - userState = getUserStateLocked(userId); - } - broadcastToClients(userState, ignoreRemoteException( - client -> client.mCallback.setRelevantEventTypes(relevantEventTypes))); - } break; - - case MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER: { - synchronized (mLock) { - if (mHasInputFilter && mInputFilter != null) { - mInputFilter.notifyAccessibilityButtonClicked(); - } + if (msg.what == MSG_SEND_KEY_EVENT_TO_INPUT_FILTER) { + KeyEvent event = (KeyEvent) msg.obj; + final int policyFlags = msg.arg1; + synchronized (mLock) { + if (mHasInputFilter && mInputFilter != null) { + mInputFilter.sendInputEvent(event, policyFlags); } - } break; - - case MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER: { - showAccessibilityButtonTargetSelection(); - } break; - - case MSG_INIT_SERVICE: { - final AccessibilityServiceConnection service = - (AccessibilityServiceConnection) msg.obj; - service.initializeService(); - } break; - - case MSG_SEND_ACCESSIBILITY_EVENT: { - final AccessibilityEvent event = (AccessibilityEvent) msg.obj; - final int userId = msg.arg1; - sendAccessibilityEvent(event, userId); - } - } - } - - private void announceNewUserIfNeeded() { - synchronized (mLock) { - UserState userState = getCurrentUserStateLocked(); - if (userState.isHandlingAccessibilityEvents()) { - UserManager userManager = (UserManager) mContext.getSystemService( - Context.USER_SERVICE); - String message = mContext.getString(R.string.user_switched, - userManager.getUserInfo(mCurrentUserId).name); - AccessibilityEvent event = AccessibilityEvent.obtain( - AccessibilityEvent.TYPE_ANNOUNCEMENT); - event.getText().add(message); - sendAccessibilityEventLocked(event, mCurrentUserId); } + event.recycle(); } } + } - private RemoteCallbackList<IAccessibilityManagerClient> getUserClientsForId(int userId) { - final UserState userState; - synchronized (mLock) { - userState = getUserStateLocked(userId); - } - return userState.mUserClients; - } - - private void sendStateToClients(int clientState, - RemoteCallbackList<IAccessibilityManagerClient> clients) { - clients.broadcast(ignoreRemoteException( - client -> client.setState(clientState))); - } + void clearAccessibilityFocus(IntSupplier windowId) { + clearAccessibilityFocus(windowId.getAsInt()); + } - private void notifyClientsOfServicesStateChange( - RemoteCallbackList<IAccessibilityManagerClient> clients) { - clients.broadcast(ignoreRemoteException( - client -> client.notifyServicesStateChanged())); - } + void clearAccessibilityFocus(int windowId) { + getInteractionBridge().clearAccessibilityFocusNotLocked(windowId); } private int findWindowIdLocked(IBinder token) { @@ -2912,7 +2858,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub * Has no effect if no item has accessibility focus, if the item with accessibility * focus does not expose the specified action, or if the action fails. * - * @param actionId The id of the action to perform. + * @param action The action to perform. * * @return {@code true} if the action was performed. {@code false} if it was not. */ @@ -3353,8 +3299,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: { synchronized (mLock) { if (mAccessibilityFocusedWindowId != windowId) { - mMainHandler.obtainMessage(MainHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS, - mAccessibilityFocusedWindowId, 0).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::clearAccessibilityFocus, + AccessibilityManagerService.this, + box(mAccessibilityFocusedWindowId))); mSecurityPolicy.setAccessibilityFocusedWindowLocked(windowId); mAccessibilityFocusNodeId = nodeId; } @@ -3406,12 +3354,17 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (oldActiveWindow != mSecurityPolicy.mActiveWindowId && mAccessibilityFocusedWindowId == oldActiveWindow && getCurrentUserStateLocked().mAccessibilityFocusOnlyInActiveWindow) { - mMainHandler.obtainMessage(MainHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS, - oldActiveWindow, 0).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityManagerService::clearAccessibilityFocus, + AccessibilityManagerService.this, box(oldActiveWindow))); } } } + private IntSupplier box(int value) { + return PooledLambda.obtainSupplier(value).recycleOnUse(); + } + public int getActiveWindowId() { if (mActiveWindowId == INVALID_WINDOW_ID && !mTouchInteractionInProgress) { mActiveWindowId = getFocusedWindowId(); diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java index 96b897926136..89bf82d6f065 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java @@ -18,6 +18,8 @@ package com.android.server.accessibility; import static android.provider.Settings.Secure.SHOW_MODE_AUTO; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; + import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceClient; import android.content.ComponentName; @@ -158,8 +160,8 @@ class AccessibilityServiceConnection extends AbstractAccessibilityServiceConnect mSystemSupport.onClientChange(false); // Initialize the service on the main handler after we're done setting up for // the new configuration (for example, initializing the input filter). - mMainHandler.obtainMessage( - AccessibilityManagerService.MainHandler.MSG_INIT_SERVICE, this).sendToTarget(); + mMainHandler.sendMessage(obtainMessage( + AccessibilityServiceConnection::initializeService, this)); } } diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java index 3419b809f1b8..84a8d45a99b9 100644 --- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java +++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java @@ -21,7 +21,6 @@ import android.graphics.Point; import android.os.Handler; import android.util.Slog; import android.view.InputDevice; -import android.view.KeyEvent; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; import android.view.MotionEvent.PointerProperties; @@ -296,7 +295,8 @@ class TouchExplorer extends BaseEventStreamTransformation // Already handled. } break; default: - throw new IllegalStateException("Illegal state: " + mCurrentState); + Slog.e(LOG_TAG, "Illegal state: " + mCurrentState); + clear(event, policyFlags); } } @@ -649,8 +649,10 @@ class TouchExplorer extends BaseEventStreamTransformation } switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { - throw new IllegalStateException("Dragging state can be reached only if two " + Slog.e(LOG_TAG, "Dragging state can be reached only if two " + "pointers are already down"); + clear(event, policyFlags); + return; } case MotionEvent.ACTION_POINTER_DOWN: { // We are in dragging state so we have two pointers and another one @@ -741,8 +743,10 @@ class TouchExplorer extends BaseEventStreamTransformation private void handleMotionEventStateDelegating(MotionEvent event, int policyFlags) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { - throw new IllegalStateException("Delegating state can only be reached if " + Slog.e(LOG_TAG, "Delegating state can only be reached if " + "there is at least one pointer down!"); + clear(event, policyFlags); + return; } case MotionEvent.ACTION_UP: { // Offset the event if we are doing a long press as the @@ -1093,7 +1097,7 @@ class TouchExplorer extends BaseEventStreamTransformation case STATE_GESTURE_DETECTING: return "STATE_GESTURE_DETECTING"; default: - throw new IllegalArgumentException("Unknown state: " + state); + return "Unknown state: " + state; } } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index db62961178c5..05237af13b90 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -524,6 +524,7 @@ public final class AutofillManagerService extends SystemService { private void addCompatibilityModeRequestsLocked(@NonNull AutofillManagerServiceImpl service , int userId) { + mAutofillCompatState.reset(); final ArrayMap<String, Pair<Long, String>> compatPackages = service.getCompatibilityPackagesLocked(); if (compatPackages == null || compatPackages.isEmpty()) { @@ -626,6 +627,15 @@ public final class AutofillManagerService extends SystemService { } } } + + void reset() { + synchronized (mLock) { + if (mUserSpecs != null) { + mUserSpecs.clear(); + mUserSpecs = null; + } + } + } } final class AutoFillManagerServiceStub extends IAutoFillManager.Stub { @@ -1045,6 +1055,9 @@ public final class AutofillManagerService extends SystemService { Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL); resolver.registerContentObserver(Settings.Secure.getUriFor( Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL); + resolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES), false, this, + UserHandle.USER_ALL); } @Override diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 32f03b34b4b1..bcfe1b6eb1f3 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -76,6 +76,7 @@ import android.util.LocalLog; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; +import android.view.KeyEvent; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.AutofillValue; @@ -812,6 +813,27 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + @Override + public void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent) { + synchronized (mLock) { + if (mDestroyed) { + Slog.w(TAG, "Call to Session#dispatchUnhandledKey() rejected - session: " + + id + " destroyed"); + return; + } + if (id.equals(mCurrentViewId)) { + try { + mClient.dispatchUnhandledKey(this.id, id, keyEvent); + } catch (RemoteException e) { + Slog.e(TAG, "Error requesting to dispatch unhandled key", e); + } + } else { + Slog.w(TAG, "Do not dispatch unhandled key on " + id + + " as it is not the current view (" + mCurrentViewId + ") anymore"); + } + } + } + // AutoFillUiCallback @Override public void requestHideFillUi(AutofillId id) { diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java index dc365180053b..e28a204df787 100644 --- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java +++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java @@ -34,6 +34,7 @@ import android.service.autofill.SaveInfo; import android.service.autofill.ValueFinder; import android.text.TextUtils; import android.util.Slog; +import android.view.KeyEvent; import android.view.autofill.AutofillId; import android.view.autofill.AutofillManager; import android.view.autofill.IAutofillWindowPresenter; @@ -78,6 +79,7 @@ public final class AutoFillUI { IAutofillWindowPresenter presenter); void requestHideFillUi(AutofillId id); void startIntentSender(IntentSender intentSender); + void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent); } public AutoFillUI(@NonNull Context context) { @@ -240,6 +242,13 @@ public final class AutoFillUI { mCallback.startIntentSender(intentSender); } } + + @Override + public void dispatchUnhandledKey(KeyEvent keyEvent) { + if (mCallback != null) { + mCallback.dispatchUnhandledKey(focusedId, keyEvent); + } + } }); }); } diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java index d64244d8698b..7278e83ce089 100644 --- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java +++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java @@ -18,6 +18,7 @@ package com.android.server.autofill.ui; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sVerbose; +import android.annotation.AttrRes; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.PendingIntent; @@ -31,8 +32,10 @@ import android.service.autofill.Dataset; import android.service.autofill.Dataset.DatasetFieldFilter; import android.service.autofill.FillResponse; import android.text.TextUtils; +import android.util.AttributeSet; import android.util.Slog; import android.util.TypedValue; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -47,6 +50,7 @@ import android.view.autofill.IAutofillWindowPresenter; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; +import android.widget.FrameLayout; import android.widget.ListView; import android.widget.RemoteViews; @@ -69,6 +73,28 @@ final class FillUi { private static final TypedValue sTempTypedValue = new TypedValue(); + public static final class AutofillFrameLayout extends FrameLayout { + + OnKeyListener mUnhandledListener; + + public AutofillFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public AutofillFrameLayout(Context context, AttributeSet attrs, @AttrRes int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + boolean handled = super.dispatchKeyEvent(event); + if (!handled) { + handled = mUnhandledListener.onKey(this, event.getKeyCode(), event); + } + return handled; + } + } + interface Callback { void onResponsePicked(@NonNull FillResponse response); void onDatasetPicked(@NonNull Dataset dataset); @@ -78,6 +104,7 @@ final class FillUi { IAutofillWindowPresenter windowPresenter); void requestHideFillUi(); void startIntentSender(IntentSender intentSender); + void dispatchUnhandledKey(KeyEvent keyEvent); } private final @NonNull Point mTempPoint = new Point(); @@ -122,6 +149,31 @@ final class FillUi { mFullScreen ? R.layout.autofill_dataset_picker_fullscreen : R.layout.autofill_dataset_picker, null); + // if autofill ui is not fullscreen, send unhandled keyevent to app window. + if (!mFullScreen) { + if (decor instanceof AutofillFrameLayout) { + ((AutofillFrameLayout) decor).mUnhandledListener = + (View view, int keyCode, KeyEvent event) -> { + switch (keyCode) { + case KeyEvent.KEYCODE_BACK: + case KeyEvent.KEYCODE_ESCAPE: + case KeyEvent.KEYCODE_ENTER: + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_DPAD_LEFT: + case KeyEvent.KEYCODE_DPAD_UP: + case KeyEvent.KEYCODE_DPAD_RIGHT: + case KeyEvent.KEYCODE_DPAD_DOWN: + return false; + default: + mCallback.dispatchUnhandledKey(event); + return true; + } + }; + } else { + Slog.wtf(TAG, "Unable to send unhandled key"); + } + } + final RemoteViews.OnClickHandler interceptionHandler = new RemoteViews.OnClickHandler() { @Override public boolean onClickHandler(View view, PendingIntent pendingIntent, diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 83367f3f83b4..782bf71bf9bb 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -2357,7 +2357,7 @@ public class BackupManagerService implements BackupManagerServiceInterface { // If the caller does not hold the BACKUP permission, it can only request a // wipe of its own backed-up data. - HashSet<String> apps; + Set<String> apps; if ((mContext.checkPermission(android.Manifest.permission.BACKUP, Binder.getCallingPid(), Binder.getCallingUid())) == PackageManager.PERMISSION_DENIED) { apps = mBackupParticipants.get(Binder.getCallingUid()); @@ -2365,10 +2365,9 @@ public class BackupManagerService implements BackupManagerServiceInterface { // a caller with full permission can ask to back up any participating app // !!! TODO: allow data-clear of ANY app? if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps"); - apps = SparseArrayUtils.union(mBackupParticipants); + apps = mProcessedPackagesJournal.getPackagesCopy(); } - // Is the given app an available participant? if (apps.contains(packageName)) { // found it; fire off the clear request if (MORE_DEBUG) Slog.v(TAG, "Found the app - running clear process"); diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 9cd3621eb737..c93f405012ca 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -3860,7 +3860,7 @@ class AlarmManagerService extends SystemService { final class AppStandbyTracker extends UsageStatsManagerInternal.AppIdleStateChangeListener { @Override public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId, - boolean idle, int bucket) { + boolean idle, int bucket, int reason) { if (DEBUG_STANDBY) { Slog.d(TAG, "Package " + packageName + " for user " + userId + " now in bucket " + bucket); diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java index 9b29b3212b44..a6b71b772d15 100644 --- a/services/core/java/com/android/server/AppStateTracker.java +++ b/services/core/java/com/android/server/AppStateTracker.java @@ -53,6 +53,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IAppOpsCallback; import com.android.internal.app.IAppOpsService; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage; import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages; @@ -677,7 +678,7 @@ public class AppStateTracker { final class StandbyTracker extends AppIdleStateChangeListener { @Override public void onAppIdleStateChanged(String packageName, int userId, boolean idle, - int bucket) { + int bucket, int reason) { if (DEBUG) { Slog.d(TAG,"onAppIdleStateChanged: " + packageName + " u" + userId + (idle ? " idle" : " active") + " " + bucket); @@ -1182,72 +1183,67 @@ public class AppStateTracker { } } - public void dump(PrintWriter pw, String indent) { + @Deprecated + public void dump(PrintWriter pw, String prefix) { + dump(new IndentingPrintWriter(pw, " ").setIndent(prefix)); + } + + public void dump(IndentingPrintWriter pw) { synchronized (mLock) { - pw.print(indent); pw.println("Forced App Standby Feature enabled: " + mForcedAppStandbyEnabled); - pw.print(indent); pw.print("Force all apps standby: "); pw.println(isForceAllAppsStandbyEnabled()); - pw.print(indent); pw.print("Small Battery Device: "); pw.println(isSmallBatteryDevice()); - pw.print(indent); pw.print("Force all apps standby for small battery device: "); pw.println(mForceAllAppStandbyForSmallBattery); - pw.print(indent); pw.print("Plugged In: "); pw.println(mIsPluggedIn); - pw.print(indent); pw.print("Active uids: "); dumpUids(pw, mActiveUids); - pw.print(indent); pw.print("Foreground uids: "); dumpUids(pw, mForegroundUids); - pw.print(indent); pw.print("Whitelist appids: "); pw.println(Arrays.toString(mPowerWhitelistedAllAppIds)); - pw.print(indent); pw.print("Temp whitelist appids: "); pw.println(Arrays.toString(mTempWhitelistedAppIds)); - pw.print(indent); pw.println("Exempted packages:"); + pw.increaseIndent(); for (int i = 0; i < mExemptedPackages.size(); i++) { - pw.print(indent); - pw.print(" User "); + pw.print("User "); pw.print(mExemptedPackages.keyAt(i)); pw.println(); + pw.increaseIndent(); for (int j = 0; j < mExemptedPackages.sizeAt(i); j++) { - pw.print(indent); - pw.print(" "); pw.print(mExemptedPackages.valueAt(i, j)); pw.println(); } + pw.decreaseIndent(); } + pw.decreaseIndent(); pw.println(); - pw.print(indent); pw.println("Restricted packages:"); + pw.increaseIndent(); for (Pair<Integer, String> uidAndPackage : mRunAnyRestrictedPackages) { - pw.print(indent); - pw.print(" "); pw.print(UserHandle.formatUid(uidAndPackage.first)); pw.print(" "); pw.print(uidAndPackage.second); pw.println(); } + pw.decreaseIndent(); - mStatLogger.dump(pw, indent); + mStatLogger.dump(pw); } } diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java index b5a8332375f4..ad02aad6e4cd 100644 --- a/services/core/java/com/android/server/NativeDaemonConnector.java +++ b/services/core/java/com/android/server/NativeDaemonConnector.java @@ -134,21 +134,23 @@ final class NativeDaemonConnector implements Runnable, Handler.Callback, Watchdo mCallbackHandler = new Handler(mLooper, this); while (true) { + if (isShuttingDown()) break; try { listenToSocket(); } catch (Exception e) { loge("Error in NativeDaemonConnector: " + e); - String shutdownAct = SystemProperties.get( - ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); - if (shutdownAct != null && shutdownAct.length() > 0) { - // The device is in middle of shutdown. - break; - } + if (isShuttingDown()) break; SystemClock.sleep(5000); } } } + private static boolean isShuttingDown() { + String shutdownAct = SystemProperties.get( + ShutdownThread.SHUTDOWN_ACTION_PROPERTY, ""); + return shutdownAct != null && shutdownAct.length() > 0; + } + @Override public boolean handleMessage(Message msg) { final String event = (String) msg.obj; diff --git a/services/core/java/com/android/server/StatLogger.java b/services/core/java/com/android/server/StatLogger.java index 0e6f5e2338c7..d85810d31e73 100644 --- a/services/core/java/com/android/server/StatLogger.java +++ b/services/core/java/com/android/server/StatLogger.java @@ -21,6 +21,7 @@ import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.StatLoggerProto.Event; import java.io.PrintWriter; @@ -78,19 +79,23 @@ public class StatLogger { } } + @Deprecated public void dump(PrintWriter pw, String prefix) { + dump(new IndentingPrintWriter(pw, " ").setIndent(prefix)); + } + + public void dump(IndentingPrintWriter pw) { synchronized (mLock) { - pw.print(prefix); pw.println("Stats:"); + pw.increaseIndent(); for (int i = 0; i < SIZE; i++) { - pw.print(prefix); - pw.print(" "); final int count = mCountStats[i]; final double durationMs = mDurationStats[i] / 1000.0; pw.println(String.format("%s: count=%d, total=%.1fms, avg=%.3fms", mLabels[i], count, durationMs, (count == 0 ? 0 : ((double) durationMs) / count))); } + pw.decreaseIndent(); } } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index ce786656c043..8b5176e2c858 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -56,6 +56,7 @@ import com.android.internal.telephony.ITelephonyRegistry; import com.android.internal.telephony.PhoneConstantConversions; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.TelephonyIntents; +import com.android.internal.telephony.TelephonyPermissions; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; import com.android.server.am.BatteryStatsService; @@ -384,20 +385,9 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { + " callback.asBinder=" + callback.asBinder()); } - try { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, - "addOnSubscriptionsChangedListener"); - // SKIP checking for run-time permission since caller or self has PRIVILEGED permission - } catch (SecurityException e) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.READ_PHONE_STATE, - "addOnSubscriptionsChangedListener"); - - if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), - callingPackage) != AppOpsManager.MODE_ALLOWED) { - return; - } + if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState( + mContext, callingPackage, "addOnSubscriptionsChangedListener")) { + return; } @@ -493,21 +483,11 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } if (events != PhoneStateListener.LISTEN_NONE) { - /* Checks permission and throws Security exception */ - checkListenerPermission(events); - - if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { - try { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); - // SKIP checking for run-time permission since caller or self has PRIVILEGED - // permission - } catch (SecurityException e) { - if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), - callingPackage) != AppOpsManager.MODE_ALLOWED) { - return; - } - } + // Checks permission and throws SecurityException for disallowed operations. For pre-M + // apps whose runtime permission has been revoked, we return immediately to skip sending + // events to the app without crashing it. + if (!checkListenerPermission(events, callingPackage, "listen")) { + return; } int phoneId = SubscriptionManager.getPhoneId(subId); @@ -526,7 +506,8 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { r.callerPid = Binder.getCallingPid(); boolean isPhoneStateEvent = (events & (CHECK_PHONE_STATE_PERMISSION_MASK | ENFORCE_PHONE_STATE_PERMISSION_MASK)) != 0; - r.canReadPhoneState = isPhoneStateEvent && canReadPhoneState(callingPackage); + r.canReadPhoneState = + isPhoneStateEvent && canReadPhoneState(callingPackage, "listen"); // Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID, // force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID if (!SubscriptionManager.isValidSubscriptionId(subId)) { @@ -686,21 +667,13 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } } - private boolean canReadPhoneState(String callingPackage) { - if (mContext.checkCallingOrSelfPermission( - android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) == - PackageManager.PERMISSION_GRANTED) { - // SKIP checking for run-time permission since caller or self has PRIVILEGED permission - return true; - } - boolean canReadPhoneState = mContext.checkCallingOrSelfPermission( - android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED; - if (canReadPhoneState && - mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(), - callingPackage) != AppOpsManager.MODE_ALLOWED) { + private boolean canReadPhoneState(String callingPackage, String message) { + try { + return TelephonyPermissions.checkCallingOrSelfReadPhoneState( + mContext, callingPackage, message); + } catch (SecurityException e) { return false; } - return canReadPhoneState; } private String getCallIncomingNumber(Record record, int phoneId) { @@ -1672,11 +1645,12 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } private void enforceNotifyPermissionOrCarrierPrivilege(String method) { - if (checkNotifyPermission()) { + if (checkNotifyPermission()) { return; } - enforceCarrierPrivilege(); + TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege( + SubscriptionManager.getDefaultSubscriptionId(), method); } private boolean checkNotifyPermission(String method) { @@ -1694,23 +1668,7 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { == PackageManager.PERMISSION_GRANTED; } - private void enforceCarrierPrivilege() { - TelephonyManager tm = TelephonyManager.getDefault(); - String[] pkgs = mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid()); - for (String pkg : pkgs) { - if (tm.checkCarrierPrivilegesForPackage(pkg) == - TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { - return; - } - } - - String msg = "Carrier Privilege Permission Denial: from pid=" + Binder.getCallingPid() - + ", uid=" + Binder.getCallingUid(); - if (DBG) log(msg); - throw new SecurityException(msg); - } - - private void checkListenerPermission(int events) { + private boolean checkListenerPermission(int events, String callingPackage, String message) { if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.ACCESS_COARSE_LOCATION, null); @@ -1724,22 +1682,18 @@ class TelephonyRegistry extends ITelephonyRegistry.Stub { } if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) { - try { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null); - // SKIP checking for run-time permission since caller or self has PRIVILEGED - // permission - } catch (SecurityException e) { - mContext.enforceCallingOrSelfPermission( - android.Manifest.permission.READ_PHONE_STATE, null); + if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState( + mContext, callingPackage, message)) { + return false; } } if ((events & PRECISE_PHONE_STATE_PERMISSION_MASK) != 0) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.READ_PRECISE_PHONE_STATE, null); - } + + return true; } private void handleRemoveListLocked() { diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java index 39fc019a3bc8..965714dc279a 100644 --- a/services/core/java/com/android/server/TextServicesManagerService.java +++ b/services/core/java/com/android/server/TextServicesManagerService.java @@ -236,7 +236,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { pw.println(" " + "mTsListener=" + req.mTsListener); pw.println(" " + "mScListener=" + req.mScListener); pw.println( - " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId); + " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid); } final int numOnGoingSessionRequests = grp.mOnGoingSessionRequests.size(); for (int j = 0; j < numOnGoingSessionRequests; j++) { @@ -246,7 +246,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { pw.println(" " + "mTsListener=" + req.mTsListener); pw.println(" " + "mScListener=" + req.mScListener); pw.println( - " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId); + " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid); } final int N = grp.mListeners.getRegisteredCallbackCount(); for (int j = 0; j < N; j++) { @@ -738,8 +738,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } private static final class SessionRequest { - @UserIdInt - public final int mUserId; + public final int mUid; @Nullable public final String mLocale; @NonNull @@ -749,10 +748,10 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { @Nullable public final Bundle mBundle; - SessionRequest(@UserIdInt final int userId, @Nullable String locale, + SessionRequest(int uid, @Nullable String locale, @NonNull ITextServicesSessionListener tsListener, @NonNull ISpellCheckerSessionListener scListener, @Nullable Bundle bundle) { - mUserId = userId; + mUid = uid; mLocale = locale; mTsListener = tsListener; mScListener = scListener; diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 0d6d2bde48c8..6550d06b8a12 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -85,7 +85,7 @@ final class ActivityManagerConstants extends ContentObserver { private static final int DEFAULT_POWER_CHECK_MAX_CPU_3 = 10; private static final int DEFAULT_POWER_CHECK_MAX_CPU_4 = 2; private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000; - private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 24*60*60*1000L; + private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 2*60*60*1000L; private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000; private static final long DEFAULT_SERVICE_RESET_RUN_DURATION = 60*1000; private static final int DEFAULT_SERVICE_RESTART_DURATION_FACTOR = 4; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e8f0113ac2ab..d4307d72ac15 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5451,24 +5451,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } - @Override - public final void requestActivityRelaunch(IBinder token) { - synchronized(this) { - ActivityRecord r = ActivityRecord.isInStackLocked(token); - if (r == null) { - return; - } - final long origId = Binder.clearCallingIdentity(); - try { - r.forceNewConfig = true; - r.ensureActivityConfigurationLocked(0 /* globalChanges */, - true /* preserveWindow */); - } finally { - Binder.restoreCallingIdentity(origId); - } - } - } - /** * This is the internal entry point for handling Activity.finish(). * @@ -5707,8 +5689,7 @@ public class ActivityManagerService extends IActivityManager.Stub final long origId = Binder.clearCallingIdentity(); - if (self.state == ActivityState.RESUMED - || self.state == ActivityState.PAUSING) { + if (self.isState(ActivityState.RESUMED, ActivityState.PAUSING)) { mWindowManager.overridePendingAppTransition(packageName, enterAnim, exitAnim, null); } @@ -22374,7 +22355,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Update the configuration with WM first and check if any of the stacks need to be resized // due to the configuration change. If so, resize the stacks now and do any relaunches if // necessary. This way we don't need to relaunch again afterwards in - // ensureActivityConfigurationLocked(). + // ensureActivityConfiguration(). if (mWindowManager != null) { final int[] resizedStacks = mWindowManager.setNewDisplayOverrideConfiguration(mTempConfig, displayId); @@ -22402,7 +22383,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (starting != null) { - kept = starting.ensureActivityConfigurationLocked(changes, + kept = starting.ensureActivityConfiguration(changes, false /* preserveWindow */); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. @@ -22792,7 +22773,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } break; - } else if (r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED) { + } else if (r.isState(ActivityState.PAUSING, ActivityState.PAUSED)) { if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) { adj = ProcessList.PERCEPTIBLE_APP_ADJ; app.adjType = "pause-activity"; @@ -22807,7 +22788,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.cached = false; app.empty = false; foregroundActivities = true; - } else if (r.state == ActivityState.STOPPING) { + } else if (r.isState(ActivityState.STOPPING)) { if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) { adj = ProcessList.PERCEPTIBLE_APP_ADJ; app.adjType = "stop-activity"; @@ -23201,9 +23182,8 @@ public class ActivityManagerService extends IActivityManager.Stub } final ActivityRecord a = cr.activity; if ((cr.flags&Context.BIND_ADJUST_WITH_ACTIVITY) != 0) { - if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ && - (a.visible || a.state == ActivityState.RESUMED || - a.state == ActivityState.PAUSING)) { + if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ && (a.visible + || a.isState(ActivityState.RESUMED, ActivityState.PAUSING))) { adj = ProcessList.FOREGROUND_APP_ADJ; if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) { if ((cr.flags&Context.BIND_IMPORTANT) != 0) { @@ -25749,7 +25729,6 @@ public class ActivityManagerService extends IActivityManager.Stub public void notifyAppTransitionFinished() { synchronized (ActivityManagerService.this) { mStackSupervisor.notifyAppTransitionDone(); - mKeyguardController.notifyAppTransitionDone(); } } diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index dc98cb42af40..2251d2ccd5b8 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -23,24 +23,34 @@ import android.app.IActivityController; import android.app.IActivityManager; import android.app.IStopUserCallback; import android.app.IUidObserver; +import android.app.KeyguardManager; import android.app.ProfilerInfo; import android.app.WaitResult; +import android.app.usage.AppStandbyInfo; import android.app.usage.ConfigurationStats; import android.app.usage.IUsageStatsManager; import android.app.usage.UsageStatsManager; import android.content.ComponentCallbacks2; import android.content.ComponentName; import android.content.Context; +import android.content.DeviceConfigurationProto; +import android.content.GlobalConfigurationProto; import android.content.IIntentReceiver; import android.content.Intent; +import android.content.pm.ConfigurationInfo; +import android.content.pm.FeatureInfo; import android.content.pm.IPackageManager; +import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; +import android.content.pm.SharedLibraryInfo; import android.content.pm.UserInfo; import android.content.res.AssetManager; import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.Point; import android.graphics.Rect; +import android.hardware.display.DisplayManager; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -57,8 +67,11 @@ import android.text.TextUtils; import android.util.ArrayMap; import android.util.DebugUtils; import android.util.DisplayMetrics; +import android.util.proto.ProtoOutputStream; +import android.view.Display; import com.android.internal.util.HexDump; +import com.android.internal.util.MemInfoReader; import com.android.internal.util.Preconditions; import java.io.BufferedReader; @@ -75,6 +88,11 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.microedition.khronos.egl.EGL10; +import javax.microedition.khronos.egl.EGLContext; +import javax.microedition.khronos.opengles.GL; +import javax.microedition.khronos.opengles.GL10; + import static android.app.ActivityManager.RESIZE_MODE_SYSTEM; import static android.app.ActivityManager.RESIZE_MODE_USER; import static android.app.ActivityManager.StackId.INVALID_STACK_ID; @@ -443,12 +461,11 @@ final class ActivityManagerShellCommand extends ShellCommand { options.setTaskOverlay(true, true /* canResume */); } } - android.util.Log.d("bfranz", "I was here: " + mIsLockTask); if (mIsLockTask) { if (options == null) { options = ActivityOptions.makeBasic(); } - options.setLockTaskMode(true); + options.setLockTaskEnabled(true); } if (mWaitOption) { result = mInterface.startActivityAndWait(null, null, intent, mimeType, @@ -1841,17 +1858,112 @@ final class ActivityManagerShellCommand extends ShellCommand { } } - int runGetConfig(PrintWriter pw) throws RemoteException { - int days = 14; - String option = getNextOption(); - if (option != null) { - if (!option.equals("--days")) { - throw new IllegalArgumentException("unrecognized option " + option); + private void writeDeviceConfig(ProtoOutputStream protoOutputStream, long fieldId, + PrintWriter pw, Configuration config, DisplayManager dm) { + Point stableSize = dm.getStableDisplaySize(); + long token = -1; + if (protoOutputStream != null) { + token = protoOutputStream.start(fieldId); + protoOutputStream.write(DeviceConfigurationProto.STABLE_SCREEN_WIDTH_PX, stableSize.x); + protoOutputStream.write(DeviceConfigurationProto.STABLE_SCREEN_HEIGHT_PX, stableSize.y); + protoOutputStream.write(DeviceConfigurationProto.STABLE_DENSITY_DPI, + DisplayMetrics.DENSITY_DEVICE_STABLE); + } + if (pw != null) { + pw.print("stable-width-px: "); pw.println(stableSize.x); + pw.print("stable-height-px: "); pw.println(stableSize.y); + pw.print("stable-density-dpi: "); pw.println(DisplayMetrics.DENSITY_DEVICE_STABLE); + } + + MemInfoReader memreader = new MemInfoReader(); + memreader.readMemInfo(); + KeyguardManager kgm = mInternal.mContext.getSystemService(KeyguardManager.class); + if (protoOutputStream != null) { + protoOutputStream.write(DeviceConfigurationProto.TOTAL_RAM, memreader.getTotalSize()); + protoOutputStream.write(DeviceConfigurationProto.LOW_RAM, + ActivityManager.isLowRamDeviceStatic()); + protoOutputStream.write(DeviceConfigurationProto.MAX_CORES, + Runtime.getRuntime().availableProcessors()); + protoOutputStream.write(DeviceConfigurationProto.HAS_SECURE_SCREEN_LOCK, + kgm.isDeviceSecure()); + } + if (pw != null) { + pw.print("total-ram: "); pw.println(memreader.getTotalSize()); + pw.print("low-ram: "); pw.println(ActivityManager.isLowRamDeviceStatic()); + pw.print("max-cores: "); pw.println(Runtime.getRuntime().availableProcessors()); + pw.print("has-secure-screen-lock: "); pw.println(kgm.isDeviceSecure()); + } + + ConfigurationInfo configInfo = mInternal.getDeviceConfigurationInfo(); + if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) { + if (protoOutputStream != null) { + protoOutputStream.write(DeviceConfigurationProto.OPENGL_VERSION, + configInfo.reqGlEsVersion); + } + if (pw != null) { + pw.print("opengl-version: 0x"); + pw.println(Integer.toHexString(configInfo.reqGlEsVersion)); + } + } + + /* + GL10 gl = ((GL10)((EGL10)EGLContext.getEGL()).eglGetCurrentContext().getGL()); + protoOutputStream.write(DeviceConfigurationProto.OPENGL_VERSION, + gl.glGetString(GL10.GL_VERSION)); + String glExtensions = gl.glGetString(GL10.GL_EXTENSIONS); + for (String ext : glExtensions.split(" ")) { + protoOutputStream.write(DeviceConfigurationProto.OPENGL_EXTENSIONS, ext); + } + */ + + PackageManager pm = mInternal.mContext.getPackageManager(); + List<SharedLibraryInfo> slibs = pm.getSharedLibraries(0); + for (int i = 0; i < slibs.size(); i++) { + if (protoOutputStream != null) { + protoOutputStream.write(DeviceConfigurationProto.SHARED_LIBRARIES, + slibs.get(i).getName()); + } + if (pw != null) { + pw.print("shared-libraries: "); pw.println(slibs.get(i).getName()); } + } - days = Integer.parseInt(getNextArgRequired()); - if (days <= 0) { - throw new IllegalArgumentException("--days must be a positive integer"); + FeatureInfo[] features = pm.getSystemAvailableFeatures(); + for (int i = 0; i < features.length; i++) { + if (features[i].name != null) { + if (protoOutputStream != null) { + protoOutputStream.write(DeviceConfigurationProto.FEATURES, features[i].name); + } + if (pw != null) { + pw.print("features: "); pw.println(features[i].name); + } + } + } + + if (protoOutputStream != null) { + protoOutputStream.end(token); + } + } + + int runGetConfig(PrintWriter pw) throws RemoteException { + int days = -1; + boolean asProto = false; + boolean inclDevice = false; + + String opt; + while ((opt=getNextOption()) != null) { + if (opt.equals("--days")) { + days = Integer.parseInt(getNextArgRequired()); + if (days <= 0) { + throw new IllegalArgumentException("--days must be a positive integer"); + } + } else if (opt.equals("--proto")) { + asProto = true; + } else if (opt.equals("--device")) { + inclDevice = true; + } else { + getErrPrintWriter().println("Error: Unknown option: " + opt); + return -1; } } @@ -1861,18 +1973,38 @@ final class ActivityManagerShellCommand extends ShellCommand { return -1; } - pw.println("config: " + Configuration.resourceQualifierString(config)); - pw.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS)); + DisplayManager dm = mInternal.mContext.getSystemService(DisplayManager.class); + Display display = dm.getDisplay(Display.DEFAULT_DISPLAY); + DisplayMetrics metrics = new DisplayMetrics(); + display.getMetrics(metrics); - final List<Configuration> recentConfigs = getRecentConfigurations(days); - final int recentConfigSize = recentConfigs.size(); - if (recentConfigSize > 0) { - pw.println("recentConfigs:"); - } + if (asProto) { + final ProtoOutputStream proto = new ProtoOutputStream(getOutFileDescriptor()); + config.writeResConfigToProto(proto, GlobalConfigurationProto.RESOURCES, metrics); + if (inclDevice) { + writeDeviceConfig(proto, GlobalConfigurationProto.DEVICE, null, config, dm); + } + proto.flush(); + + } else { + pw.println("config: " + Configuration.resourceQualifierString(config, metrics)); + pw.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS)); + if (inclDevice) { + writeDeviceConfig(null, -1, pw, config, dm); + } + + if (days >= 0) { + final List<Configuration> recentConfigs = getRecentConfigurations(days); + final int recentConfigSize = recentConfigs.size(); + if (recentConfigSize > 0) { + pw.println("recentConfigs:"); + for (int i = 0; i < recentConfigSize; i++) { + pw.println(" config: " + Configuration.resourceQualifierString( + recentConfigs.get(i))); + } + } + } - for (int i = 0; i < recentConfigSize; i++) { - pw.println(" config: " + Configuration.resourceQualifierString( - recentConfigs.get(i))); } return 0; } @@ -1951,15 +2083,16 @@ final class ActivityManagerShellCommand extends ShellCommand { if (!multiple) { usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId); } else { - HashMap<String, Integer> buckets = new HashMap<>(); - buckets.put(packageName, bucket); + ArrayList<AppStandbyInfo> bucketInfoList = new ArrayList<>(); + bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); while ((packageName = getNextArg()) != null) { value = getNextArgRequired(); bucket = bucketNameToBucketValue(value); if (bucket < 0) continue; - buckets.put(packageName, bucket); + bucketInfoList.add(new AppStandbyInfo(packageName, bucket)); } - usm.setAppStandbyBuckets(buckets, userId); + ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList); + usm.setAppStandbyBuckets(slice, userId); } return 0; } @@ -1984,11 +2117,11 @@ final class ActivityManagerShellCommand extends ShellCommand { int bucket = usm.getAppStandbyBucket(packageName, null, userId); pw.println(bucket); } else { - Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets( + ParceledListSlice<AppStandbyInfo> buckets = usm.getAppStandbyBuckets( SHELL_PACKAGE_NAME, userId); - for (Map.Entry<String, Integer> entry: buckets.entrySet()) { - pw.print(entry.getKey()); pw.print(": "); - pw.println(entry.getValue()); + for (AppStandbyInfo bucketInfo : buckets.getList()) { + pw.print(bucketInfo.mPackageName); pw.print(": "); + pw.println(bucketInfo.mStandbyBucket); } } return 0; @@ -2734,8 +2867,11 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" Gets the process state of an app given its <UID>."); pw.println(" attach-agent <PROCESS> <FILE>"); pw.println(" Attach an agent to the specified <PROCESS>, which may be either a process name or a PID."); - pw.println(" get-config"); - pw.println(" Rtrieve the configuration and any recent configurations of the device."); + pw.println(" get-config [--days N] [--device] [--proto]"); + pw.println(" Retrieve the configuration and any recent configurations of the device."); + pw.println(" --days: also return last N days of configurations that have been seen."); + pw.println(" --device: also output global device configuration info."); + pw.println(" --proto: return result as a proto; does not include --days info."); pw.println(" supports-multiwindow"); pw.println(" Returns true if the device supports multiwindow."); pw.println(" supports-split-screen-multi-window"); diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java index db86f1a011df..978e344b22ff 100644 --- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java @@ -23,6 +23,8 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TR import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON; +import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; @@ -35,6 +37,9 @@ import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.dex.ArtManagerInternal; +import android.content.pm.dex.PackageOptimizationInfo; import android.metrics.LogMaker; import android.os.Handler; import android.os.Looper; @@ -47,6 +52,7 @@ import android.util.StatsLog; import com.android.internal.logging.MetricsLogger; import com.android.internal.os.SomeArgs; +import com.android.server.LocalServices; import java.util.ArrayList; @@ -68,7 +74,8 @@ class ActivityMetricsLogger { private static final long INVALID_START_TIME = -1; private static final int MSG_CHECK_VISIBILITY = 0; - private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 1; + private static final int MSG_LOG_APP_TRANSITION = 1; + private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 2; // Preallocated strings we are sending to tron, so we don't have to allocate a new one every // time we log. @@ -93,6 +100,9 @@ class ActivityMetricsLogger { private final SparseArray<WindowingModeTransitionInfo> mLastWindowingModeTransitionInfo = new SparseArray<>(); private final H mHandler; + + private ArtManagerInternal mArtManagerInternal; + private final class H extends Handler { public H(Looper looper) { @@ -106,12 +116,16 @@ class ActivityMetricsLogger { final SomeArgs args = (SomeArgs) msg.obj; checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2); break; + case MSG_LOG_APP_TRANSITION: + logAppTransition(msg.arg1, msg.arg2, + (WindowingModeTransitionInfoSnapshot) msg.obj); + break; case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE: logAppStartMemoryStateCapture((WindowingModeTransitionInfo) msg.obj); break; } } - }; + } private final class WindowingModeTransitionInfo { private ActivityRecord launchedActivity; @@ -125,6 +139,36 @@ class ActivityMetricsLogger { private boolean loggedStartingWindowDrawn; } + private final class WindowingModeTransitionInfoSnapshot { + final private ApplicationInfo applicationInfo; + final private String packageName; + final private String launchedActivityName; + final private String launchedActivityLaunchedFromPackage; + final private String launchedActivityLaunchToken; + final private String launchedActivityAppRecordRequiredAbi; + final private int reason; + final private int startingWindowDelayMs; + final private int bindApplicationDelayMs; + final private int windowsDrawnDelayMs; + final private int type; + + private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info) { + applicationInfo = info.launchedActivity.appInfo; + packageName = info.launchedActivity.packageName; + launchedActivityName = info.launchedActivity.info.name; + launchedActivityLaunchedFromPackage = info.launchedActivity.launchedFromPackage; + launchedActivityLaunchToken = info.launchedActivity.info.launchToken; + launchedActivityAppRecordRequiredAbi = info.launchedActivity.app == null + ? null + : info.launchedActivity.app.requiredAbi; + reason = info.reason; + startingWindowDelayMs = info.startingWindowDelayMs; + bindApplicationDelayMs = info.bindApplicationDelayMs; + windowsDrawnDelayMs = info.windowsDrawnDelayMs; + type = getTransitionType(info); + } + } + ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context, Looper looper) { mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000; mSupervisor = supervisor; @@ -456,54 +500,80 @@ class ActivityMetricsLogger { if (type == -1) { return; } - final LogMaker builder = new LogMaker(APP_TRANSITION); - builder.setPackageName(info.launchedActivity.packageName); - builder.setType(type); - builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name); - final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp(); - if (info.launchedActivity.launchedFromPackage != null) { - builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, - info.launchedActivity.launchedFromPackage); - } - String launchToken = info.launchedActivity.info.launchToken; - if (launchToken != null) { - builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken); - info.launchedActivity.info.launchToken = null; - } - builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0); - builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS, - mCurrentTransitionDeviceUptime); - builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs); - builder.setSubtype(info.reason); - if (info.startingWindowDelayMs != -1) { - builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS, - info.startingWindowDelayMs); - } - if (info.bindApplicationDelayMs != -1) { - builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS, - info.bindApplicationDelayMs); - } - builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); - mMetricsLogger.write(builder); - StatsLog.write( - StatsLog.APP_START_CHANGED, - info.launchedActivity.appInfo.uid, - info.launchedActivity.packageName, - convertAppStartTransitionType(type), - info.launchedActivity.info.name, - info.launchedActivity.launchedFromPackage, - isInstantApp, - mCurrentTransitionDeviceUptime * 1000, - info.reason, - mCurrentTransitionDelayMs, - info.startingWindowDelayMs, - info.bindApplicationDelayMs, - info.windowsDrawnDelayMs, - launchToken); + + // Take a snapshot of the transition info before sending it to the handler for logging. + // This will avoid any races with other operations that modify the ActivityRecord. + final WindowingModeTransitionInfoSnapshot infoSnapshot = + new WindowingModeTransitionInfoSnapshot(info); + mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime, + mCurrentTransitionDelayMs, infoSnapshot).sendToTarget(); + + info.launchedActivity.info.launchToken = null; mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget(); } } + // This gets called on the handler without holding the activity manager lock. + private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs, + WindowingModeTransitionInfoSnapshot info) { + final LogMaker builder = new LogMaker(APP_TRANSITION); + builder.setPackageName(info.packageName); + builder.setType(info.type); + builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivityName); + final boolean isInstantApp = info.applicationInfo.isInstantApp(); + if (info.launchedActivityLaunchedFromPackage != null) { + builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME, + info.launchedActivityLaunchedFromPackage); + } + String launchToken = info.launchedActivityLaunchToken; + if (launchToken != null) { + builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken); + } + builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0); + builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS, + currentTransitionDeviceUptime); + builder.addTaggedData(APP_TRANSITION_DELAY_MS, currentTransitionDelayMs); + builder.setSubtype(info.reason); + if (info.startingWindowDelayMs != -1) { + builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS, + info.startingWindowDelayMs); + } + if (info.bindApplicationDelayMs != -1) { + builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS, + info.bindApplicationDelayMs); + } + builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs); + final ArtManagerInternal artManagerInternal = getArtManagerInternal(); + final PackageOptimizationInfo packageOptimizationInfo = + (artManagerInternal == null) || (info.launchedActivityAppRecordRequiredAbi == null) + ? PackageOptimizationInfo.createWithNoInfo() + : artManagerInternal.getPackageOptimizationInfo( + info.applicationInfo, + info.launchedActivityAppRecordRequiredAbi); + builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_REASON, + packageOptimizationInfo.getCompilationReason()); + builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_FILTER, + packageOptimizationInfo.getCompilationFilter()); + mMetricsLogger.write(builder); + StatsLog.write( + StatsLog.APP_START_CHANGED, + info.applicationInfo.uid, + info.packageName, + convertAppStartTransitionType(info.type), + info.launchedActivityName, + info.launchedActivityLaunchedFromPackage, + isInstantApp, + currentTransitionDeviceUptime * 1000, + info.reason, + currentTransitionDelayMs, + info.startingWindowDelayMs, + info.bindApplicationDelayMs, + info.windowsDrawnDelayMs, + launchToken, + packageOptimizationInfo.getCompilationReason(), + packageOptimizationInfo.getCompilationFilter()); + } + private int convertAppStartTransitionType(int tronType) { if (tronType == TYPE_TRANSITION_COLD_LAUNCH) { return StatsLog.APP_START_CHANGED__TYPE__COLD; @@ -592,4 +662,14 @@ class ActivityMetricsLogger { launchedActivity.appInfo.uid) : null; } + + private ArtManagerInternal getArtManagerInternal() { + if (mArtManagerInternal == null) { + // Note that this may be null. + // ArtManagerInternal is registered during PackageManagerService + // initialization which happens after ActivityManagerService. + mArtManagerInternal = LocalServices.getService(ArtManagerInternal.class); + } + return mArtManagerInternal; + } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 4e609241238e..8cc927346500 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -288,7 +288,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold UriPermissionOwner uriPermissions; // current special URI access perms. ProcessRecord app; // if non-null, hosting application - ActivityState state; // current state we are in + private ActivityState mState; // current state we are in Bundle icicle; // last saved activity state PersistableBundle persistentState; // last persistently saved activity state // TODO: See if this is still needed. @@ -361,7 +361,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo private boolean mTurnScreenOn; /** - * Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)} + * Temp configs used in {@link #ensureActivityConfiguration(int, boolean)} */ private final Configuration mTmpConfig = new Configuration(); private final Rect mTmpBounds = new Rect(); @@ -381,8 +381,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo String getLifecycleDescription(String reason) { return "name= " + this + ", component=" + intent.getComponent().flattenToShortString() - + ", package=" + packageName + ", state=" + state + ", reason=" + reason + ", time=" - + System.currentTimeMillis(); + + ", package=" + packageName + ", state=" + mState + ", reason=" + reason + + ", time=" + System.currentTimeMillis(); } void dump(PrintWriter pw, String prefix) { @@ -503,7 +503,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo pw.println(); pw.print(prefix); pw.print("haveState="); pw.print(haveState); pw.print(" icicle="); pw.println(icicle); - pw.print(prefix); pw.print("state="); pw.print(state); + pw.print(prefix); pw.print("state="); pw.print(mState); pw.print(" stopped="); pw.print(stopped); pw.print(" delayedResume="); pw.print(delayedResume); pw.print(" finishing="); pw.println(finishing); @@ -841,7 +841,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo resultTo = _resultTo; resultWho = _resultWho; requestCode = _reqCode; - state = INITIALIZING; + setState(INITIALIZING, "ActivityRecord ctor"); frontOfTask = false; launchFailed = false; stopped = false; @@ -1000,6 +1000,11 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } void removeWindowContainer() { + // Do not try to remove a window container if we have already removed it. + if (mWindowContainerController == null) { + return; + } + // Resume key dispatching if it is currently paused before we remove the container. resumeKeyDispatchingLocked(); @@ -1259,7 +1264,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return false; } - switch (state) { + switch (mState) { case RESUMED: // When visible, allow entering PiP if the app is not locked. If it is over the // keyguard, then we will prompt to unlock in the caller before entering PiP. @@ -1385,13 +1390,13 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // - It is currently resumed or paused. i.e. it is currently visible to the user and we want // the user to see the visual effects caused by the intent delivery now. // - The device is sleeping and it is the top activity behind the lock screen (b/6700897). - if ((state == RESUMED || state == PAUSED + if ((mState == RESUMED || mState == PAUSED || isTopActivityWhileSleeping) && app != null && app.thread != null) { try { ArrayList<ReferrerIntent> ar = new ArrayList<>(1); ar.add(rintent); service.mLifecycleManager.scheduleTransaction(app.thread, appToken, - NewIntentItem.obtain(ar, state == PAUSED)); + NewIntentItem.obtain(ar, mState == PAUSED)); unsent = false; } catch (RemoteException e) { Slog.w(TAG, "Exception thrown sending new intent to " + this, e); @@ -1573,6 +1578,63 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true; } + void setState(ActivityState state, String reason) { + if (DEBUG_STATES) Slog.v(TAG_STATES, "State movement: " + this + " from:" + getState() + + " to:" + state + " reason:" + reason); + final boolean stateChanged = mState != state; + mState = state; + + if (stateChanged && isState(DESTROYING, DESTROYED)) { + makeFinishingLocked(); + + // When moving to the destroyed state, immediately destroy the activity in the + // associated stack. Most paths for finishing an activity will handle an activity's path + // to destroy through mechanisms such as ActivityStackSupervisor#mFinishingActivities. + // However, moving to the destroyed state directly (as in the case of an app dying) and + // marking it as finished will lead to cleanup steps that will prevent later handling + // from happening. + if (isState(DESTROYED)) { + final ActivityStack stack = getStack(); + if (stack != null) { + stack.activityDestroyedLocked(this, reason); + } + } + } + } + + ActivityState getState() { + return mState; + } + + /** + * Returns {@code true} if the Activity is in the specified state. + */ + boolean isState(ActivityState state) { + return state == mState; + } + + /** + * Returns {@code true} if the Activity is in one of the specified states. + */ + boolean isState(ActivityState state1, ActivityState state2) { + return state1 == mState || state2 == mState; + } + + /** + * Returns {@code true} if the Activity is in one of the specified states. + */ + boolean isState(ActivityState state1, ActivityState state2, ActivityState state3) { + return state1 == mState || state2 == mState || state3 == mState; + } + + /** + * Returns {@code true} if the Activity is in one of the specified states. + */ + boolean isState(ActivityState state1, ActivityState state2, ActivityState state3, + ActivityState state4) { + return state1 == mState || state2 == mState || state3 == mState || state4 == mState; + } + void notifyAppResumed(boolean wasStopped) { mWindowContainerController.notifyAppResumed(wasStopped); } @@ -1602,9 +1664,9 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo void makeVisibleIfNeeded(ActivityRecord starting) { // This activity is not currently visible, but is running. Tell it to become visible. - if (state == RESUMED || this == starting) { + if (mState == RESUMED || this == starting) { if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, - "Not making visible, r=" + this + " state=" + state + " starting=" + starting); + "Not making visible, r=" + this + " state=" + mState + " starting=" + starting); return; } @@ -1625,6 +1687,20 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo // The activity may be waiting for stop, but that is no longer appropriate for it. mStackSupervisor.mStoppingActivities.remove(this); mStackSupervisor.mGoingToSleepActivities.remove(this); + + // If the activity is stopped or stopping, cycle to the paused state. + if (isState(STOPPED, STOPPING)) { + // Capture reason before state change + final String reason = getLifecycleDescription("makeVisibleIfNeeded"); + + // An activity must be in the {@link PAUSING} state for the system to validate + // the move to {@link PAUSED}. + setState(PAUSING, "makeVisibleIfNeeded"); + service.mLifecycleManager.scheduleTransaction(app.thread, appToken, + PauseActivityItem.obtain(finishing, false /* userLeaving */, + configChangeFlags, false /* dontReport */) + .setDescription(reason)); + } } catch (Exception e) { // Just skip on any failure; we'll make it visible when it next restarts. Slog.w(TAG, "Exception thrown making visibile: " + intent.getComponent(), e); @@ -1640,7 +1716,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } } catch(RemoteException e) { } - return state == RESUMED; + return mState == RESUMED; } static void activityResumedLocked(IBinder token) { @@ -1714,7 +1790,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo final void activityStoppedLocked(Bundle newIcicle, PersistableBundle newPersistentState, CharSequence description) { final ActivityStack stack = getStack(); - if (state != STOPPING) { + if (mState != STOPPING) { Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this); stack.mHandler.removeMessages(STOP_TIMEOUT_MSG, this); return; @@ -1737,7 +1813,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to STOPPED: " + this + " (stop complete)"); stack.mHandler.removeMessages(STOP_TIMEOUT_MSG, this); stopped = true; - state = STOPPED; + setState(STOPPED, "activityStoppedLocked"); mWindowContainerController.notifyAppStopped(); @@ -2007,8 +2083,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo * currently pausing, or is resumed. */ public boolean isInterestingToUserLocked() { - return visible || nowVisible || state == PAUSING || - state == RESUMED; + return visible || nowVisible || mState == PAUSING || mState == RESUMED; } void setSleeping(boolean _sleeping) { @@ -2070,8 +2145,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } final boolean isDestroyable() { - if (finishing || app == null || state == DESTROYING - || state == DESTROYED) { + if (finishing || app == null) { // This would be redundant. return false; } @@ -2137,7 +2211,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags, prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(), allowTaskSnapshot(), - state.ordinal() >= RESUMED.ordinal() && state.ordinal() <= STOPPED.ordinal(), + mState.ordinal() >= RESUMED.ordinal() && mState.ordinal() <= STOPPED.ordinal(), fromRecents); if (shown) { mStartingWindowState = STARTING_WINDOW_SHOWN; @@ -2291,13 +2365,27 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo outBounds.offsetTo(left, 0 /* top */); } + boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow) { + return ensureActivityConfiguration(globalChanges, preserveWindow, + false /* ignoreStopState */); + } + /** - * Make sure the given activity matches the current configuration. Returns false if the activity - * had to be destroyed. Returns true if the configuration is the same, or the activity will - * remain running as-is for whatever reason. Ensures the HistoryRecord is updated with the - * correct configuration and all other bookkeeping is handled. + * Make sure the given activity matches the current configuration. Ensures the HistoryRecord + * is updated with the correct configuration and all other bookkeeping is handled. + * + * @param globalChanges The changes to the global configuration. + * @param preserveWindow If the activity window should be preserved on screen if the activity + * is relaunched. + * @param ignoreStopState If we should try to relaunch the activity even if it is in the stopped + * state. This is useful for the case where we know the activity will be + * visible soon and we want to ensure its configuration before we make it + * visible. + * @return True if the activity was relaunched and false if it wasn't relaunched because we + * can't or the app handles the specific configuration that is changing. */ - boolean ensureActivityConfigurationLocked(int globalChanges, boolean preserveWindow) { + boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow, + boolean ignoreStopState) { final ActivityStack stack = getStack(); if (stack.mConfigWillChange) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, @@ -2313,8 +2401,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo return true; } - // Skip updating configuration for activity that are stopping or stopped. - if (state == STOPPING || state == STOPPED) { + if (!ignoreStopState && (mState == STOPPING || mState == STOPPED)) { if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Skipping config check stopped or stopping: " + this); return true; @@ -2364,7 +2451,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo setLastReportedConfiguration(service.getGlobalConfiguration(), newMergedOverrideConfig); - if (state == INITIALIZING) { + if (mState == INITIALIZING) { // No need to relaunch or schedule new config for activity that hasn't been launched // yet. We do, however, return after applying the config to activity record, so that // it will use it for launch transaction. @@ -2417,7 +2504,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Config is destroying non-running " + this); stack.destroyActivityLocked(this, true, "config"); - } else if (state == PAUSING) { + } else if (mState == PAUSING) { // A little annoying: we are waiting for this activity to finish pausing. Let's not // do anything now, but just flag that it needs to be restarted when done pausing. if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, @@ -2425,7 +2512,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo deferRelaunchUntilPaused = true; preserveWindowOnDeferredRelaunch = preserveWindow; return true; - } else if (state == RESUMED) { + } else if (mState == RESUMED) { // Try to optimize this case: the configuration is changing and we need to restart // the top, resumed activity. Instead of doing the normal handshaking, just say // "restart!". @@ -2595,7 +2682,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo service.showAskCompatModeDialogLocked(this); } else { service.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this); - state = PAUSED; + setState(PAUSED, "relaunchActivityLocked"); // if the app is relaunched when it's stopped, and we're not resuming, // put it back into stopped state. if (stopped) { @@ -2839,7 +2926,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo final long token = proto.start(fieldId); super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */); writeIdentifierToProto(proto, IDENTIFIER); - proto.write(STATE, state.toString()); + proto.write(STATE, mState.toString()); proto.write(VISIBLE, visible); proto.write(FRONT_OF_TASK, frontOfTask); if (app != null) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index fe1067096609..4987b336651e 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -70,7 +70,12 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_USER_LEAV import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; +import static com.android.server.am.ActivityStack.ActivityState.DESTROYING; +import static com.android.server.am.ActivityStack.ActivityState.FINISHING; import static com.android.server.am.ActivityStack.ActivityState.PAUSED; +import static com.android.server.am.ActivityStack.ActivityState.PAUSING; +import static com.android.server.am.ActivityStack.ActivityState.RESUMED; import static com.android.server.am.ActivityStack.ActivityState.STOPPED; import static com.android.server.am.ActivityStack.ActivityState.STOPPING; import static com.android.server.am.ActivityStackSupervisor.FindTaskResult; @@ -118,7 +123,6 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.net.Uri; import android.os.Binder; -import android.os.Bundle; import android.os.Debug; import android.os.Handler; import android.os.IBinder; @@ -1353,8 +1357,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities; for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); - if (r.state == STOPPING || r.state == STOPPED - || r.state == ActivityState.PAUSED || r.state == ActivityState.PAUSING) { + if (r.isState(STOPPING, STOPPED, PAUSED, PAUSING)) { r.setSleeping(true); } } @@ -1401,7 +1404,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai ActivityRecord resuming, boolean pauseImmediately) { if (mPausingActivity != null) { Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity - + " state=" + mPausingActivity.state); + + " state=" + mPausingActivity.getState()); if (!shouldSleepActivities()) { // Avoid recursion among check for sleep and complete pause during sleeping. // Because activity will be paused immediately after resume, just let pause @@ -1431,7 +1434,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai mLastPausedActivity = prev; mLastNoHistoryActivity = (prev.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_HISTORY) != 0 || (prev.info.flags & ActivityInfo.FLAG_NO_HISTORY) != 0 ? prev : null; - prev.state = ActivityState.PAUSING; + prev.setState(PAUSING, "startPausingLocked"); prev.getTask().touchActiveTime(); clearLaunchTime(prev); final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(); @@ -1525,8 +1528,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai r.userId, System.identityHashCode(r), r.shortComponentName, mPausingActivity != null ? mPausingActivity.shortComponentName : "(none)"); - if (r.state == ActivityState.PAUSING) { - r.state = ActivityState.PAUSED; + if (r.isState(PAUSING)) { + r.setState(PAUSED, "activityPausedLocked"); if (r.finishing) { if (DEBUG_PAUSE) Slog.v(TAG, "Executing finish of failed to pause activity: " + r); @@ -1544,8 +1547,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Complete pause: " + prev); if (prev != null) { - final boolean wasStopping = prev.state == STOPPING; - prev.state = ActivityState.PAUSED; + final boolean wasStopping = prev.isState(STOPPING); + prev.setState(PAUSED, "completePausedLocked"); if (prev.finishing) { if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Executing finish of activity: " + prev); prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false, @@ -1566,7 +1569,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // We are also stopping, the stop request must have gone soon after the pause. // We can't clobber it, because the stop confirmation will not be handled. // We don't need to schedule another stop, we only need to let it happen. - prev.state = STOPPING; + prev.setState(STOPPING, "completePausedLocked"); } else if (!prev.visible || shouldSleepOrShutDownActivities()) { // Clear out any deferred client hide we might currently have. prev.setDeferHidingClient(false); @@ -1843,11 +1846,14 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } if (reallyVisible) { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r - + " finishing=" + r.finishing + " state=" + r.state); + + " finishing=" + r.finishing + " state=" + r.getState()); // First: if this is not the current activity being started, make // sure it matches the current configuration. if (r != starting) { - r.ensureActivityConfigurationLocked(0 /* globalChanges */, preserveWindows); + // Ensure activity configuration ignoring stop state since we are + // becoming visible. + r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindows, + true /* ignoreStopState */); } if (r.app == null || r.app.thread == null) { @@ -1875,7 +1881,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai configChanges |= r.configChangeFlags; } else { if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r - + " finishing=" + r.finishing + " state=" + r.state + + " finishing=" + r.finishing + " state=" + r.getState() + " stackShouldBeVisible=" + stackShouldBeVisible + " behindFullscreenActivity=" + behindFullscreenActivity + " mLaunchTaskBehind=" + r.mLaunchTaskBehind); @@ -2059,7 +2065,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } // Now for any activities that aren't visible to the user, make sure they no longer are // keeping the screen frozen. - if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r + " " + r.state); + if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r + " " + r.getState()); try { final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState( "makeInvisible", true /* beforeStopping */); @@ -2071,11 +2077,11 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // the current contract for "auto-Pip" is that the app should enter it before onPause // returns. Just need to confirm this reasoning makes sense. final boolean deferHidingClient = canEnterPictureInPicture - && r.state != STOPPING && r.state != STOPPED && r.state != PAUSED; + && !r.isState(STOPPING, STOPPED, PAUSED); r.setDeferHidingClient(deferHidingClient); r.setVisible(false); - switch (r.state) { + switch (r.getState()) { case STOPPING: case STOPPED: if (r.app != null && r.app.thread != null) { @@ -2255,7 +2261,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // TODO: move mResumedActivity to stack supervisor, // there should only be 1 global copy of resumed activity. mResumedActivity = r; - r.state = ActivityState.RESUMED; + r.setState(RESUMED, "setResumedActivityLocked"); mService.setResumedActivityUncheckLocked(r, reason); mStackSupervisor.mRecentTasks.add(r.getTask()); } @@ -2294,8 +2300,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai next.delayedResume = false; // If the top activity is the resumed one, nothing to do. - if (mResumedActivity == next && next.state == ActivityState.RESUMED && - mStackSupervisor.allResumedActivitiesComplete()) { + if (mResumedActivity == next && next.isState(RESUMED) + && mStackSupervisor.allResumedActivitiesComplete()) { // Make sure we have executed any pending transitions, since there // should be nothing left to do at this point. executeAppTransition(options); @@ -2389,8 +2395,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked(); return true; - } else if (mResumedActivity == next && next.state == ActivityState.RESUMED && - mStackSupervisor.allResumedActivitiesComplete()) { + } else if (mResumedActivity == next && next.isState(RESUMED) + && mStackSupervisor.allResumedActivitiesComplete()) { // It is possible for the activity to be resumed when we paused back stacks above if the // next activity doesn't have to wait for pause to complete. // So, nothing else to-do except: @@ -2539,7 +2545,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai ActivityRecord lastResumedActivity = lastStack == null ? null :lastStack.mResumedActivity; - ActivityState lastState = next.state; + final ActivityState lastState = next.getState(); mService.updateCpuStats(); @@ -2645,7 +2651,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // Whoops, need to restart this activity! if (DEBUG_STATES) Slog.v(TAG_STATES, "Resume failed; resetting state to " + lastState + ": " + next); - next.state = lastState; + next.setState(lastState, "resumeTopActivityInnerLocked"); if (lastStack != null) { lastStack.mResumedActivity = lastResumedActivity; } @@ -3408,7 +3414,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai r.stopped = false; if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to STOPPING: " + r + " (stop requested)"); - r.state = STOPPING; + r.setState(STOPPING, "stopActivityLocked"); if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Stopping visible=" + r.visible + " for " + r); if (!r.visible) { @@ -3432,7 +3438,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai // Just in case, assume it to be stopped. r.stopped = true; if (DEBUG_STATES) Slog.v(TAG_STATES, "Stop failed; moving to STOPPED: " + r); - r.state = STOPPED; + r.setState(STOPPED, "stopActivityLocked"); if (r.deferRelaunchUntilPaused) { destroyActivityLocked(r, true, "stop-except"); } @@ -3505,9 +3511,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } if (activityNdx >= 0) { r = mTaskHistory.get(taskNdx).mActivities.get(activityNdx); - if (r.state == ActivityState.RESUMED - || r.state == ActivityState.PAUSING - || r.state == ActivityState.PAUSED) { + if (r.isState(RESUMED, PAUSING, PAUSED)) { if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) { Slog.w(TAG, " Force finishing activity " + r.intent.getComponent().flattenToShortString()); @@ -3671,7 +3675,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (endTask) { mService.mLockTaskController.clearLockedTask(task); } - } else if (r.state != ActivityState.PAUSING) { + } else if (!r.isState(PAUSING)) { // If the activity is PAUSING, we will complete the finish once // it is done pausing; else we can just directly finish it here. if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Finish not pausing: " + r); @@ -3738,7 +3742,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai } if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to STOPPING: "+ r + " (finish requested)"); - r.state = STOPPING; + r.setState(STOPPING, "finishCurrentActivityLocked"); if (oomAdj) { mService.updateOomAdjLocked(); } @@ -3752,15 +3756,15 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (mResumedActivity == r) { mResumedActivity = null; } - final ActivityState prevState = r.state; + final ActivityState prevState = r.getState(); if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to FINISHING: " + r); - r.state = ActivityState.FINISHING; + r.setState(FINISHING, "finishCurrentActivityLocked"); final boolean finishingActivityInNonFocusedStack = r.getStack() != mStackSupervisor.getFocusedStack() - && prevState == ActivityState.PAUSED && mode == FINISH_AFTER_VISIBLE; + && prevState == PAUSED && mode == FINISH_AFTER_VISIBLE; if (mode == FINISH_IMMEDIATELY - || (prevState == ActivityState.PAUSED + || (prevState == PAUSED && (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode())) || finishingActivityInNonFocusedStack || prevState == STOPPING @@ -3981,7 +3985,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (setState) { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (cleaning up)"); - r.state = ActivityState.DESTROYED; + r.setState(DESTROYED, "cleanupActivityLocked"); if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during cleanUp for activity " + r); r.app = null; } @@ -4030,7 +4034,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai removeTimeoutsForActivityLocked(r); if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (removed from history)"); - r.state = ActivityState.DESTROYED; + r.setState(DESTROYED, "removeActivityFromHistoryLocked"); if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during remove for activity " + r); r.app = null; r.removeWindowContainer(); @@ -4114,7 +4118,8 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai continue; } if (r.isDestroyable()) { - if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.state + if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r + + " in state " + r.getState() + " resumed=" + mResumedActivity + " pausing=" + mPausingActivity + " for reason " + reason); if (destroyActivityLocked(r, true, reason)) { @@ -4131,7 +4136,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai final boolean safelyDestroyActivityLocked(ActivityRecord r, String reason) { if (r.isDestroyable()) { if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, - "Destroying " + r + " in state " + r.state + " resumed=" + mResumedActivity + "Destroying " + r + " in state " + r.getState() + " resumed=" + mResumedActivity + " pausing=" + mPausingActivity + " for reason " + reason); return destroyActivityLocked(r, true, reason); } @@ -4159,7 +4164,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai final ActivityRecord activity = activities.get(actNdx); if (activity.app == app && activity.isDestroyable()) { if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + activity - + " in state " + activity.state + " resumed=" + mResumedActivity + + " in state " + activity.getState() + " resumed=" + mResumedActivity + " pausing=" + mPausingActivity + " for reason " + reason); destroyActivityLocked(activity, true, reason); if (activities.get(actNdx) != activity) { @@ -4253,13 +4258,15 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai if (r.finishing && !skipDestroy) { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYING: " + r + " (destroy requested)"); - r.state = ActivityState.DESTROYING; + r.setState(DESTROYING, + "destroyActivityLocked. finishing and not skipping destroy"); Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG, r); mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT); } else { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (destroy skipped)"); - r.state = ActivityState.DESTROYED; + r.setState(DESTROYED, + "destroyActivityLocked. not finishing or skipping destroy"); if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + r); r.app = null; } @@ -4270,7 +4277,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai removedFromHistory = true; } else { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (no app)"); - r.state = ActivityState.DESTROYED; + r.setState(DESTROYED, "destroyActivityLocked. not finishing and had no app"); if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + r); r.app = null; } @@ -4288,24 +4295,29 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai final void activityDestroyedLocked(IBinder token, String reason) { final long origId = Binder.clearCallingIdentity(); try { - ActivityRecord r = ActivityRecord.forTokenLocked(token); - if (r != null) { - mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r); - } - if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "activityDestroyedLocked: r=" + r); - - if (isInStackLocked(r) != null) { - if (r.state == ActivityState.DESTROYING) { - cleanUpActivityLocked(r, true, false); - removeActivityFromHistoryLocked(r, reason); - } - } - mStackSupervisor.resumeFocusedStackTopActivityLocked(); + activityDestroyedLocked(ActivityRecord.forTokenLocked(token), reason); } finally { Binder.restoreCallingIdentity(origId); } } + final void activityDestroyedLocked(ActivityRecord record, String reason) { + if (record != null) { + mHandler.removeMessages(DESTROY_TIMEOUT_MSG, record); + } + + if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "activityDestroyedLocked: r=" + record); + + if (isInStackLocked(record) != null) { + if (record.isState(DESTROYING, DESTROYED)) { + cleanUpActivityLocked(record, true, false); + removeActivityFromHistoryLocked(record, reason); + } + } + + mStackSupervisor.resumeFocusedStackTopActivityLocked(); + } + private void removeHistoryRecordsForAppLocked(ArrayList<ActivityRecord> list, ProcessRecord app, String listName) { int i = list.size(); @@ -4374,14 +4386,14 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai + ": haveState=" + r.haveState + " stateNotNeeded=" + r.stateNotNeeded + " finishing=" + r.finishing - + " state=" + r.state + " callers=" + Debug.getCallers(5)); + + " state=" + r.getState() + " callers=" + Debug.getCallers(5)); if (!r.finishing) { Slog.w(TAG, "Force removing " + r + ": app died, no saved state"); EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY, r.userId, System.identityHashCode(r), r.getTask().taskId, r.shortComponentName, "proc died without state saved"); - if (r.state == ActivityState.RESUMED) { + if (r.getState() == RESUMED) { mService.updateUsageStats(r, false); } } @@ -4417,7 +4429,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai private void updateTransitLocked(int transit, ActivityOptions options) { if (options != null) { ActivityRecord r = topRunningActivityLocked(); - if (r != null && r.state != ActivityState.RESUMED) { + if (r != null && !r.isState(RESUMED)) { r.updateOptionsLocked(options); } else { ActivityOptions.abort(options); @@ -4617,7 +4629,7 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai (start.getTask() == task) ? activities.indexOf(start) : activities.size() - 1; for (; activityIndex >= 0; --activityIndex) { final ActivityRecord r = activities.get(activityIndex); - updatedConfig |= r.ensureActivityConfigurationLocked(0 /* globalChanges */, + updatedConfig |= r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindow); if (r.fullscreen) { behindFullscreen = true; diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 9a3b10299155..55771867302c 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1005,7 +1005,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D final ActivityStack stack = display.getChildAt(stackNdx); if (isFocusedStack(stack)) { final ActivityRecord r = stack.mResumedActivity; - if (r != null && r.state != RESUMED) { + if (r != null && !r.isState(RESUMED)) { return false; } } @@ -1069,10 +1069,10 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = display.getChildAt(stackNdx); final ActivityRecord r = stack.mPausingActivity; - if (r != null && r.state != PAUSED && r.state != STOPPED && r.state != STOPPING) { + if (r != null && !r.isState(PAUSED, STOPPED, STOPPING)) { if (DEBUG_STATES) { Slog.d(TAG_STATES, - "allPausedActivitiesComplete: r=" + r + " state=" + r.state); + "allPausedActivitiesComplete: r=" + r + " state=" + r.getState()); pausing = false; } else { return false; @@ -1522,7 +1522,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // current icicle and other state. if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r + " (starting in paused state)"); - r.state = PAUSED; + r.setState(PAUSED, "realStartActivityLocked"); } // Launch the new version setup screen if needed. We do this -after- @@ -2099,9 +2099,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } final ActivityRecord r = mFocusedStack.topRunningActivityLocked(); - if (r == null || r.state != RESUMED) { + if (r == null || !r.isState(RESUMED)) { mFocusedStack.resumeTopActivityUncheckedLocked(null, null); - } else if (r.state == RESUMED) { + } else if (r.isState(RESUMED)) { // Kick off any lingering app transitions form the MoveTaskToFront operation. mFocusedStack.executeAppTransition(targetOptions); } @@ -3540,14 +3540,14 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D // First, if we find an activity that is in the process of being destroyed, // then we just aren't going to do anything for now; we want things to settle // down before we try to prune more activities. - if (r.finishing || r.state == DESTROYING || r.state == DESTROYED) { + if (r.finishing || r.isState(DESTROYING, DESTROYED)) { if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r); return; } // Don't consider any activies that are currently not in a state where they // can be destroyed. - if (r.visible || !r.stopped || !r.haveState || r.state == RESUMED || r.state == PAUSING - || r.state == PAUSED || r.state == STOPPING) { + if (r.visible || !r.stopped || !r.haveState + || r.isState(RESUMED, PAUSING, PAUSED, STOPPING)) { if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r); continue; } @@ -3683,7 +3683,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D ? stack.shouldSleepOrShutDownActivities() : mService.isSleepingOrShuttingDownLocked(); if (!waitingVisible || shouldSleepOrShutDown) { - if (!processPausingActivities && s.state == PAUSING) { + if (!processPausingActivities && s.isState(PAUSING)) { // Defer processing pausing activities in this iteration and reschedule // a delayed idle to reprocess it again removeTimeoutsForActivityLocked(idleActivity); @@ -3710,7 +3710,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) { final ActivityStack stack = display.getChildAt(stackNdx); final ActivityRecord r = stack.topRunningActivityLocked(); - final ActivityState state = r == null ? DESTROYED : r.state; + final ActivityState state = r == null ? DESTROYED : r.getState(); if (isFocusedStack(stack)) { if (r == null) Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 8205265ba047..fcdf3d2918ed 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -1107,7 +1107,7 @@ class ActivityStarter { case START_TASK_TO_FRONT: { // ActivityRecord may represent a different activity, but it should not be // in the resumed state. - if (r.nowVisible && r.state == RESUMED) { + if (r.nowVisible && r.isState(RESUMED)) { outResult.timeout = false; outResult.who = r.realActivity; outResult.totalTime = 0; @@ -1516,7 +1516,7 @@ class ActivityStarter { final TaskRecord task = mSupervisor.anyTaskForIdLocked( mOptions.getLaunchTaskId()); final ActivityRecord top = task != null ? task.getTopActivity() : null; - if (top != null && top.state != RESUMED) { + if (top != null && !top.isState(RESUMED)) { // The caller specifies that we'd like to be avoided to be moved to the // front, so be it! diff --git a/services/core/java/com/android/server/am/CompatModePackages.java b/services/core/java/com/android/server/am/CompatModePackages.java index d84f4879b00f..c6947abf9a26 100644 --- a/services/core/java/com/android/server/am/CompatModePackages.java +++ b/services/core/java/com/android/server/am/CompatModePackages.java @@ -369,7 +369,7 @@ public final class CompatModePackages { } if (starting != null) { - starting.ensureActivityConfigurationLocked(0 /* globalChanges */, + starting.ensureActivityConfiguration(0 /* globalChanges */, false /* preserveWindow */); // And we need to make sure at this point that all other activities // are made visible with the correct configuration. diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags index cb2957daee65..9caef4a001ae 100644 --- a/services/core/java/com/android/server/am/EventLogTags.logtags +++ b/services/core/java/com/android/server/am/EventLogTags.logtags @@ -125,3 +125,12 @@ option java_package com.android.server.am 30055 am_uid_idle (UID|1|5) # Note when a service is being forcibly stopped because its app went idle. 30056 am_stop_idle_service (UID|1|5),(Component Name|3) + +# The activity's onCreate has been called. +30057 am_on_create_called (User|1|5),(Component Name|3),(Reason|3) +# The activity's onRestart has been called. +30058 am_on_restart_called (User|1|5),(Component Name|3),(Reason|3) +# The activity's onStart has been called. +30059 am_on_start_called (User|1|5),(Component Name|3),(Reason|3) +# The activity's onDestroy has been called. +30060 am_on_destroy_called (User|1|5),(Component Name|3),(Reason|3)
\ No newline at end of file diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java index 71fd71b87619..d7d18a99b66f 100644 --- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java @@ -42,6 +42,7 @@ class GlobalSettingsToPropertiesMapper { {Settings.Global.SYS_VDSO, "sys.vdso"}, {Settings.Global.FPS_DEVISOR, ThreadedRenderer.DEBUG_FPS_DIVISOR}, {Settings.Global.DISPLAY_PANEL_LPM, "sys.display_panel_lpm"}, + {Settings.Global.SYS_UIDCPUPOWER, "sys.uidcpupower"}, }; diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index e361a7028539..6b8b38073998 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -117,14 +117,11 @@ class KeyguardController { mSecondaryDisplayShowing = secondaryDisplayShowing; if (showingChanged) { dismissDockedStackIfNeeded(); + setKeyguardGoingAway(false); if (showing) { - setKeyguardGoingAway(false); mDismissalRequested = false; } } - if (!showing) { - mStackSupervisor.resumeFocusedStackTopActivityLocked(); - } mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); updateKeyguardSleepToken(); } @@ -149,6 +146,7 @@ class KeyguardController { updateKeyguardSleepToken(); // Some stack visibility might change (e.g. docked stack) + mStackSupervisor.resumeFocusedStackTopActivityLocked(); mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); mStackSupervisor.addStartingWindowsForVisibleActivities(true /* taskSwitch */); mWindowManager.executeAppTransition(); @@ -395,8 +393,4 @@ class KeyguardController { proto.write(KEYGUARD_OCCLUDED, mOccluded); proto.end(token); } - - public void notifyAppTransitionDone() { - setKeyguardGoingAway(false); - } } diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index e5762d294922..af99111e4bfa 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -38,7 +38,6 @@ import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; @@ -114,7 +113,7 @@ public class LockTaskController { STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_HOME, new Pair<>(StatusBarManager.DISABLE_HOME, StatusBarManager.DISABLE2_NONE)); - STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS, + STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW, new Pair<>(StatusBarManager.DISABLE_RECENT, StatusBarManager.DISABLE2_NONE)); STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS, @@ -308,7 +307,7 @@ public class LockTaskController { private boolean isRecentsAllowed(int userId) { return (getLockTaskFeaturesForUser(userId) - & DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS) != 0; + & DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW) != 0; } private boolean isKeyguardAllowed(int userId) { diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index d679439d3b7d..6f6e0d989f13 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -537,7 +537,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi if (updatedConfig) { final ActivityRecord r = topRunningActivityLocked(); if (r != null && !deferResume) { - kept = r.ensureActivityConfigurationLocked(0 /* globalChanges */, + kept = r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindow); mService.mStackSupervisor.ensureActivitiesVisibleLocked(r, 0, !PRESERVE_WINDOWS); @@ -1103,7 +1103,7 @@ class TaskRecord extends ConfigurationContainer implements TaskWindowContainerLi // Increment the total number of non-finishing activities reportOut.numActivities++; - if (reportOut.top == null || (reportOut.top.state == ActivityState.INITIALIZING)) { + if (reportOut.top == null || (reportOut.top.isState(ActivityState.INITIALIZING))) { reportOut.top = r; // Reset the number of running activities until we hit the first non-initializing // activity diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 0ce4dc5260bb..8afa54008baa 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -4221,6 +4221,11 @@ public class AudioService extends IAudioService.Stub } } + @Override + public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) + { + } + public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile) { return setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent( diff --git a/services/core/java/com/android/server/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java index 9e0a230b9250..296b9ac07b84 100644 --- a/services/core/java/com/android/server/MultipathPolicyTracker.java +++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java @@ -16,11 +16,17 @@ package com.android.server.connectivity; +import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER; +import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY; +import static android.net.ConnectivityManager.TYPE_MOBILE; +import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; + +import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH; + import android.app.usage.NetworkStatsManager; import android.app.usage.NetworkStatsManager.UsageCallback; import android.content.Context; -import android.net.INetworkStatsService; -import android.net.INetworkPolicyManager; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.Network; @@ -31,29 +37,17 @@ import android.net.NetworkStats; import android.net.NetworkTemplate; import android.net.StringNetworkSpecifier; import android.os.Handler; -import android.os.RemoteException; -import android.os.ServiceManager; import android.telephony.TelephonyManager; import android.util.DebugUtils; import android.util.Slog; -import java.util.Calendar; -import java.util.concurrent.ConcurrentHashMap; - -import com.android.internal.R; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.net.NetworkPolicyManagerInternal; +import com.android.server.net.NetworkStatsManagerInternal; -import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER; -import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY; -import static android.net.ConnectivityManager.TYPE_MOBILE; -import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; -import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI; -import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE; -import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH; +import java.util.Calendar; +import java.util.concurrent.ConcurrentHashMap; /** * Manages multipath data budgets. @@ -76,10 +70,8 @@ public class MultipathPolicyTracker { private final Handler mHandler; private ConnectivityManager mCM; - private NetworkStatsManager mStatsManager; private NetworkPolicyManager mNPM; - private TelephonyManager mTelephonyManager; - private INetworkStatsService mStatsService; + private NetworkStatsManager mStatsManager; private NetworkCallback mMobileNetworkCallback; private NetworkPolicyManager.Listener mPolicyListener; @@ -87,8 +79,6 @@ public class MultipathPolicyTracker { // STOPSHIP: replace this with a configurable mechanism. private static final long DEFAULT_DAILY_MULTIPATH_QUOTA = 2_500_000; - private volatile int mMeteredMultipathPreference; - public MultipathPolicyTracker(Context ctx, Handler handler) { mContext = ctx; mHandler = handler; @@ -97,12 +87,9 @@ public class MultipathPolicyTracker { } public void start() { - mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); - mNPM = (NetworkPolicyManager) mContext.getSystemService(Context.NETWORK_POLICY_SERVICE); - mStatsManager = (NetworkStatsManager) mContext.getSystemService( - Context.NETWORK_STATS_SERVICE); - mStatsService = INetworkStatsService.Stub.asInterface( - ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + mCM = mContext.getSystemService(ConnectivityManager.class); + mNPM = mContext.getSystemService(NetworkPolicyManager.class); + mStatsManager = mContext.getSystemService(NetworkStatsManager.class); registerTrackMobileCallback(); registerNetworkPolicyListener(); @@ -119,6 +106,9 @@ public class MultipathPolicyTracker { // Called on an arbitrary binder thread. public Integer getMultipathPreference(Network network) { + if (network == null) { + return null; + } MultipathTracker t = mMultipathTrackers.get(network); if (t != null) { return t.getMultipathPreference(); @@ -149,8 +139,7 @@ public class MultipathPolicyTracker { network, nc, e.getMessage())); } - TelephonyManager tele = (TelephonyManager) mContext.getSystemService( - Context.TELEPHONY_SERVICE); + TelephonyManager tele = mContext.getSystemService(TelephonyManager.class); if (tele == null) { throw new IllegalStateException(String.format("Missing TelephonyManager")); } @@ -162,7 +151,7 @@ public class MultipathPolicyTracker { subscriberId = tele.getSubscriberId(); mNetworkTemplate = new NetworkTemplate( - NetworkTemplate.MATCH_MOBILE_ALL, subscriberId, new String[] { subscriberId }, + NetworkTemplate.MATCH_MOBILE, subscriberId, new String[] { subscriberId }, null, NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL, NetworkStats.DEFAULT_NETWORK_NO); mUsageCallback = new UsageCallback() { @@ -185,26 +174,21 @@ public class MultipathPolicyTracker { start.set(Calendar.SECOND, 0); start.set(Calendar.MILLISECOND, 0); - long bytes; try { - // TODO: Consider using NetworkStatsManager.getSummaryForDevice instead. - bytes = mStatsService.getNetworkTotalBytes(mNetworkTemplate, - start.getTimeInMillis(), end.getTimeInMillis()); - if (DBG) Slog.w(TAG, "Non-default data usage: " + bytes); - } catch (RemoteException e) { - Slog.w(TAG, "Can't fetch daily data usage: " + e); - bytes = -1; - } catch (IllegalStateException e) { - // Bandwidth control disabled? - bytes = -1; + final long bytes = LocalServices.getService(NetworkStatsManagerInternal.class) + .getNetworkTotalBytes(mNetworkTemplate, start.getTimeInMillis(), + end.getTimeInMillis()); + if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes); + return bytes; + } catch (RuntimeException e) { + Slog.w(TAG, "Failed to get data usage: " + e); + return -1; } - return bytes; } void updateMultipathBudget() { - NetworkPolicyManagerInternal npms = LocalServices.getService( - NetworkPolicyManagerInternal.class); - long quota = npms.getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH); + long quota = LocalServices.getService(NetworkPolicyManagerInternal.class) + .getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH); if (DBG) Slog.d(TAG, "Opportunistic quota from data plan: " + quota + " bytes"); if (quota == 0) { @@ -223,8 +207,10 @@ public class MultipathPolicyTracker { } mQuota = quota; - long usage = getDailyNonDefaultDataUsage(); - long budget = Math.max(0, quota - usage); + // If we can't get current usage, assume the worst and don't give + // ourselves any budget to work with. + final long usage = getDailyNonDefaultDataUsage(); + final long budget = (usage == -1) ? 0 : Math.max(0, quota - usage); if (budget > 0) { if (DBG) Slog.d(TAG, "Setting callback for " + budget + " bytes on network " + network); diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index 9a9cdbde3987..eee830f3299b 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -19,6 +19,7 @@ package com.android.server.connectivity; import static android.hardware.usb.UsbManager.USB_CONFIGURED; import static android.hardware.usb.UsbManager.USB_CONNECTED; import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS; +import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME; import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE; import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE; @@ -103,6 +104,7 @@ import com.android.server.net.BaseNetworkObserver; import java.io.FileDescriptor; import java.io.PrintWriter; import java.net.Inet4Address; +import java.net.Inet6Address; import java.net.InetAddress; import java.util.ArrayList; import java.util.Arrays; @@ -1359,19 +1361,16 @@ public class Tethering extends BaseNetworkObserver { protected void setUpstreamNetwork(NetworkState ns) { String iface = null; - if (ns != null && ns.linkProperties != null) { + if (ns != null) { // Find the interface with the default IPv4 route. It may be the // interface described by linkProperties, or one of the interfaces // stacked on top of it. - mLog.i("Finding IPv4 upstream interface on: " + ns.linkProperties); - RouteInfo ipv4Default = RouteInfo.selectBestRoute( - ns.linkProperties.getAllRoutes(), Inet4Address.ANY); - if (ipv4Default != null) { - iface = ipv4Default.getInterface(); - mLog.i("Found interface " + ipv4Default.getInterface()); - } else { - mLog.i("No IPv4 upstream interface, giving up."); - } + mLog.i("Looking for default routes on: " + ns.linkProperties); + final String iface4 = getIPv4DefaultRouteInterface(ns); + final String iface6 = getIPv6DefaultRouteInterface(ns); + mLog.i("IPv4/IPv6 upstream interface(s): " + iface4 + "/" + iface6); + + iface = (iface4 != null) ? iface4 : null /* TODO: iface6 */; } if (iface != null) { @@ -2014,6 +2013,31 @@ public class Tethering extends BaseNetworkObserver { mTetherStates.remove(iface); } + private static String getIPv4DefaultRouteInterface(NetworkState ns) { + if (ns == null) return null; + return getInterfaceForDestination(ns.linkProperties, Inet4Address.ANY); + } + + private static String getIPv6DefaultRouteInterface(NetworkState ns) { + if (ns == null) return null; + // An upstream network's IPv6 capability is currently only useful if it + // can be 64share'd downstream (RFC 7278). For now, that means mobile + // upstream networks only. + if (ns.networkCapabilities == null || + !ns.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) { + return null; + } + + return getInterfaceForDestination(ns.linkProperties, Inet6Address.ANY); + } + + private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) { + final RouteInfo ri = (lp != null) + ? RouteInfo.selectBestRoute(lp.getAllRoutes(), dst) + : null; + return (ri != null) ? ri.getInterface() : null; + } + private static String[] copy(String[] strarray) { return Arrays.copyOf(strarray, strarray.length); } diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index 692535c6cebc..3da35517faf0 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -421,7 +421,7 @@ public class FingerprintService extends SystemService implements IHwBinder.Death byteToken[i] = token.get(i); } // Send to Keystore - KeyStore.getInstance().addAuthToken(byteToken, mCurrentUserId); + KeyStore.getInstance().addAuthToken(byteToken); } if (client != null && client.onAuthenticated(fingerId, groupId)) { removeClient(client); diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 52f591741c83..0e7e5401caaf 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -43,8 +43,8 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; -import android.content.pm.PackageManagerInternal; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.pm.PackageManagerInternal; import android.content.pm.ServiceInfo; import android.database.ContentObserver; import android.net.Uri; @@ -65,6 +65,7 @@ import android.os.UserManagerInternal; import android.provider.Settings; import android.text.format.DateUtils; import android.util.KeyValueListParser; +import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; @@ -78,14 +79,15 @@ import com.android.internal.app.procstats.ProcessStats; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; +import com.android.server.AppStateTracker; import com.android.server.DeviceIdleController; import com.android.server.FgThread; -import com.android.server.AppStateTracker; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerServiceDumpProto.ActiveJob; import com.android.server.job.JobSchedulerServiceDumpProto.PendingJob; -import com.android.server.job.JobStore.JobStatusFunctor; +import com.android.server.job.JobSchedulerServiceDumpProto.RegisteredJob; import com.android.server.job.controllers.AppIdleController; import com.android.server.job.controllers.BackgroundJobsController; import com.android.server.job.controllers.BatteryController; @@ -109,6 +111,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; +import java.util.function.Consumer; import java.util.function.Predicate; /** @@ -125,8 +128,8 @@ import java.util.function.Predicate; */ public final class JobSchedulerService extends com.android.server.SystemService implements StateChangedListener, JobCompletedListener { - static final String TAG = "JobSchedulerService"; - public static final boolean DEBUG = false; + public static final String TAG = "JobScheduler"; + public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final boolean DEBUG_STANDBY = DEBUG || false; /** The maximum number of concurrent jobs we run at one time. */ @@ -156,21 +159,26 @@ public final class JobSchedulerService extends com.android.server.SystemService static final int MSG_CHECK_JOB = 1; static final int MSG_STOP_JOB = 2; static final int MSG_CHECK_JOB_GREEDY = 3; + static final int MSG_UID_STATE_CHANGED = 4; + static final int MSG_UID_GONE = 5; + static final int MSG_UID_ACTIVE = 6; + static final int MSG_UID_IDLE = 7; /** * Track Services that have currently active or pending jobs. The index is provided by * {@link JobStatus#getServiceToken()} */ final List<JobServiceContext> mActiveServices = new ArrayList<>(); + /** List of controllers that will notify this service of updates to jobs. */ - List<StateController> mControllers; + private final List<StateController> mControllers; /** Need direct access to this for testing. */ - BatteryController mBatteryController; + private final BatteryController mBatteryController; /** Need direct access to this for testing. */ - StorageController mStorageController; + private final StorageController mStorageController; /** Need directly for sending uid state changes */ - private BackgroundJobsController mBackgroundJobsController; - private DeviceIdleJobsController mDeviceIdleJobsController; + private final DeviceIdleJobsController mDeviceIdleJobsController; + /** * Queue of pending jobs. The JobServiceContext class will receive jobs from this list * when ready to execute them. @@ -252,12 +260,48 @@ public final class JobSchedulerService extends com.android.server.SystemService */ int[] mTmpAssignPreferredUidForContext = new int[MAX_JOB_CONTEXTS_COUNT]; + private class ConstantsObserver extends ContentObserver { + private ContentResolver mResolver; + + public ConstantsObserver(Handler handler) { + super(handler); + } + + public void start(ContentResolver resolver) { + mResolver = resolver; + mResolver.registerContentObserver(Settings.Global.getUriFor( + Settings.Global.JOB_SCHEDULER_CONSTANTS), false, this); + updateConstants(); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + updateConstants(); + } + + private void updateConstants() { + synchronized (mLock) { + try { + mConstants.updateConstantsLocked(Settings.Global.getString(mResolver, + Settings.Global.JOB_SCHEDULER_CONSTANTS)); + } catch (IllegalArgumentException e) { + // Failed to parse the settings string, log this and move on + // with defaults. + Slog.e(TAG, "Bad jobscheduler settings", e); + } + } + + // Reset the heartbeat alarm based on the new heartbeat duration + setNextHeartbeatAlarm(); + } + } + /** * All times are in milliseconds. These constants are kept synchronized with the system * global Settings. Any access to this class or its fields should be done while * holding the JobSchedulerService.mLock lock. */ - private final class Constants extends ContentObserver { + public static class Constants { // Key names stored in the settings value. private static final String KEY_MIN_IDLE_COUNT = "min_idle_count"; private static final String KEY_MIN_CHARGING_COUNT = "min_charging_count"; @@ -282,6 +326,8 @@ public final class JobSchedulerService extends com.android.server.SystemService private static final String KEY_STANDBY_WORKING_BEATS = "standby_working_beats"; private static final String KEY_STANDBY_FREQUENT_BEATS = "standby_frequent_beats"; private static final String KEY_STANDBY_RARE_BEATS = "standby_rare_beats"; + private static final String KEY_CONN_CONGESTION_DELAY_FRAC = "conn_congestion_delay_frac"; + private static final String KEY_CONN_PREFETCH_RELAX_FRAC = "conn_prefetch_relax_frac"; private static final int DEFAULT_MIN_IDLE_COUNT = 1; private static final int DEFAULT_MIN_CHARGING_COUNT = 1; @@ -305,6 +351,8 @@ public final class JobSchedulerService extends com.android.server.SystemService private static final int DEFAULT_STANDBY_WORKING_BEATS = 11; // ~ 2 hours, with 11min beats private static final int DEFAULT_STANDBY_FREQUENT_BEATS = 43; // ~ 8 hours private static final int DEFAULT_STANDBY_RARE_BEATS = 130; // ~ 24 hours + private static final float DEFAULT_CONN_CONGESTION_DELAY_FRAC = 0.5f; + private static final float DEFAULT_CONN_PREFETCH_RELAX_FRAC = 0.5f; /** * Minimum # of idle jobs that must be ready in order to force the JMS to schedule things @@ -399,7 +447,6 @@ public final class JobSchedulerService extends com.android.server.SystemService * hour or day, so that the heartbeat drifts relative to wall-clock milestones. */ long STANDBY_HEARTBEAT_TIME = DEFAULT_STANDBY_HEARTBEAT_TIME; - /** * Mapping: standby bucket -> number of heartbeats between each sweep of that * bucket's jobs. @@ -414,171 +461,126 @@ public final class JobSchedulerService extends com.android.server.SystemService DEFAULT_STANDBY_FREQUENT_BEATS, DEFAULT_STANDBY_RARE_BEATS }; + /** + * The fraction of a job's running window that must pass before we + * consider running it when the network is congested. + */ + public float CONN_CONGESTION_DELAY_FRAC = DEFAULT_CONN_CONGESTION_DELAY_FRAC; + /** + * The fraction of a prefetch job's running window that must pass before + * we consider matching it against a metered network. + */ + public float CONN_PREFETCH_RELAX_FRAC = DEFAULT_CONN_PREFETCH_RELAX_FRAC; - private ContentResolver mResolver; private final KeyValueListParser mParser = new KeyValueListParser(','); - public Constants(Handler handler) { - super(handler); - } - - public void start(ContentResolver resolver) { - mResolver = resolver; - mResolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.JOB_SCHEDULER_CONSTANTS), false, this); - updateConstants(); - } - - @Override - public void onChange(boolean selfChange, Uri uri) { - updateConstants(); - } - - private void updateConstants() { - synchronized (mLock) { - try { - mParser.setString(Settings.Global.getString(mResolver, - Settings.Global.JOB_SCHEDULER_CONSTANTS)); - } catch (IllegalArgumentException e) { - // Failed to parse the settings string, log this and move on - // with defaults. - Slog.e(TAG, "Bad jobscheduler settings", e); - } - - MIN_IDLE_COUNT = mParser.getInt(KEY_MIN_IDLE_COUNT, - DEFAULT_MIN_IDLE_COUNT); - MIN_CHARGING_COUNT = mParser.getInt(KEY_MIN_CHARGING_COUNT, - DEFAULT_MIN_CHARGING_COUNT); - MIN_BATTERY_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_BATTERY_NOT_LOW_COUNT, - DEFAULT_MIN_BATTERY_NOT_LOW_COUNT); - MIN_STORAGE_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_STORAGE_NOT_LOW_COUNT, - DEFAULT_MIN_STORAGE_NOT_LOW_COUNT); - MIN_CONNECTIVITY_COUNT = mParser.getInt(KEY_MIN_CONNECTIVITY_COUNT, - DEFAULT_MIN_CONNECTIVITY_COUNT); - MIN_CONTENT_COUNT = mParser.getInt(KEY_MIN_CONTENT_COUNT, - DEFAULT_MIN_CONTENT_COUNT); - MIN_READY_JOBS_COUNT = mParser.getInt(KEY_MIN_READY_JOBS_COUNT, - DEFAULT_MIN_READY_JOBS_COUNT); - HEAVY_USE_FACTOR = mParser.getFloat(KEY_HEAVY_USE_FACTOR, - DEFAULT_HEAVY_USE_FACTOR); - MODERATE_USE_FACTOR = mParser.getFloat(KEY_MODERATE_USE_FACTOR, - DEFAULT_MODERATE_USE_FACTOR); - FG_JOB_COUNT = mParser.getInt(KEY_FG_JOB_COUNT, - DEFAULT_FG_JOB_COUNT); - BG_NORMAL_JOB_COUNT = mParser.getInt(KEY_BG_NORMAL_JOB_COUNT, - DEFAULT_BG_NORMAL_JOB_COUNT); - if ((FG_JOB_COUNT+BG_NORMAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { - BG_NORMAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; - } - BG_MODERATE_JOB_COUNT = mParser.getInt(KEY_BG_MODERATE_JOB_COUNT, - DEFAULT_BG_MODERATE_JOB_COUNT); - if ((FG_JOB_COUNT+BG_MODERATE_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { - BG_MODERATE_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; - } - BG_LOW_JOB_COUNT = mParser.getInt(KEY_BG_LOW_JOB_COUNT, - DEFAULT_BG_LOW_JOB_COUNT); - if ((FG_JOB_COUNT+BG_LOW_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { - BG_LOW_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; - } - BG_CRITICAL_JOB_COUNT = mParser.getInt(KEY_BG_CRITICAL_JOB_COUNT, - DEFAULT_BG_CRITICAL_JOB_COUNT); - if ((FG_JOB_COUNT+BG_CRITICAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { - BG_CRITICAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; - } - MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT, - DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT); - MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT, - DEFAULT_MAX_WORK_RESCHEDULE_COUNT); - MIN_LINEAR_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_LINEAR_BACKOFF_TIME, - DEFAULT_MIN_LINEAR_BACKOFF_TIME); - MIN_EXP_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_EXP_BACKOFF_TIME, - DEFAULT_MIN_EXP_BACKOFF_TIME); - STANDBY_HEARTBEAT_TIME = mParser.getDurationMillis(KEY_STANDBY_HEARTBEAT_TIME, - DEFAULT_STANDBY_HEARTBEAT_TIME); - STANDBY_BEATS[1] = mParser.getInt(KEY_STANDBY_WORKING_BEATS, - DEFAULT_STANDBY_WORKING_BEATS); - STANDBY_BEATS[2] = mParser.getInt(KEY_STANDBY_FREQUENT_BEATS, - DEFAULT_STANDBY_FREQUENT_BEATS); - STANDBY_BEATS[3] = mParser.getInt(KEY_STANDBY_RARE_BEATS, - DEFAULT_STANDBY_RARE_BEATS); - } - - // Reset the heartbeat alarm based on the new heartbeat duration - setNextHeartbeatAlarm(); - } - - void dump(PrintWriter pw) { - pw.println(" Settings:"); - - pw.print(" "); pw.print(KEY_MIN_IDLE_COUNT); pw.print("="); - pw.print(MIN_IDLE_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_CHARGING_COUNT); pw.print("="); - pw.print(MIN_CHARGING_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_BATTERY_NOT_LOW_COUNT); pw.print("="); - pw.print(MIN_BATTERY_NOT_LOW_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_STORAGE_NOT_LOW_COUNT); pw.print("="); - pw.print(MIN_STORAGE_NOT_LOW_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_CONNECTIVITY_COUNT); pw.print("="); - pw.print(MIN_CONNECTIVITY_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_CONTENT_COUNT); pw.print("="); - pw.print(MIN_CONTENT_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_READY_JOBS_COUNT); pw.print("="); - pw.print(MIN_READY_JOBS_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_HEAVY_USE_FACTOR); pw.print("="); - pw.print(HEAVY_USE_FACTOR); pw.println(); - - pw.print(" "); pw.print(KEY_MODERATE_USE_FACTOR); pw.print("="); - pw.print(MODERATE_USE_FACTOR); pw.println(); - - pw.print(" "); pw.print(KEY_FG_JOB_COUNT); pw.print("="); - pw.print(FG_JOB_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_BG_NORMAL_JOB_COUNT); pw.print("="); - pw.print(BG_NORMAL_JOB_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_BG_MODERATE_JOB_COUNT); pw.print("="); - pw.print(BG_MODERATE_JOB_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_BG_LOW_JOB_COUNT); pw.print("="); - pw.print(BG_LOW_JOB_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_BG_CRITICAL_JOB_COUNT); pw.print("="); - pw.print(BG_CRITICAL_JOB_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MAX_STANDARD_RESCHEDULE_COUNT); pw.print("="); - pw.print(MAX_STANDARD_RESCHEDULE_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MAX_WORK_RESCHEDULE_COUNT); pw.print("="); - pw.print(MAX_WORK_RESCHEDULE_COUNT); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_LINEAR_BACKOFF_TIME); pw.print("="); - pw.print(MIN_LINEAR_BACKOFF_TIME); pw.println(); - - pw.print(" "); pw.print(KEY_MIN_EXP_BACKOFF_TIME); pw.print("="); - pw.print(MIN_EXP_BACKOFF_TIME); pw.println(); - - pw.print(" "); pw.print(KEY_STANDBY_HEARTBEAT_TIME); pw.print("="); - pw.print(STANDBY_HEARTBEAT_TIME); pw.println(); - - pw.print(" standby_beats={"); + void updateConstantsLocked(String value) { + try { + mParser.setString(value); + } catch (Exception e) { + // Failed to parse the settings string, log this and move on + // with defaults. + Slog.e(TAG, "Bad jobscheduler settings", e); + } + + MIN_IDLE_COUNT = mParser.getInt(KEY_MIN_IDLE_COUNT, + DEFAULT_MIN_IDLE_COUNT); + MIN_CHARGING_COUNT = mParser.getInt(KEY_MIN_CHARGING_COUNT, + DEFAULT_MIN_CHARGING_COUNT); + MIN_BATTERY_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_BATTERY_NOT_LOW_COUNT, + DEFAULT_MIN_BATTERY_NOT_LOW_COUNT); + MIN_STORAGE_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_STORAGE_NOT_LOW_COUNT, + DEFAULT_MIN_STORAGE_NOT_LOW_COUNT); + MIN_CONNECTIVITY_COUNT = mParser.getInt(KEY_MIN_CONNECTIVITY_COUNT, + DEFAULT_MIN_CONNECTIVITY_COUNT); + MIN_CONTENT_COUNT = mParser.getInt(KEY_MIN_CONTENT_COUNT, + DEFAULT_MIN_CONTENT_COUNT); + MIN_READY_JOBS_COUNT = mParser.getInt(KEY_MIN_READY_JOBS_COUNT, + DEFAULT_MIN_READY_JOBS_COUNT); + HEAVY_USE_FACTOR = mParser.getFloat(KEY_HEAVY_USE_FACTOR, + DEFAULT_HEAVY_USE_FACTOR); + MODERATE_USE_FACTOR = mParser.getFloat(KEY_MODERATE_USE_FACTOR, + DEFAULT_MODERATE_USE_FACTOR); + FG_JOB_COUNT = mParser.getInt(KEY_FG_JOB_COUNT, + DEFAULT_FG_JOB_COUNT); + BG_NORMAL_JOB_COUNT = mParser.getInt(KEY_BG_NORMAL_JOB_COUNT, + DEFAULT_BG_NORMAL_JOB_COUNT); + if ((FG_JOB_COUNT+BG_NORMAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { + BG_NORMAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; + } + BG_MODERATE_JOB_COUNT = mParser.getInt(KEY_BG_MODERATE_JOB_COUNT, + DEFAULT_BG_MODERATE_JOB_COUNT); + if ((FG_JOB_COUNT+BG_MODERATE_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { + BG_MODERATE_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; + } + BG_LOW_JOB_COUNT = mParser.getInt(KEY_BG_LOW_JOB_COUNT, + DEFAULT_BG_LOW_JOB_COUNT); + if ((FG_JOB_COUNT+BG_LOW_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { + BG_LOW_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; + } + BG_CRITICAL_JOB_COUNT = mParser.getInt(KEY_BG_CRITICAL_JOB_COUNT, + DEFAULT_BG_CRITICAL_JOB_COUNT); + if ((FG_JOB_COUNT+BG_CRITICAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) { + BG_CRITICAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT; + } + MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT, + DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT); + MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT, + DEFAULT_MAX_WORK_RESCHEDULE_COUNT); + MIN_LINEAR_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_LINEAR_BACKOFF_TIME, + DEFAULT_MIN_LINEAR_BACKOFF_TIME); + MIN_EXP_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_EXP_BACKOFF_TIME, + DEFAULT_MIN_EXP_BACKOFF_TIME); + STANDBY_HEARTBEAT_TIME = mParser.getDurationMillis(KEY_STANDBY_HEARTBEAT_TIME, + DEFAULT_STANDBY_HEARTBEAT_TIME); + STANDBY_BEATS[1] = mParser.getInt(KEY_STANDBY_WORKING_BEATS, + DEFAULT_STANDBY_WORKING_BEATS); + STANDBY_BEATS[2] = mParser.getInt(KEY_STANDBY_FREQUENT_BEATS, + DEFAULT_STANDBY_FREQUENT_BEATS); + STANDBY_BEATS[3] = mParser.getInt(KEY_STANDBY_RARE_BEATS, + DEFAULT_STANDBY_RARE_BEATS); + CONN_CONGESTION_DELAY_FRAC = mParser.getFloat(KEY_CONN_CONGESTION_DELAY_FRAC, + DEFAULT_CONN_CONGESTION_DELAY_FRAC); + CONN_PREFETCH_RELAX_FRAC = mParser.getFloat(KEY_CONN_PREFETCH_RELAX_FRAC, + DEFAULT_CONN_PREFETCH_RELAX_FRAC); + } + + void dump(IndentingPrintWriter pw) { + pw.println("Settings:"); + pw.increaseIndent(); + pw.printPair(KEY_MIN_IDLE_COUNT, MIN_IDLE_COUNT).println(); + pw.printPair(KEY_MIN_CHARGING_COUNT, MIN_CHARGING_COUNT).println(); + pw.printPair(KEY_MIN_BATTERY_NOT_LOW_COUNT, MIN_BATTERY_NOT_LOW_COUNT).println(); + pw.printPair(KEY_MIN_STORAGE_NOT_LOW_COUNT, MIN_STORAGE_NOT_LOW_COUNT).println(); + pw.printPair(KEY_MIN_CONNECTIVITY_COUNT, MIN_CONNECTIVITY_COUNT).println(); + pw.printPair(KEY_MIN_CONTENT_COUNT, MIN_CONTENT_COUNT).println(); + pw.printPair(KEY_MIN_READY_JOBS_COUNT, MIN_READY_JOBS_COUNT).println(); + pw.printPair(KEY_HEAVY_USE_FACTOR, HEAVY_USE_FACTOR).println(); + pw.printPair(KEY_MODERATE_USE_FACTOR, MODERATE_USE_FACTOR).println(); + pw.printPair(KEY_FG_JOB_COUNT, FG_JOB_COUNT).println(); + pw.printPair(KEY_BG_NORMAL_JOB_COUNT, BG_NORMAL_JOB_COUNT).println(); + pw.printPair(KEY_BG_MODERATE_JOB_COUNT, BG_MODERATE_JOB_COUNT).println(); + pw.printPair(KEY_BG_LOW_JOB_COUNT, BG_LOW_JOB_COUNT).println(); + pw.printPair(KEY_BG_CRITICAL_JOB_COUNT, BG_CRITICAL_JOB_COUNT).println(); + pw.printPair(KEY_MAX_STANDARD_RESCHEDULE_COUNT, MAX_STANDARD_RESCHEDULE_COUNT).println(); + pw.printPair(KEY_MAX_WORK_RESCHEDULE_COUNT, MAX_WORK_RESCHEDULE_COUNT).println(); + pw.printPair(KEY_MIN_LINEAR_BACKOFF_TIME, MIN_LINEAR_BACKOFF_TIME).println(); + pw.printPair(KEY_MIN_EXP_BACKOFF_TIME, MIN_EXP_BACKOFF_TIME).println(); + pw.printPair(KEY_STANDBY_HEARTBEAT_TIME, STANDBY_HEARTBEAT_TIME).println(); + pw.print("standby_beats={"); pw.print(STANDBY_BEATS[0]); for (int i = 1; i < STANDBY_BEATS.length; i++) { pw.print(", "); pw.print(STANDBY_BEATS[i]); } pw.println('}'); + pw.printPair(KEY_CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC).println(); + pw.printPair(KEY_CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC).println(); + pw.decreaseIndent(); } void dump(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); - proto.write(ConstantsProto.MIN_IDLE_COUNT, MIN_IDLE_COUNT); proto.write(ConstantsProto.MIN_CHARGING_COUNT, MIN_CHARGING_COUNT); proto.write(ConstantsProto.MIN_BATTERY_NOT_LOW_COUNT, MIN_BATTERY_NOT_LOW_COUNT); @@ -598,16 +600,17 @@ public final class JobSchedulerService extends com.android.server.SystemService proto.write(ConstantsProto.MIN_LINEAR_BACKOFF_TIME_MS, MIN_LINEAR_BACKOFF_TIME); proto.write(ConstantsProto.MIN_EXP_BACKOFF_TIME_MS, MIN_EXP_BACKOFF_TIME); proto.write(ConstantsProto.STANDBY_HEARTBEAT_TIME_MS, STANDBY_HEARTBEAT_TIME); - for (int period : STANDBY_BEATS) { proto.write(ConstantsProto.STANDBY_BEATS, period); } - + proto.write(ConstantsProto.CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC); + proto.write(ConstantsProto.CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC); proto.end(token); } } final Constants mConstants; + final ConstantsObserver mConstantsObserver; static final Comparator<JobStatus> mEnqueueTimeComparator = (o1, o2) -> { if (o1.enqueueTime < o2.enqueueTime) { @@ -737,32 +740,19 @@ public final class JobSchedulerService extends com.android.server.SystemService final private IUidObserver mUidObserver = new IUidObserver.Stub() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { - updateUidState(uid, procState); + mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget(); } @Override public void onUidGone(int uid, boolean disabled) { - updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); - if (disabled) { - cancelJobsForUid(uid, "uid gone"); - } - synchronized (mLock) { - mDeviceIdleJobsController.setUidActiveLocked(uid, false); - } + mHandler.obtainMessage(MSG_UID_GONE, uid, disabled ? 1 : 0).sendToTarget(); } @Override public void onUidActive(int uid) throws RemoteException { - synchronized (mLock) { - mDeviceIdleJobsController.setUidActiveLocked(uid, true); - } + mHandler.obtainMessage(MSG_UID_ACTIVE, uid, 0).sendToTarget(); } @Override public void onUidIdle(int uid, boolean disabled) { - if (disabled) { - cancelJobsForUid(uid, "app uid idle"); - } - synchronized (mLock) { - mDeviceIdleJobsController.setUidActiveLocked(uid, false); - } + mHandler.obtainMessage(MSG_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget(); } @Override public void onUidCachedChanged(int uid, boolean cached) { @@ -777,6 +767,10 @@ public final class JobSchedulerService extends com.android.server.SystemService return mJobs; } + public Constants getConstants() { + return mConstants; + } + @Override public void onStartUser(int userHandle) { mStartedUsers = ArrayUtils.appendInt(mStartedUsers, userHandle); @@ -1096,7 +1090,8 @@ public final class JobSchedulerService extends com.android.server.SystemService LocalServices.getService(ActivityManagerInternal.class)); mHandler = new JobHandler(context.getMainLooper()); - mConstants = new Constants(mHandler); + mConstants = new Constants(); + mConstantsObserver = new ConstantsObserver(mHandler); mJobSchedulerStub = new JobSchedulerStub(); // Set up the app standby bucketing tracker @@ -1112,17 +1107,17 @@ public final class JobSchedulerService extends com.android.server.SystemService // Create the controllers. mControllers = new ArrayList<StateController>(); - mControllers.add(ConnectivityController.get(this)); - mControllers.add(TimeController.get(this)); - mControllers.add(IdleController.get(this)); - mBatteryController = BatteryController.get(this); + mControllers.add(new ConnectivityController(this)); + mControllers.add(new TimeController(this)); + mControllers.add(new IdleController(this)); + mBatteryController = new BatteryController(this); mControllers.add(mBatteryController); - mStorageController = StorageController.get(this); + mStorageController = new StorageController(this); mControllers.add(mStorageController); - mControllers.add(BackgroundJobsController.get(this)); - mControllers.add(AppIdleController.get(this)); - mControllers.add(ContentObserverController.get(this)); - mDeviceIdleJobsController = DeviceIdleJobsController.get(this); + mControllers.add(new BackgroundJobsController(this)); + mControllers.add(new AppIdleController(this)); + mControllers.add(new ContentObserverController(this)); + mDeviceIdleJobsController = new DeviceIdleJobsController(this); mControllers.add(mDeviceIdleJobsController); // If the job store determined that it can't yet reschedule persisted jobs, @@ -1183,7 +1178,7 @@ public final class JobSchedulerService extends com.android.server.SystemService @Override public void onBootPhase(int phase) { if (PHASE_SYSTEM_SERVICES_READY == phase) { - mConstants.start(getContext().getContentResolver()); + mConstantsObserver.start(getContext().getContentResolver()); mAppStateTracker = Preconditions.checkNotNull( LocalServices.getService(AppStateTracker.class)); @@ -1226,13 +1221,10 @@ public final class JobSchedulerService extends com.android.server.SystemService getContext().getMainLooper())); } // Attach jobs to their controllers. - mJobs.forEachJob(new JobStatusFunctor() { - @Override - public void process(JobStatus job) { - for (int controller = 0; controller < mControllers.size(); controller++) { - final StateController sc = mControllers.get(controller); - sc.maybeStartTrackingJobLocked(job, null); - } + mJobs.forEachJob((job) -> { + for (int controller = 0; controller < mControllers.size(); controller++) { + final StateController sc = mControllers.get(controller); + sc.maybeStartTrackingJobLocked(job, null); } }); // GO GO GO! @@ -1557,6 +1549,44 @@ public final class JobSchedulerService extends com.android.server.SystemService cancelJobImplLocked((JobStatus) message.obj, null, "app no longer allowed to run"); break; + + case MSG_UID_STATE_CHANGED: { + final int uid = message.arg1; + final int procState = message.arg2; + updateUidState(uid, procState); + break; + } + case MSG_UID_GONE: { + final int uid = message.arg1; + final boolean disabled = message.arg2 != 0; + updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY); + if (disabled) { + cancelJobsForUid(uid, "uid gone"); + } + synchronized (mLock) { + mDeviceIdleJobsController.setUidActiveLocked(uid, false); + } + break; + } + case MSG_UID_ACTIVE: { + final int uid = message.arg1; + synchronized (mLock) { + mDeviceIdleJobsController.setUidActiveLocked(uid, true); + } + break; + } + case MSG_UID_IDLE: { + final int uid = message.arg1; + final boolean disabled = message.arg2 != 0; + if (disabled) { + cancelJobsForUid(uid, "app uid idle"); + } + synchronized (mLock) { + mDeviceIdleJobsController.setUidActiveLocked(uid, false); + } + break; + } + } maybeRunPendingJobsLocked(); // Don't remove JOB_EXPIRED in case one came along while processing the queue. @@ -1601,11 +1631,11 @@ public final class JobSchedulerService extends com.android.server.SystemService } } - final class ReadyJobQueueFunctor implements JobStatusFunctor { + final class ReadyJobQueueFunctor implements Consumer<JobStatus> { ArrayList<JobStatus> newReadyJobs; @Override - public void process(JobStatus job) { + public void accept(JobStatus job) { if (isReadyToBeExecutedLocked(job)) { if (DEBUG) { Slog.d(TAG, " queued " + job.toShortString()); @@ -1639,7 +1669,7 @@ public final class JobSchedulerService extends com.android.server.SystemService * If more than 4 jobs total are ready we send them all off. * TODO: It would be nice to consolidate these sort of high-level policies somewhere. */ - final class MaybeReadyJobQueueFunctor implements JobStatusFunctor { + final class MaybeReadyJobQueueFunctor implements Consumer<JobStatus> { int chargingCount; int batteryNotLowCount; int storageNotLowCount; @@ -1655,7 +1685,7 @@ public final class JobSchedulerService extends com.android.server.SystemService // Functor method invoked for each job via JobStore.forEachJob() @Override - public void process(JobStatus job) { + public void accept(JobStatus job) { if (isReadyToBeExecutedLocked(job)) { try { if (ActivityManager.getService().isAppStartModeDisabled(job.getUid(), @@ -2172,12 +2202,9 @@ public final class JobSchedulerService extends com.android.server.SystemService public List<JobInfo> getSystemScheduledPendingJobs() { synchronized (mLock) { final List<JobInfo> pendingJobs = new ArrayList<JobInfo>(); - mJobs.forEachJob(Process.SYSTEM_UID, new JobStatusFunctor() { - @Override - public void process(JobStatus job) { - if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) { - pendingJobs.add(job.getJob()); - } + mJobs.forEachJob(Process.SYSTEM_UID, (job) -> { + if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) { + pendingJobs.add(job.getJob()); } }); return pendingJobs; @@ -2243,7 +2270,7 @@ public final class JobSchedulerService extends com.android.server.SystemService @Override public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId, - boolean idle, int bucket) { + boolean idle, int bucket, int reason) { final int uid = mLocalPM.getPackageUid(packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, userId); if (uid < 0) { @@ -2306,7 +2333,7 @@ public final class JobSchedulerService extends com.android.server.SystemService } } - static class DeferredJobCounter implements JobStatusFunctor { + static class DeferredJobCounter implements Consumer<JobStatus> { private int mDeferred = 0; public int numDeferred() { @@ -2314,7 +2341,7 @@ public final class JobSchedulerService extends com.android.server.SystemService } @Override - public void process(JobStatus job) { + public void accept(JobStatus job) { if (job.getWhenStandbyDeferred() > 0) { mDeferred++; } @@ -2595,12 +2622,13 @@ public final class JobSchedulerService extends com.android.server.SystemService } } - long identityToken = Binder.clearCallingIdentity(); + final long identityToken = Binder.clearCallingIdentity(); try { if (proto) { JobSchedulerService.this.dumpInternalProto(fd, filterUid); } else { - JobSchedulerService.this.dumpInternal(pw, filterUid); + JobSchedulerService.this.dumpInternal(new IndentingPrintWriter(pw, " "), + filterUid); } } finally { Binder.restoreCallingIdentity(identityToken); @@ -2899,13 +2927,34 @@ public final class JobSchedulerService extends com.android.server.SystemService }); } - void dumpInternal(final PrintWriter pw, int filterUid) { + void dumpInternal(final IndentingPrintWriter pw, int filterUid) { final int filterUidFinal = UserHandle.getAppId(filterUid); final long nowElapsed = sElapsedRealtimeClock.millis(); final long nowUptime = sUptimeMillisClock.millis(); + final Predicate<JobStatus> predicate = (js) -> { + return filterUidFinal == -1 || UserHandle.getAppId(js.getUid()) == filterUidFinal + || UserHandle.getAppId(js.getSourceUid()) == filterUidFinal; + }; synchronized (mLock) { mConstants.dump(pw); pw.println(); + + pw.println(" Heartbeat:"); + pw.print(" Current: "); pw.println(mHeartbeat); + pw.println(" Next"); + pw.print(" ACTIVE: "); pw.println(mNextBucketHeartbeat[0]); + pw.print(" WORKING: "); pw.println(mNextBucketHeartbeat[1]); + pw.print(" FREQUENT: "); pw.println(mNextBucketHeartbeat[2]); + pw.print(" RARE: "); pw.println(mNextBucketHeartbeat[3]); + pw.print(" Last heartbeat: "); + TimeUtils.formatDuration(mLastHeartbeatTime, nowElapsed, pw); + pw.println(); + pw.print(" Next heartbeat: "); + TimeUtils.formatDuration(mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME, + nowElapsed, pw); + pw.println(); + pw.println(); + pw.println("Started users: " + Arrays.toString(mStartedUsers)); pw.print("Registered "); pw.print(mJobs.size()); @@ -2918,11 +2967,15 @@ public final class JobSchedulerService extends com.android.server.SystemService pw.println(job.toShortStringExceptUniqueId()); // Skip printing details if the caller requested a filter - if (!job.shouldDump(filterUidFinal)) { + if (!predicate.test(job)) { continue; } job.dump(pw, " ", true, nowElapsed); + pw.print(" Last run heartbeat: "); + pw.print(heartbeatWhenJobsLastRun(job)); + pw.println(); + pw.print(" Ready: "); pw.print(isReadyToBeExecutedLocked(job)); pw.print(" (job="); @@ -2952,7 +3005,10 @@ public final class JobSchedulerService extends com.android.server.SystemService } for (int i=0; i<mControllers.size(); i++) { pw.println(); - mControllers.get(i).dumpControllerStateLocked(pw, filterUidFinal); + pw.println(mControllers.get(i).getClass().getSimpleName() + ":"); + pw.increaseIndent(); + mControllers.get(i).dumpControllerStateLocked(pw, predicate); + pw.decreaseIndent(); } pw.println(); pw.println("Uid priority overrides:"); @@ -3055,9 +3111,23 @@ public final class JobSchedulerService extends com.android.server.SystemService final int filterUidFinal = UserHandle.getAppId(filterUid); final long nowElapsed = sElapsedRealtimeClock.millis(); final long nowUptime = sUptimeMillisClock.millis(); + final Predicate<JobStatus> predicate = (js) -> { + return filterUidFinal == -1 || UserHandle.getAppId(js.getUid()) == filterUidFinal + || UserHandle.getAppId(js.getSourceUid()) == filterUidFinal; + }; synchronized (mLock) { mConstants.dump(proto, JobSchedulerServiceDumpProto.SETTINGS); + proto.write(JobSchedulerServiceDumpProto.CURRENT_HEARTBEAT, mHeartbeat); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[0]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[1]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[2]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[3]); + proto.write(JobSchedulerServiceDumpProto.LAST_HEARTBEAT_TIME_MILLIS, + mLastHeartbeatTime - nowUptime); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT_TIME_MILLIS, + mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME - nowUptime); + for (int u : mStartedUsers) { proto.write(JobSchedulerServiceDumpProto.STARTED_USERS, u); } @@ -3069,7 +3139,7 @@ public final class JobSchedulerService extends com.android.server.SystemService job.writeToShortProto(proto, JobSchedulerServiceDumpProto.RegisteredJob.INFO); // Skip printing details if the caller requested a filter - if (!job.shouldDump(filterUidFinal)) { + if (!predicate.test(job)) { continue; } @@ -3096,13 +3166,14 @@ public final class JobSchedulerService extends com.android.server.SystemService } proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_COMPONENT_PRESENT, componentPresent); + proto.write(RegisteredJob.LAST_RUN_HEARTBEAT, heartbeatWhenJobsLastRun(job)); proto.end(rjToken); } } for (StateController controller : mControllers) { controller.dumpControllerStateLocked( - proto, JobSchedulerServiceDumpProto.CONTROLLERS, filterUidFinal); + proto, JobSchedulerServiceDumpProto.CONTROLLERS, predicate); } for (int i=0; i< mUidPriorityOverride.size(); i++) { int uid = mUidPriorityOverride.keyAt(i); diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java index cf2788255843..7235faa6ad50 100644 --- a/services/core/java/com/android/server/job/JobStore.java +++ b/services/core/java/com/android/server/job/JobStore.java @@ -19,6 +19,7 @@ package com.android.server.job; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import static com.android.server.job.JobSchedulerService.sSystemClock; +import android.annotation.Nullable; import android.app.ActivityManager; import android.app.IActivityManager; import android.app.job.JobInfo; @@ -62,6 +63,7 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import java.util.function.Predicate; /** @@ -286,20 +288,21 @@ public final class JobStore { * transient unified collections for them to iterate over and then discard, or creating * iterators every time a client needs to perform a sweep. */ - public void forEachJob(JobStatusFunctor functor) { - mJobSet.forEachJob(functor); + public void forEachJob(Consumer<JobStatus> functor) { + mJobSet.forEachJob(null, functor); } - public void forEachJob(int uid, JobStatusFunctor functor) { - mJobSet.forEachJob(uid, functor); + public void forEachJob(@Nullable Predicate<JobStatus> filterPredicate, + Consumer<JobStatus> functor) { + mJobSet.forEachJob(filterPredicate, functor); } - public void forEachJobForSourceUid(int sourceUid, JobStatusFunctor functor) { - mJobSet.forEachJobForSourceUid(sourceUid, functor); + public void forEachJob(int uid, Consumer<JobStatus> functor) { + mJobSet.forEachJob(uid, functor); } - public interface JobStatusFunctor { - public void process(JobStatus jobStatus); + public void forEachJobForSourceUid(int sourceUid, Consumer<JobStatus> functor) { + mJobSet.forEachJobForSourceUid(sourceUid, functor); } /** Version of the db schema. */ @@ -342,12 +345,9 @@ public final class JobStore { final List<JobStatus> storeCopy = new ArrayList<JobStatus>(); synchronized (mLock) { // Clone the jobs so we can release the lock before writing. - mJobSet.forEachJob(new JobStatusFunctor() { - @Override - public void process(JobStatus job) { - if (job.isPersisted()) { - storeCopy.add(new JobStatus(job)); - } + mJobSet.forEachJob(null, (job) -> { + if (job.isPersisted()) { + storeCopy.add(new JobStatus(job)); } }); } @@ -1184,31 +1184,35 @@ public final class JobStore { return total; } - public void forEachJob(JobStatusFunctor functor) { + public void forEachJob(@Nullable Predicate<JobStatus> filterPredicate, + Consumer<JobStatus> functor) { for (int uidIndex = mJobs.size() - 1; uidIndex >= 0; uidIndex--) { ArraySet<JobStatus> jobs = mJobs.valueAt(uidIndex); if (jobs != null) { for (int i = jobs.size() - 1; i >= 0; i--) { - functor.process(jobs.valueAt(i)); + final JobStatus jobStatus = jobs.valueAt(i); + if ((filterPredicate == null) || filterPredicate.test(jobStatus)) { + functor.accept(jobStatus); + } } } } } - public void forEachJob(int callingUid, JobStatusFunctor functor) { + public void forEachJob(int callingUid, Consumer<JobStatus> functor) { ArraySet<JobStatus> jobs = mJobs.get(callingUid); if (jobs != null) { for (int i = jobs.size() - 1; i >= 0; i--) { - functor.process(jobs.valueAt(i)); + functor.accept(jobs.valueAt(i)); } } } - public void forEachJobForSourceUid(int sourceUid, JobStatusFunctor functor) { + public void forEachJobForSourceUid(int sourceUid, Consumer<JobStatus> functor) { final ArraySet<JobStatus> jobs = mJobsPerSourceUid.get(sourceUid); if (jobs != null) { for (int i = jobs.size() - 1; i >= 0; i--) { - functor.process(jobs.valueAt(i)); + functor.accept(jobs.valueAt(i)); } } } diff --git a/services/core/java/com/android/server/job/controllers/AppIdleController.java b/services/core/java/com/android/server/job/controllers/AppIdleController.java index 8d11d1ee6c1b..ed29a4c4e252 100644 --- a/services/core/java/com/android/server/job/controllers/AppIdleController.java +++ b/services/core/java/com/android/server/job/controllers/AppIdleController.java @@ -17,17 +17,18 @@ package com.android.server.job.controllers; import android.app.usage.UsageStatsManagerInternal; -import android.content.Context; import android.os.UserHandle; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; -import com.android.server.job.JobStore; import com.android.server.job.StateControllerProto; -import java.io.PrintWriter; +import java.util.function.Consumer; +import java.util.function.Predicate; /** * Controls when apps are considered idle and if jobs pertaining to those apps should @@ -36,35 +37,32 @@ import java.io.PrintWriter; * out of idle state, it will be allowed to run scheduled jobs. */ public final class AppIdleController extends StateController { + private static final String TAG = "JobScheduler.AppIdle"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); - private static final String LOG_TAG = "AppIdleController"; - private static final boolean DEBUG = false; - - // Singleton factory - private static Object sCreationLock = new Object(); - private static volatile AppIdleController sController; - private final JobSchedulerService mJobSchedulerService; private final UsageStatsManagerInternal mUsageStatsInternal; private boolean mInitializedParoleOn; boolean mAppIdleParoleOn; - final class GlobalUpdateFunc implements JobStore.JobStatusFunctor { + final class GlobalUpdateFunc implements Consumer<JobStatus> { boolean mChanged; - @Override public void process(JobStatus jobStatus) { + @Override + public void accept(JobStatus jobStatus) { String packageName = jobStatus.getSourcePackageName(); final boolean appIdle = !mAppIdleParoleOn && mUsageStatsInternal.isAppIdle(packageName, jobStatus.getSourceUid(), jobStatus.getSourceUserId()); if (DEBUG) { - Slog.d(LOG_TAG, "Setting idle state of " + packageName + " to " + appIdle); + Slog.d(TAG, "Setting idle state of " + packageName + " to " + appIdle); } if (jobStatus.setAppNotIdleConstraintSatisfied(!appIdle)) { mChanged = true; } } - }; + } - final static class PackageUpdateFunc implements JobStore.JobStatusFunctor { + final static class PackageUpdateFunc implements Consumer<JobStatus> { final int mUserId; final String mPackage; final boolean mIdle; @@ -76,33 +74,23 @@ public final class AppIdleController extends StateController { mIdle = idle; } - @Override public void process(JobStatus jobStatus) { + @Override + public void accept(JobStatus jobStatus) { if (jobStatus.getSourcePackageName().equals(mPackage) && jobStatus.getSourceUserId() == mUserId) { if (jobStatus.setAppNotIdleConstraintSatisfied(!mIdle)) { if (DEBUG) { - Slog.d(LOG_TAG, "App Idle state changed, setting idle state of " + Slog.d(TAG, "App Idle state changed, setting idle state of " + mPackage + " to " + mIdle); } mChanged = true; } } } - }; - - public static AppIdleController get(JobSchedulerService service) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new AppIdleController(service, service.getContext(), - service.getLock()); - } - return sController; - } } - private AppIdleController(JobSchedulerService service, Context context, Object lock) { - super(service, context, lock); - mJobSchedulerService = service; + public AppIdleController(JobSchedulerService service) { + super(service); mUsageStatsInternal = LocalServices.getService(UsageStatsManagerInternal.class); mAppIdleParoleOn = true; mUsageStatsInternal.addAppIdleStateChangeListener(new AppIdleStateChangeListener()); @@ -118,7 +106,7 @@ public final class AppIdleController extends StateController { final boolean appIdle = !mAppIdleParoleOn && mUsageStatsInternal.isAppIdle(packageName, jobStatus.getSourceUid(), jobStatus.getSourceUserId()); if (DEBUG) { - Slog.d(LOG_TAG, "Start tracking, setting idle state of " + Slog.d(TAG, "Start tracking, setting idle state of " + packageName + " to " + appIdle); } jobStatus.setAppNotIdleConstraintSatisfied(!appIdle); @@ -130,56 +118,46 @@ public final class AppIdleController extends StateController { } @Override - public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) { - pw.print("AppIdle: parole on = "); - pw.println(mAppIdleParoleOn); - mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() { - @Override public void process(JobStatus jobStatus) { - // Skip printing details if the caller requested a filter - if (!jobStatus.shouldDump(filterUid)) { - return; - } - pw.print(" #"); - jobStatus.printUniqueId(pw); - pw.print(" from "); - UserHandle.formatUid(pw, jobStatus.getSourceUid()); - pw.print(": "); - pw.print(jobStatus.getSourcePackageName()); - if ((jobStatus.satisfiedConstraints&JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0) { - pw.println(" RUNNABLE"); - } else { - pw.println(" WAITING"); - } + public void dumpControllerStateLocked(final IndentingPrintWriter pw, + final Predicate<JobStatus> predicate) { + pw.println("Parole on: " + mAppIdleParoleOn); + pw.println(); + + mService.getJobStore().forEachJob(predicate, (jobStatus) -> { + pw.print("#"); + jobStatus.printUniqueId(pw); + pw.print(" from "); + UserHandle.formatUid(pw, jobStatus.getSourceUid()); + pw.print(": "); + pw.print(jobStatus.getSourcePackageName()); + if ((jobStatus.satisfiedConstraints&JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0) { + pw.println(" RUNNABLE"); + } else { + pw.println(" WAITING"); } }); } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.APP_IDLE); proto.write(StateControllerProto.AppIdleController.IS_PAROLE_ON, mAppIdleParoleOn); - mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() { - @Override public void process(JobStatus js) { - // Skip printing details if the caller requested a filter - if (!js.shouldDump(filterUid)) { - return; - } - - final long jsToken = - proto.start(StateControllerProto.AppIdleController.TRACKED_JOBS); - js.writeToShortProto(proto, StateControllerProto.AppIdleController.TrackedJob.INFO); - proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_UID, - js.getSourceUid()); - proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_PACKAGE_NAME, - js.getSourcePackageName()); - proto.write( - StateControllerProto.AppIdleController.TrackedJob.ARE_CONSTRAINTS_SATISFIED, - (js.satisfiedConstraints & JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0); - proto.end(jsToken); - } + mService.getJobStore().forEachJob(predicate, (js) -> { + final long jsToken = + proto.start(StateControllerProto.AppIdleController.TRACKED_JOBS); + js.writeToShortProto(proto, StateControllerProto.AppIdleController.TrackedJob.INFO); + proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_UID, + js.getSourceUid()); + proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_PACKAGE_NAME, + js.getSourcePackageName()); + proto.write( + StateControllerProto.AppIdleController.TrackedJob.ARE_CONSTRAINTS_SATISFIED, + (js.satisfiedConstraints & JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0); + proto.end(jsToken); }); proto.end(mToken); @@ -195,7 +173,7 @@ public final class AppIdleController extends StateController { } mAppIdleParoleOn = isAppIdleParoleOn; GlobalUpdateFunc update = new GlobalUpdateFunc(); - mJobSchedulerService.getJobStore().forEachJob(update); + mService.getJobStore().forEachJob(update); if (update.mChanged) { changed = true; } @@ -208,7 +186,8 @@ public final class AppIdleController extends StateController { private final class AppIdleStateChangeListener extends UsageStatsManagerInternal.AppIdleStateChangeListener { @Override - public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) { + public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket, + int reason) { boolean changed = false; synchronized (mLock) { if (mAppIdleParoleOn) { @@ -216,7 +195,7 @@ public final class AppIdleController extends StateController { } PackageUpdateFunc update = new PackageUpdateFunc(userId, packageName, idle); - mJobSchedulerService.getJobStore().forEachJob(update); + mService.getJobStore().forEachJob(update); if (update.mChanged) { changed = true; } @@ -229,7 +208,7 @@ public final class AppIdleController extends StateController { @Override public void onParoleStateChanged(boolean isParoleOn) { if (DEBUG) { - Slog.d(LOG_TAG, "Parole on: " + isParoleOn); + Slog.d(TAG, "Parole on: " + isParoleOn); } setAppIdleParoleOn(isParoleOn); } diff --git a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java index e8057fbd4150..36e75115712c 100644 --- a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java +++ b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java @@ -16,49 +16,33 @@ package com.android.server.job.controllers; -import android.content.Context; import android.os.SystemClock; import android.os.UserHandle; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; +import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.AppStateTracker; import com.android.server.AppStateTracker.Listener; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; -import com.android.server.job.JobStore; import com.android.server.job.StateControllerProto; import com.android.server.job.StateControllerProto.BackgroundJobsController.TrackedJob; -import java.io.PrintWriter; +import java.util.function.Consumer; +import java.util.function.Predicate; public final class BackgroundJobsController extends StateController { - - private static final String LOG_TAG = "BackgroundJobsController"; - private static final boolean DEBUG = JobSchedulerService.DEBUG; - - // Singleton factory - private static final Object sCreationLock = new Object(); - private static volatile BackgroundJobsController sController; - - private final JobSchedulerService mJobSchedulerService; + private static final String TAG = "JobScheduler.Background"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); private final AppStateTracker mAppStateTracker; - public static BackgroundJobsController get(JobSchedulerService service) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new BackgroundJobsController(service, service.getContext(), - service.getLock()); - } - return sController; - } - } - - private BackgroundJobsController(JobSchedulerService service, Context context, Object lock) { - super(service, context, lock); - mJobSchedulerService = service; + public BackgroundJobsController(JobSchedulerService service) { + super(service); mAppStateTracker = Preconditions.checkNotNull( LocalServices.getService(AppStateTracker.class)); @@ -76,19 +60,15 @@ public final class BackgroundJobsController extends StateController { } @Override - public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) { - pw.println("BackgroundJobsController"); - - mAppStateTracker.dump(pw, ""); + public void dumpControllerStateLocked(final IndentingPrintWriter pw, + final Predicate<JobStatus> predicate) { + mAppStateTracker.dump(pw); + pw.println(); - pw.println("Job state:"); - mJobSchedulerService.getJobStore().forEachJob((jobStatus) -> { - if (!jobStatus.shouldDump(filterUid)) { - return; - } + mService.getJobStore().forEachJob(predicate, (jobStatus) -> { final int uid = jobStatus.getSourceUid(); final String sourcePkg = jobStatus.getSourcePackageName(); - pw.print(" #"); + pw.print("#"); jobStatus.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, uid); @@ -114,17 +94,15 @@ public final class BackgroundJobsController extends StateController { } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.BACKGROUND); mAppStateTracker.dumpProto(proto, StateControllerProto.BackgroundJobsController.FORCE_APP_STANDBY_TRACKER); - mJobSchedulerService.getJobStore().forEachJob((jobStatus) -> { - if (!jobStatus.shouldDump(filterUid)) { - return; - } + mService.getJobStore().forEachJob(predicate, (jobStatus) -> { final long jsToken = proto.start(StateControllerProto.BackgroundJobsController.TRACKED_JOBS); @@ -175,11 +153,11 @@ public final class BackgroundJobsController extends StateController { final long start = DEBUG ? SystemClock.elapsedRealtimeNanos() : 0; - mJobSchedulerService.getJobStore().forEachJob(updateTrackedJobs); + mService.getJobStore().forEachJob(updateTrackedJobs); final long time = DEBUG ? (SystemClock.elapsedRealtimeNanos() - start) : 0; if (DEBUG) { - Slog.d(LOG_TAG, String.format( + Slog.d(TAG, String.format( "Job status updated: %d/%d checked/total jobs, %d us", updateTrackedJobs.mCheckedCount, updateTrackedJobs.mTotalCount, @@ -204,7 +182,7 @@ public final class BackgroundJobsController extends StateController { return jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun); } - private final class UpdateJobFunctor implements JobStore.JobStatusFunctor { + private final class UpdateJobFunctor implements Consumer<JobStatus> { private final int mFilterUid; boolean mChanged = false; @@ -216,7 +194,7 @@ public final class BackgroundJobsController extends StateController { } @Override - public void process(JobStatus jobStatus) { + public void accept(JobStatus jobStatus) { mTotalCount++; if ((mFilterUid > 0) && (mFilterUid != jobStatus.getSourceUid())) { return; diff --git a/services/core/java/com/android/server/job/controllers/BatteryController.java b/services/core/java/com/android/server/job/controllers/BatteryController.java index 8d3d116e6631..46658ad33b85 100644 --- a/services/core/java/com/android/server/job/controllers/BatteryController.java +++ b/services/core/java/com/android/server/job/controllers/BatteryController.java @@ -26,16 +26,17 @@ import android.os.BatteryManager; import android.os.BatteryManagerInternal; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; -import java.io.PrintWriter; +import java.util.function.Predicate; /** * Simple controller that tracks whether the phone is charging or not. The phone is considered to @@ -43,38 +44,20 @@ import java.io.PrintWriter; * ACTION_BATTERY_OK. */ public final class BatteryController extends StateController { - private static final String TAG = "JobScheduler.Batt"; - - private static final Object sCreationLock = new Object(); - private static volatile BatteryController sController; + private static final String TAG = "JobScheduler.Battery"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); private final ArraySet<JobStatus> mTrackedTasks = new ArraySet<>(); private ChargingTracker mChargeTracker; - public static BatteryController get(JobSchedulerService taskManagerService) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new BatteryController(taskManagerService, - taskManagerService.getContext(), taskManagerService.getLock()); - } - } - return sController; - } - @VisibleForTesting public ChargingTracker getTracker() { return mChargeTracker; } - @VisibleForTesting - public static BatteryController getForTesting(StateChangedListener stateChangedListener, - Context context) { - return new BatteryController(stateChangedListener, context, new Object()); - } - - private BatteryController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); + public BatteryController(JobSchedulerService service) { + super(service); mChargeTracker = new ChargingTracker(); mChargeTracker.startTracking(); } @@ -241,24 +224,23 @@ public final class BatteryController extends StateController { } @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { - pw.print("Battery: stable power = "); - pw.print(mChargeTracker.isOnStablePower()); - pw.print(", not low = "); - pw.println(mChargeTracker.isBatteryNotLow()); + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { + pw.println("Stable power: " + mChargeTracker.isOnStablePower()); + pw.println("Not low: " + mChargeTracker.isBatteryNotLow()); + if (mChargeTracker.isMonitoring()) { pw.print("MONITORING: seq="); pw.println(mChargeTracker.getSeq()); } - pw.print("Tracking "); - pw.print(mTrackedTasks.size()); - pw.println(":"); + pw.println(); + for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } - pw.print(" #"); + pw.print("#"); js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); @@ -267,7 +249,8 @@ public final class BatteryController extends StateController { } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.BATTERY); @@ -283,7 +266,7 @@ public final class BatteryController extends StateController { for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } final long jsToken = proto.start(StateControllerProto.BatteryController.TRACKED_JOBS); diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java index 77e813e086ce..abe55bbfb729 100644 --- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java +++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java @@ -21,7 +21,6 @@ import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import android.app.job.JobInfo; -import android.content.Context; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.INetworkPolicyListener; @@ -35,17 +34,19 @@ import android.os.Process; import android.os.UserHandle; import android.text.format.DateUtils; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.job.JobSchedulerService; +import com.android.server.job.JobSchedulerService.Constants; import com.android.server.job.JobServiceContext; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; -import java.io.PrintWriter; +import java.util.function.Predicate; /** * Handles changes in connectivity. @@ -56,8 +57,9 @@ import java.io.PrintWriter; */ public final class ConnectivityController extends StateController implements ConnectivityManager.OnNetworkActiveListener { - private static final String TAG = "JobScheduler.Conn"; - private static final boolean DEBUG = false; + private static final String TAG = "JobScheduler.Connectivity"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); private final ConnectivityManager mConnManager; private final NetworkPolicyManager mNetPolicyManager; @@ -66,22 +68,8 @@ public final class ConnectivityController extends StateController implements @GuardedBy("mLock") private final ArraySet<JobStatus> mTrackedJobs = new ArraySet<>(); - /** Singleton. */ - private static ConnectivityController sSingleton; - private static Object sCreationLock = new Object(); - - public static ConnectivityController get(JobSchedulerService jms) { - synchronized (sCreationLock) { - if (sSingleton == null) { - sSingleton = new ConnectivityController(jms, jms.getContext(), jms.getLock()); - } - return sSingleton; - } - } - - private ConnectivityController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); + public ConnectivityController(JobSchedulerService service) { + super(service); mConnManager = mContext.getSystemService(ConnectivityManager.class); mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class); @@ -120,7 +108,7 @@ public final class ConnectivityController extends StateController implements */ @SuppressWarnings("unused") private static boolean isInsane(JobStatus jobStatus, Network network, - NetworkCapabilities capabilities) { + NetworkCapabilities capabilities, Constants constants) { final long estimatedBytes = jobStatus.getEstimatedNetworkBytes(); if (estimatedBytes == JobInfo.NETWORK_BYTES_UNKNOWN) { // We don't know how large the job is; cross our fingers! @@ -151,11 +139,11 @@ public final class ConnectivityController extends StateController implements @SuppressWarnings("unused") private static boolean isCongestionDelayed(JobStatus jobStatus, Network network, - NetworkCapabilities capabilities) { + NetworkCapabilities capabilities, Constants constants) { // If network is congested, and job is less than 50% through the // developer-requested window, then we're okay delaying the job. if (!capabilities.hasCapability(NET_CAPABILITY_NOT_CONGESTED)) { - return jobStatus.getFractionRunTime() < 0.5; + return jobStatus.getFractionRunTime() < constants.CONN_CONGESTION_DELAY_FRAC; } else { return false; } @@ -163,14 +151,14 @@ public final class ConnectivityController extends StateController implements @SuppressWarnings("unused") private static boolean isStrictSatisfied(JobStatus jobStatus, Network network, - NetworkCapabilities capabilities) { + NetworkCapabilities capabilities, Constants constants) { return jobStatus.getJob().getRequiredNetwork().networkCapabilities .satisfiedByNetworkCapabilities(capabilities); } @SuppressWarnings("unused") private static boolean isRelaxedSatisfied(JobStatus jobStatus, Network network, - NetworkCapabilities capabilities) { + NetworkCapabilities capabilities, Constants constants) { // Only consider doing this for prefetching jobs if ((jobStatus.getJob().getFlags() & JobInfo.FLAG_IS_PREFETCH) == 0) { return false; @@ -182,7 +170,7 @@ public final class ConnectivityController extends StateController implements .removeCapability(NET_CAPABILITY_NOT_METERED); if (relaxed.satisfiedByNetworkCapabilities(capabilities)) { // TODO: treat this as "maybe" response; need to check quotas - return jobStatus.getFractionRunTime() > 0.5; + return jobStatus.getFractionRunTime() > constants.CONN_PREFETCH_RELAX_FRAC; } else { return false; } @@ -190,21 +178,21 @@ public final class ConnectivityController extends StateController implements @VisibleForTesting static boolean isSatisfied(JobStatus jobStatus, Network network, - NetworkCapabilities capabilities) { + NetworkCapabilities capabilities, Constants constants) { // Zeroth, we gotta have a network to think about being satisfied if (network == null || capabilities == null) return false; // First, are we insane? - if (isInsane(jobStatus, network, capabilities)) return false; + if (isInsane(jobStatus, network, capabilities, constants)) return false; // Second, is the network congested? - if (isCongestionDelayed(jobStatus, network, capabilities)) return false; + if (isCongestionDelayed(jobStatus, network, capabilities, constants)) return false; // Third, is the network a strict match? - if (isStrictSatisfied(jobStatus, network, capabilities)) return true; + if (isStrictSatisfied(jobStatus, network, capabilities, constants)) return true; // Third, is the network a relaxed match? - if (isRelaxedSatisfied(jobStatus, network, capabilities)) return true; + if (isRelaxedSatisfied(jobStatus, network, capabilities, constants)) return true; return false; } @@ -220,7 +208,7 @@ public final class ConnectivityController extends StateController implements final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network); final boolean connected = (info != null) && info.isConnected(); - final boolean satisfied = isSatisfied(jobStatus, network, capabilities); + final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants); final boolean changed = jobStatus .setConnectivityConstraintSatisfied(connected && satisfied); @@ -329,18 +317,15 @@ public final class ConnectivityController extends StateController implements @GuardedBy("mLock") @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { - pw.print("Connectivity: connected="); - pw.println(mConnected); - - pw.print("Tracking "); - pw.print(mTrackedJobs.size()); - pw.println(" jobs"); + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { + pw.println("System connected: " + mConnected); + pw.println(); for (int i = 0; i < mTrackedJobs.size(); i++) { final JobStatus js = mTrackedJobs.valueAt(i); - if (js.shouldDump(filterUid)) { - pw.print(" #"); + if (predicate.test(js)) { + pw.print("#"); js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); @@ -353,7 +338,8 @@ public final class ConnectivityController extends StateController implements @GuardedBy("mLock") @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.CONNECTIVITY); @@ -361,7 +347,7 @@ public final class ConnectivityController extends StateController implements for (int i = 0; i < mTrackedJobs.size(); i++) { final JobStatus js = mTrackedJobs.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } final long jsToken = proto.start(StateControllerProto.ConnectivityController.TRACKED_JOBS); diff --git a/services/core/java/com/android/server/job/controllers/ContentObserverController.java b/services/core/java/com/android/server/job/controllers/ContentObserverController.java index 7394e23f297a..a775cf5a671c 100644 --- a/services/core/java/com/android/server/job/controllers/ContentObserverController.java +++ b/services/core/java/com/android/server/job/controllers/ContentObserverController.java @@ -18,33 +18,33 @@ package com.android.server.job.controllers; import android.annotation.UserIdInt; import android.app.job.JobInfo; -import android.content.Context; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; -import android.util.ArrayMap; -import android.util.ArraySet; import android.util.proto.ProtoOutputStream; -import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.job.JobSchedulerService; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; import com.android.server.job.StateControllerProto.ContentObserverController.Observer.TriggerContentData; -import java.io.PrintWriter; import java.util.ArrayList; +import java.util.function.Predicate; /** * Controller for monitoring changes to content URIs through a ContentObserver. */ public final class ContentObserverController extends StateController { - private static final String TAG = "JobScheduler.Content"; - private static final boolean DEBUG = false; + private static final String TAG = "JobScheduler.ContentObserver"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); /** * Maximum number of changing URIs we will batch together to report. @@ -58,9 +58,6 @@ public final class ContentObserverController extends StateController { */ private static final int URIS_URGENT_THRESHOLD = 40; - private static final Object sCreationLock = new Object(); - private static volatile ContentObserverController sController; - final private ArraySet<JobStatus> mTrackedTasks = new ArraySet<>(); /** * Per-userid {@link JobInfo.TriggerContentUri} keyed ContentObserver cache. @@ -69,26 +66,9 @@ public final class ContentObserverController extends StateController { new SparseArray<>(); final Handler mHandler; - public static ContentObserverController get(JobSchedulerService taskManagerService) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new ContentObserverController(taskManagerService, - taskManagerService.getContext(), taskManagerService.getLock()); - } - } - return sController; - } - - @VisibleForTesting - public static ContentObserverController getForTesting(StateChangedListener stateChangedListener, - Context context) { - return new ContentObserverController(stateChangedListener, context, new Object()); - } - - private ContentObserverController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); - mHandler = new Handler(context.getMainLooper()); + public ContentObserverController(JobSchedulerService service) { + super(service); + mHandler = new Handler(mContext.getMainLooper()); } @Override @@ -373,22 +353,25 @@ public final class ContentObserverController extends StateController { } @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { - pw.println("Content:"); + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { for (int i = 0; i < mTrackedTasks.size(); i++) { JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } - pw.print(" #"); + pw.print("#"); js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); pw.println(); } + pw.println(); + int N = mObservers.size(); if (N > 0) { - pw.println(" Observers:"); + pw.println("Observers:"); + pw.increaseIndent(); for (int userIdx = 0; userIdx < N; userIdx++) { final int userId = mObservers.keyAt(userIdx); ArrayMap<JobInfo.TriggerContentUri, ObserverInstance> observersOfUser = @@ -400,7 +383,7 @@ public final class ContentObserverController extends StateController { boolean shouldDump = false; for (int j = 0; j < M; j++) { JobInstance inst = obs.mJobs.valueAt(j); - if (inst.mJobStatus.shouldDump(filterUid)) { + if (predicate.test(inst.mJobStatus)) { shouldDump = true; break; } @@ -408,7 +391,6 @@ public final class ContentObserverController extends StateController { if (!shouldDump) { continue; } - pw.print(" "); JobInfo.TriggerContentUri trigger = observersOfUser.keyAt(observerIdx); pw.print(trigger.getUri()); pw.print(" 0x"); @@ -416,17 +398,20 @@ public final class ContentObserverController extends StateController { pw.print(" ("); pw.print(System.identityHashCode(obs)); pw.println("):"); - pw.println(" Jobs:"); + pw.increaseIndent(); + pw.println("Jobs:"); + pw.increaseIndent(); for (int j = 0; j < M; j++) { JobInstance inst = obs.mJobs.valueAt(j); - pw.print(" #"); + pw.print("#"); inst.mJobStatus.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, inst.mJobStatus.getSourceUid()); if (inst.mChangedAuthorities != null) { pw.println(":"); + pw.increaseIndent(); if (inst.mTriggerPending) { - pw.print(" Trigger pending: update="); + pw.print("Trigger pending: update="); TimeUtils.formatDuration( inst.mJobStatus.getTriggerContentUpdateDelay(), pw); pw.print(", max="); @@ -434,35 +419,38 @@ public final class ContentObserverController extends StateController { inst.mJobStatus.getTriggerContentMaxDelay(), pw); pw.println(); } - pw.println(" Changed Authorities:"); + pw.println("Changed Authorities:"); for (int k = 0; k < inst.mChangedAuthorities.size(); k++) { - pw.print(" "); pw.println(inst.mChangedAuthorities.valueAt(k)); } if (inst.mChangedUris != null) { pw.println(" Changed URIs:"); for (int k = 0; k < inst.mChangedUris.size(); k++) { - pw.print(" "); pw.println(inst.mChangedUris.valueAt(k)); } } + pw.decreaseIndent(); } else { pw.println(); } } + pw.decreaseIndent(); + pw.decreaseIndent(); } } + pw.decreaseIndent(); } } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.CONTENT_OBSERVER); for (int i = 0; i < mTrackedTasks.size(); i++) { JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } final long jsToken = @@ -491,7 +479,7 @@ public final class ContentObserverController extends StateController { boolean shouldDump = false; for (int j = 0; j < m; j++) { JobInstance inst = obs.mJobs.valueAt(j); - if (inst.mJobStatus.shouldDump(filterUid)) { + if (predicate.test(inst.mJobStatus)) { shouldDump = true; break; } diff --git a/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java b/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java index 0dbcbeeb402b..127a5c876657 100644 --- a/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java +++ b/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java @@ -27,37 +27,36 @@ import android.os.Message; import android.os.PowerManager; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.SparseBooleanArray; import android.util.proto.ProtoOutputStream; import com.android.internal.util.ArrayUtils; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.DeviceIdleController; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; -import com.android.server.job.JobStore; import com.android.server.job.StateControllerProto; import com.android.server.job.StateControllerProto.DeviceIdleJobsController.TrackedJob; -import java.io.PrintWriter; import java.util.Arrays; +import java.util.function.Consumer; +import java.util.function.Predicate; /** * When device is dozing, set constraint for all jobs, except whitelisted apps, as not satisfied. * When device is not dozing, set constraint for all jobs as satisfied. */ public final class DeviceIdleJobsController extends StateController { + private static final String TAG = "JobScheduler.DeviceIdle"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); - private static final String LOG_TAG = "DeviceIdleJobsController"; - private static final boolean LOG_DEBUG = false; private static final long BACKGROUND_JOBS_DELAY = 3000; static final int PROCESS_BACKGROUND_JOBS = 1; - // Singleton factory - private static Object sCreationLock = new Object(); - private static DeviceIdleJobsController sController; - /** * These are jobs added with a special flag to indicate that they should be exempted from doze * when the app is temp whitelisted or in the foreground. @@ -66,7 +65,6 @@ public final class DeviceIdleJobsController extends StateController { private final SparseBooleanArray mForegroundUids; private final DeviceIdleUpdateFunctor mDeviceIdleUpdateFunctor; private final DeviceIdleJobsDelayHandler mHandler; - private final JobSchedulerService mJobSchedulerService; private final PowerManager mPowerManager; private final DeviceIdleController.LocalService mLocalDeviceIdleController; @@ -77,19 +75,6 @@ public final class DeviceIdleJobsController extends StateController { private int[] mDeviceIdleWhitelistAppIds; private int[] mPowerSaveTempWhitelistAppIds; - /** - * Returns a singleton for the DeviceIdleJobsController - */ - public static DeviceIdleJobsController get(JobSchedulerService service) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new DeviceIdleJobsController(service, service.getContext(), - service.getLock()); - } - return sController; - } - } - // onReceive private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override @@ -104,8 +89,8 @@ public final class DeviceIdleJobsController extends StateController { synchronized (mLock) { mDeviceIdleWhitelistAppIds = mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds(); - if (LOG_DEBUG) { - Slog.d(LOG_TAG, "Got whitelist " + if (DEBUG) { + Slog.d(TAG, "Got whitelist " + Arrays.toString(mDeviceIdleWhitelistAppIds)); } } @@ -114,8 +99,8 @@ public final class DeviceIdleJobsController extends StateController { synchronized (mLock) { mPowerSaveTempWhitelistAppIds = mLocalDeviceIdleController.getPowerSaveTempWhitelistAppIds(); - if (LOG_DEBUG) { - Slog.d(LOG_TAG, "Got temp whitelist " + if (DEBUG) { + Slog.d(TAG, "Got temp whitelist " + Arrays.toString(mPowerSaveTempWhitelistAppIds)); } boolean changed = false; @@ -131,12 +116,10 @@ public final class DeviceIdleJobsController extends StateController { } }; - private DeviceIdleJobsController(JobSchedulerService jobSchedulerService, Context context, - Object lock) { - super(jobSchedulerService, context, lock); + public DeviceIdleJobsController(JobSchedulerService service) { + super(service); - mJobSchedulerService = jobSchedulerService; - mHandler = new DeviceIdleJobsDelayHandler(context.getMainLooper()); + mHandler = new DeviceIdleJobsDelayHandler(mContext.getMainLooper()); // Register for device idle mode changes mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); mLocalDeviceIdleController = @@ -163,16 +146,16 @@ public final class DeviceIdleJobsController extends StateController { changed = true; } mDeviceIdleMode = enabled; - if (LOG_DEBUG) Slog.d(LOG_TAG, "mDeviceIdleMode=" + mDeviceIdleMode); + if (DEBUG) Slog.d(TAG, "mDeviceIdleMode=" + mDeviceIdleMode); if (enabled) { mHandler.removeMessages(PROCESS_BACKGROUND_JOBS); - mJobSchedulerService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); + mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); } else { // When coming out of doze, process all foreground uids immediately, while others // will be processed after a delay of 3 seconds. for (int i = 0; i < mForegroundUids.size(); i++) { if (mForegroundUids.valueAt(i)) { - mJobSchedulerService.getJobStore().forEachJobForSourceUid( + mService.getJobStore().forEachJobForSourceUid( mForegroundUids.keyAt(i), mDeviceIdleUpdateFunctor); } } @@ -193,12 +176,12 @@ public final class DeviceIdleJobsController extends StateController { if (!changed) { return; } - if (LOG_DEBUG) { - Slog.d(LOG_TAG, "uid " + uid + " going " + (active ? "active" : "inactive")); + if (DEBUG) { + Slog.d(TAG, "uid " + uid + " going " + (active ? "active" : "inactive")); } mForegroundUids.put(uid, active); mDeviceIdleUpdateFunctor.mChanged = false; - mJobSchedulerService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor); + mService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); } @@ -245,71 +228,64 @@ public final class DeviceIdleJobsController extends StateController { } @Override - public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) { - pw.println("DeviceIdleJobsController"); - pw.println("mDeviceIdleMode=" + mDeviceIdleMode); - mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() { - @Override public void process(JobStatus jobStatus) { - if (!jobStatus.shouldDump(filterUid)) { - return; - } - pw.print(" #"); - jobStatus.printUniqueId(pw); - pw.print(" from "); - UserHandle.formatUid(pw, jobStatus.getSourceUid()); - pw.print(": "); - pw.print(jobStatus.getSourcePackageName()); - pw.print((jobStatus.satisfiedConstraints - & JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0 - ? " RUNNABLE" : " WAITING"); - if (jobStatus.dozeWhitelisted) { - pw.print(" WHITELISTED"); - } - if (mAllowInIdleJobs.contains(jobStatus)) { - pw.print(" ALLOWED_IN_DOZE"); - } - pw.println(); + public void dumpControllerStateLocked(final IndentingPrintWriter pw, + final Predicate<JobStatus> predicate) { + pw.println("Idle mode: " + mDeviceIdleMode); + pw.println(); + + mService.getJobStore().forEachJob(predicate, (jobStatus) -> { + pw.print("#"); + jobStatus.printUniqueId(pw); + pw.print(" from "); + UserHandle.formatUid(pw, jobStatus.getSourceUid()); + pw.print(": "); + pw.print(jobStatus.getSourcePackageName()); + pw.print((jobStatus.satisfiedConstraints + & JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0 + ? " RUNNABLE" : " WAITING"); + if (jobStatus.dozeWhitelisted) { + pw.print(" WHITELISTED"); } + if (mAllowInIdleJobs.contains(jobStatus)) { + pw.print(" ALLOWED_IN_DOZE"); + } + pw.println(); }); } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.DEVICE_IDLE); proto.write(StateControllerProto.DeviceIdleJobsController.IS_DEVICE_IDLE_MODE, mDeviceIdleMode); - mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() { - @Override public void process(JobStatus jobStatus) { - if (!jobStatus.shouldDump(filterUid)) { - return; - } - final long jsToken = - proto.start(StateControllerProto.DeviceIdleJobsController.TRACKED_JOBS); + mService.getJobStore().forEachJob(predicate, (jobStatus) -> { + final long jsToken = + proto.start(StateControllerProto.DeviceIdleJobsController.TRACKED_JOBS); - jobStatus.writeToShortProto(proto, TrackedJob.INFO); - proto.write(TrackedJob.SOURCE_UID, jobStatus.getSourceUid()); - proto.write(TrackedJob.SOURCE_PACKAGE_NAME, jobStatus.getSourcePackageName()); - proto.write(TrackedJob.ARE_CONSTRAINTS_SATISFIED, - (jobStatus.satisfiedConstraints & - JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0); - proto.write(TrackedJob.IS_DOZE_WHITELISTED, jobStatus.dozeWhitelisted); - proto.write(TrackedJob.IS_ALLOWED_IN_DOZE, mAllowInIdleJobs.contains(jobStatus)); + jobStatus.writeToShortProto(proto, TrackedJob.INFO); + proto.write(TrackedJob.SOURCE_UID, jobStatus.getSourceUid()); + proto.write(TrackedJob.SOURCE_PACKAGE_NAME, jobStatus.getSourcePackageName()); + proto.write(TrackedJob.ARE_CONSTRAINTS_SATISFIED, + (jobStatus.satisfiedConstraints & + JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0); + proto.write(TrackedJob.IS_DOZE_WHITELISTED, jobStatus.dozeWhitelisted); + proto.write(TrackedJob.IS_ALLOWED_IN_DOZE, mAllowInIdleJobs.contains(jobStatus)); - proto.end(jsToken); - } + proto.end(jsToken); }); proto.end(mToken); proto.end(token); } - final class DeviceIdleUpdateFunctor implements JobStore.JobStatusFunctor { + final class DeviceIdleUpdateFunctor implements Consumer<JobStatus> { boolean mChanged; @Override - public void process(JobStatus jobStatus) { + public void accept(JobStatus jobStatus) { mChanged |= updateTaskStateLocked(jobStatus); } } @@ -326,7 +302,7 @@ public final class DeviceIdleJobsController extends StateController { // Just process all the jobs, the ones in foreground should already be running. synchronized (mLock) { mDeviceIdleUpdateFunctor.mChanged = false; - mJobSchedulerService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); + mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor); if (mDeviceIdleUpdateFunctor.mChanged) { mStateChangedListener.onControllerStateChanged(); } diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java index a9bc7e0dfb24..1dbcfd6a5bdf 100644 --- a/services/core/java/com/android/server/job/controllers/IdleController.java +++ b/services/core/java/com/android/server/job/controllers/IdleController.java @@ -26,18 +26,21 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.am.ActivityManagerService; import com.android.server.job.JobSchedulerService; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; -import java.io.PrintWriter; +import java.util.function.Predicate; public final class IdleController extends StateController { - private static final String TAG = "IdleController"; + private static final String TAG = "JobScheduler.Idle"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); // Policy: we decide that we're "idle" if the device has been unused / // screen off or dreaming for at least this long @@ -46,22 +49,8 @@ public final class IdleController extends StateController { final ArraySet<JobStatus> mTrackedTasks = new ArraySet<>(); IdlenessTracker mIdleTracker; - // Singleton factory - private static Object sCreationLock = new Object(); - private static volatile IdleController sController; - - public static IdleController get(JobSchedulerService service) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new IdleController(service, service.getContext(), service.getLock()); - } - return sController; - } - } - - private IdleController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); + public IdleController(JobSchedulerService service) { + super(service); initIdleStateTracking(); } @@ -200,18 +189,17 @@ public final class IdleController extends StateController { } @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { - pw.print("Idle: "); - pw.println(mIdleTracker.isIdle()); - pw.print("Tracking "); - pw.print(mTrackedTasks.size()); - pw.println(":"); + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { + pw.println("Currently idle: " + mIdleTracker.isIdle()); + pw.println(); + for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } - pw.print(" #"); + pw.print("#"); js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); @@ -220,7 +208,8 @@ public final class IdleController extends StateController { } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.IDLE); @@ -228,7 +217,7 @@ public final class IdleController extends StateController { for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } final long jsToken = proto.start(StateControllerProto.IdleController.TRACKED_JOBS); diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java index 3867306ee521..56161977908c 100644 --- a/services/core/java/com/android/server/job/controllers/JobStatus.java +++ b/services/core/java/com/android/server/job/controllers/JobStatus.java @@ -302,7 +302,6 @@ public final class JobStatus { this.numFailures = numFailures; int requiredConstraints = job.getConstraintFlags(); - if (job.getRequiredNetwork() != null) { requiredConstraints |= CONSTRAINT_CONNECTIVITY; } @@ -323,6 +322,13 @@ public final class JobStatus { mInternalFlags = internalFlags; updateEstimatedNetworkBytesLocked(); + + if (job.getRequiredNetwork() != null) { + // Later, when we check if a given network satisfies the required + // network, we need to know the UID that is requesting it, so push + // our source UID into place. + job.getRequiredNetwork().networkCapabilities.setSingleUid(this.sourceUid); + } } /** Copy constructor: used specifically when cloning JobStatus objects for persistence, @@ -882,11 +888,6 @@ public final class JobStatus { return mLastFailedRunTime; } - public boolean shouldDump(int filterUid) { - return filterUid == -1 || UserHandle.getAppId(getUid()) == filterUid - || UserHandle.getAppId(getSourceUid()) == filterUid; - } - /** * @return Whether or not this job is ready to run, based on its requirements. This is true if * the constraints are satisfied <strong>or</strong> the deadline on the job has expired. diff --git a/services/core/java/com/android/server/job/controllers/StateController.java b/services/core/java/com/android/server/job/controllers/StateController.java index d3055e6fa252..495109d88fd7 100644 --- a/services/core/java/com/android/server/job/controllers/StateController.java +++ b/services/core/java/com/android/server/job/controllers/StateController.java @@ -19,10 +19,12 @@ package com.android.server.job.controllers; import android.content.Context; import android.util.proto.ProtoOutputStream; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.job.JobSchedulerService; +import com.android.server.job.JobSchedulerService.Constants; import com.android.server.job.StateChangedListener; -import java.io.PrintWriter; +import java.util.function.Predicate; /** * Incorporates shared controller logic between the various controllers of the JobManager. @@ -30,16 +32,18 @@ import java.io.PrintWriter; * are ready to run, or whether they must be stopped. */ public abstract class StateController { - protected static final boolean DEBUG = JobSchedulerService.DEBUG; + protected final JobSchedulerService mService; + protected final StateChangedListener mStateChangedListener; protected final Context mContext; protected final Object mLock; - protected final StateChangedListener mStateChangedListener; + protected final Constants mConstants; - public StateController(StateChangedListener stateChangedListener, Context context, - Object lock) { - mStateChangedListener = stateChangedListener; - mContext = context; - mLock = lock; + StateController(JobSchedulerService service) { + mService = service; + mStateChangedListener = service; + mContext = service.getContext(); + mLock = service.getLock(); + mConstants = service.getConstants(); } /** @@ -65,7 +69,8 @@ public abstract class StateController { public void rescheduleForFailureLocked(JobStatus newJob, JobStatus failureToReschedule) { } - public abstract void dumpControllerStateLocked(PrintWriter pw, int filterUid); + public abstract void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate); public abstract void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, - int filterUid); + Predicate<JobStatus> predicate); } diff --git a/services/core/java/com/android/server/job/controllers/StorageController.java b/services/core/java/com/android/server/job/controllers/StorageController.java index 0519b635a167..c2ae53f69309 100644 --- a/services/core/java/com/android/server/job/controllers/StorageController.java +++ b/services/core/java/com/android/server/job/controllers/StorageController.java @@ -24,53 +24,36 @@ import android.content.Intent; import android.content.IntentFilter; import android.os.UserHandle; import android.util.ArraySet; +import android.util.Log; import android.util.Slog; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.job.JobSchedulerService; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; import com.android.server.storage.DeviceStorageMonitorService; -import java.io.PrintWriter; +import java.util.function.Predicate; /** * Simple controller that tracks the status of the device's storage. */ public final class StorageController extends StateController { - private static final String TAG = "JobScheduler.Stor"; - - private static final Object sCreationLock = new Object(); - private static volatile StorageController sController; + private static final String TAG = "JobScheduler.Storage"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); private final ArraySet<JobStatus> mTrackedTasks = new ArraySet<JobStatus>(); - private StorageTracker mStorageTracker; - - public static StorageController get(JobSchedulerService taskManagerService) { - synchronized (sCreationLock) { - if (sController == null) { - sController = new StorageController(taskManagerService, - taskManagerService.getContext(), taskManagerService.getLock()); - } - } - return sController; - } + private final StorageTracker mStorageTracker; @VisibleForTesting public StorageTracker getTracker() { return mStorageTracker; } - @VisibleForTesting - public static StorageController getForTesting(StateChangedListener stateChangedListener, - Context context) { - return new StorageController(stateChangedListener, context, new Object()); - } - - private StorageController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); + public StorageController(JobSchedulerService service) { + super(service); mStorageTracker = new StorageTracker(); mStorageTracker.startTracking(); } @@ -172,20 +155,18 @@ public final class StorageController extends StateController { } @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { - pw.print("Storage: not low = "); - pw.print(mStorageTracker.isStorageNotLow()); - pw.print(", seq="); - pw.println(mStorageTracker.getSeq()); - pw.print("Tracking "); - pw.print(mTrackedTasks.size()); - pw.println(":"); + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { + pw.println("Not low: " + mStorageTracker.isStorageNotLow()); + pw.println("Sequence: " + mStorageTracker.getSeq()); + pw.println(); + for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } - pw.print(" #"); + pw.print("#"); js.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, js.getSourceUid()); @@ -194,7 +175,8 @@ public final class StorageController extends StateController { } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.STORAGE); @@ -205,7 +187,7 @@ public final class StorageController extends StateController { for (int i = 0; i < mTrackedTasks.size(); i++) { final JobStatus js = mTrackedTasks.valueAt(i); - if (!js.shouldDump(filterUid)) { + if (!predicate.test(js)) { continue; } final long jsToken = proto.start(StateControllerProto.StorageController.TRACKED_JOBS); diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java index a91f5a46409c..fa48b5e974f6 100644 --- a/services/core/java/com/android/server/job/controllers/TimeController.java +++ b/services/core/java/com/android/server/job/controllers/TimeController.java @@ -25,19 +25,20 @@ import android.content.Context; import android.os.Process; import android.os.UserHandle; import android.os.WorkSource; +import android.util.Log; import android.util.Slog; import android.util.TimeUtils; import android.util.proto.ProtoOutputStream; +import com.android.internal.util.IndentingPrintWriter; import com.android.server.job.JobSchedulerService; -import com.android.server.job.StateChangedListener; import com.android.server.job.StateControllerProto; -import java.io.PrintWriter; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; +import java.util.function.Predicate; /** * This class sets an alarm for the next expiring job, and determines whether a job's minimum @@ -45,6 +46,8 @@ import java.util.ListIterator; */ public final class TimeController extends StateController { private static final String TAG = "JobScheduler.Time"; + private static final boolean DEBUG = JobSchedulerService.DEBUG + || Log.isLoggable(TAG, Log.DEBUG); /** Deadline alarm tag for logging purposes */ private final String DEADLINE_TAG = "*job.deadline*"; @@ -59,23 +62,13 @@ public final class TimeController extends StateController { private AlarmManager mAlarmService = null; /** List of tracked jobs, sorted asc. by deadline */ private final List<JobStatus> mTrackedJobs = new LinkedList<>(); - /** Singleton. */ - private static TimeController mSingleton; - public static synchronized TimeController get(JobSchedulerService jms) { - if (mSingleton == null) { - mSingleton = new TimeController(jms, jms.getContext(), jms.getLock()); - } - return mSingleton; - } - - private TimeController(StateChangedListener stateChangedListener, Context context, - Object lock) { - super(stateChangedListener, context, lock); + public TimeController(JobSchedulerService service) { + super(service); mNextJobExpiredElapsedMillis = Long.MAX_VALUE; mNextDelayExpiredElapsedMillis = Long.MAX_VALUE; - mChainedAttributionEnabled = WorkSource.isChainedBatteryAttributionEnabled(context); + mChainedAttributionEnabled = WorkSource.isChainedBatteryAttributionEnabled(mContext); } /** @@ -345,25 +338,24 @@ public final class TimeController extends StateController { }; @Override - public void dumpControllerStateLocked(PrintWriter pw, int filterUid) { + public void dumpControllerStateLocked(IndentingPrintWriter pw, + Predicate<JobStatus> predicate) { final long nowElapsed = sElapsedRealtimeClock.millis(); - pw.print("Alarms: now="); - pw.print(nowElapsed); - pw.println(); + pw.println("Elapsed clock: " + nowElapsed); + pw.print("Next delay alarm in "); TimeUtils.formatDuration(mNextDelayExpiredElapsedMillis, nowElapsed, pw); pw.println(); pw.print("Next deadline alarm in "); TimeUtils.formatDuration(mNextJobExpiredElapsedMillis, nowElapsed, pw); pw.println(); - pw.print("Tracking "); - pw.print(mTrackedJobs.size()); - pw.println(":"); + pw.println(); + for (JobStatus ts : mTrackedJobs) { - if (!ts.shouldDump(filterUid)) { + if (!predicate.test(ts)) { continue; } - pw.print(" #"); + pw.print("#"); ts.printUniqueId(pw); pw.print(" from "); UserHandle.formatUid(pw, ts.getSourceUid()); @@ -384,7 +376,8 @@ public final class TimeController extends StateController { } @Override - public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) { + public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, + Predicate<JobStatus> predicate) { final long token = proto.start(fieldId); final long mToken = proto.start(StateControllerProto.TIME); @@ -396,7 +389,7 @@ public final class TimeController extends StateController { mNextJobExpiredElapsedMillis - nowElapsed); for (JobStatus ts : mTrackedJobs) { - if (!ts.shouldDump(filterUid)) { + if (!predicate.test(ts)) { continue; } final long tsToken = proto.start(StateControllerProto.TimeController.TRACKED_JOBS); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 0dab528bb99d..5267f54b9cd5 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -1704,7 +1704,6 @@ public class GnssLocationProvider implements LocationProviderInterface { mStarted = false; mSingleShot = false; native_stop(); - mTimeToFirstFix = 0; mLastFixTime = 0; // reset SV count to zero diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 6deff3652944..9e00819d4eee 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -80,6 +80,7 @@ import android.security.keystore.KeyProperties; import android.security.keystore.KeyProtection; import android.security.keystore.UserNotAuthenticatedException; import android.security.keystore.recovery.KeyChainProtectionParams; +import android.security.keystore.recovery.RecoveryCertPath; import android.security.keystore.recovery.WrappedApplicationKey; import android.security.keystore.recovery.KeyChainSnapshot; import android.service.gatekeeper.GateKeeperResponse; @@ -2001,13 +2002,12 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override - public void setRecoveryStatus(@NonNull String packageName, @Nullable String[] aliases, - int status) throws RemoteException { - mRecoverableKeyStoreManager.setRecoveryStatus(packageName, aliases, status); + public void setRecoveryStatus(String alias, int status) throws RemoteException { + mRecoverableKeyStoreManager.setRecoveryStatus(alias, status); } - public Map getRecoveryStatus(@Nullable String packageName) throws RemoteException { - return mRecoverableKeyStoreManager.getRecoveryStatus(packageName); + public Map getRecoveryStatus() throws RemoteException { + return mRecoverableKeyStoreManager.getRecoveryStatus(); } @Override @@ -2042,6 +2042,15 @@ public class LockSettingsService extends ILockSettings.Stub { vaultParams, vaultChallenge, secrets); } + @Override + public byte[] startRecoverySessionWithCertPath(@NonNull String sessionId, + @NonNull RecoveryCertPath verifierCertPath, @NonNull byte[] vaultParams, + @NonNull byte[] vaultChallenge, @NonNull List<KeyChainProtectionParams> secrets) + throws RemoteException { + return mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + sessionId, verifierCertPath, vaultParams, vaultChallenge, secrets); + } + public void closeSession(@NonNull String sessionId) throws RemoteException { mRecoverableKeyStoreManager.closeSession(sessionId); } @@ -2065,8 +2074,8 @@ public class LockSettingsService extends ILockSettings.Stub { } @Override - public String generateKey(@NonNull String alias, byte[] account) throws RemoteException { - return mRecoverableKeyStoreManager.generateKey(alias, account); + public String generateKey(@NonNull String alias) throws RemoteException { + return mRecoverableKeyStoreManager.generateKey(alias); } @Override diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java index dee24c7c0450..8efce8602e78 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java @@ -289,6 +289,7 @@ public class KeySyncTask implements Runnable { .setMaxAttempts(TRUSTED_HARDWARE_MAX_ATTEMPTS) .setCounterId(counterId) .setTrustedHardwarePublicKey(SecureBox.encodePublicKey(publicKey)) + .setTrustedHardwareCertPath(certPath) .setServerParams(vaultHandle) .setKeyChainProtectionParams(metadataList) .setWrappedApplicationKeys(createApplicationKeyEntries(encryptedApplicationKeys)) diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java index 89e2debec9d2..a7d32ed268cd 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java @@ -273,12 +273,16 @@ public class KeySyncUtils { * * @param key The bytes of the key. * @return The key. - * @throws NoSuchAlgorithmException if the public key algorithm is unavailable. * @throws InvalidKeySpecException if the bytes of the key are not a valid key. */ - public static PublicKey deserializePublicKey(byte[] key) - throws NoSuchAlgorithmException, InvalidKeySpecException { - KeyFactory keyFactory = KeyFactory.getInstance(PUBLIC_KEY_FACTORY_ALGORITHM); + public static PublicKey deserializePublicKey(byte[] key) throws InvalidKeySpecException { + KeyFactory keyFactory; + try { + keyFactory = KeyFactory.getInstance(PUBLIC_KEY_FACTORY_ALGORITHM); + } catch (NoSuchAlgorithmException e) { + // Should not happen + throw new RuntimeException(e); + } X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(key); return keyFactory.generatePublic(publicKeySpec); } diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java index 54607564f25e..22e99c43f950 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java @@ -34,6 +34,7 @@ import android.os.ServiceSpecificException; import android.os.UserHandle; import android.security.keystore.recovery.KeyChainProtectionParams; import android.security.keystore.recovery.KeyChainSnapshot; +import android.security.keystore.recovery.RecoveryCertPath; import android.security.keystore.recovery.RecoveryController; import android.security.keystore.recovery.WrappedApplicationKey; import android.security.KeyStore; @@ -57,7 +58,10 @@ import java.security.NoSuchAlgorithmException; import java.security.PublicKey; import java.security.UnrecoverableKeyException; import java.security.cert.CertPath; +import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; @@ -277,42 +281,22 @@ public class RecoverableKeyStoreManager { } /** - * Updates recovery status for the application given its {@code packageName}. - * - * @param packageName which recoverable key statuses will be returned - * @param aliases - KeyStore aliases or {@code null} for all aliases of the app - * @param status - new status + * Sets the recovery status of key with {@code alias} to {@code status}. */ - public void setRecoveryStatus( - @NonNull String packageName, @Nullable String[] aliases, int status) - throws RemoteException { + public void setRecoveryStatus(String alias, int status) throws RemoteException { checkRecoverKeyStorePermission(); - int uid = Binder.getCallingUid(); - if (packageName != null) { - // TODO: get uid for package name, when many apps are supported. - } - if (aliases == null) { - // Get all keys for the app. - Map<String, Integer> allKeys = mDatabase.getStatusForAllKeys(uid); - aliases = new String[allKeys.size()]; - allKeys.keySet().toArray(aliases); - } - for (String alias: aliases) { - mDatabase.setRecoveryStatus(uid, alias, status); - } + mDatabase.setRecoveryStatus(Binder.getCallingUid(), alias, status); } /** - * Gets recovery status for caller or other application {@code packageName}. - * @param packageName which recoverable keys statuses will be returned. + * Returns recovery statuses for all keys belonging to the calling uid. * - * @return {@code Map} from KeyStore alias to recovery status. + * @return {@link Map} from key alias to recovery status. Recovery status is one of + * {@link RecoveryController#RECOVERY_STATUS_SYNCED}, + * {@link RecoveryController#RECOVERY_STATUS_SYNC_IN_PROGRESS} or + * {@link RecoveryController#RECOVERY_STATUS_PERMANENT_FAILURE}. */ - public @NonNull Map<String, Integer> getRecoveryStatus(@Nullable String packageName) - throws RemoteException { - // Any application should be able to check status for its own keys. - // If caller is a recovery agent it can check statuses for other packages, but - // only for recoverable keys it manages. + public @NonNull Map<String, Integer> getRecoveryStatus() throws RemoteException { return mDatabase.getStatusForAllKeys(Binder.getCallingUid()); } @@ -369,7 +353,7 @@ public class RecoverableKeyStoreManager { } /** - * Initializes recovery session. + * Initializes recovery session given the X509-encoded public key of the recovery service. * * @param sessionId A unique ID to identify the recovery session. * @param verifierPublicKey X509-encoded public key. @@ -377,6 +361,8 @@ public class RecoverableKeyStoreManager { * @param vaultChallenge Challenge issued by vault service. * @param secrets Lock-screen hashes. For now only a single secret is supported. * @return Encrypted bytes of recovery claim. This can then be issued to the vault service. + * @deprecated Use {@link #startRecoverySessionWithCertPath(String, RecoveryCertPath, byte[], + * byte[], List)} instead. * * @hide */ @@ -398,11 +384,9 @@ public class RecoverableKeyStoreManager { PublicKey publicKey; try { publicKey = KeySyncUtils.deserializePublicKey(verifierPublicKey); - } catch (NoSuchAlgorithmException e) { - // Should never happen - throw new RuntimeException(e); } catch (InvalidKeySpecException e) { - throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, "Not a valid X509 key"); + throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, + "Not a valid X509 key"); } // The raw public key bytes contained in vaultParams must match the ones given in // verifierPublicKey; otherwise, the user secret may be decrypted by a key that is not owned @@ -435,6 +419,52 @@ public class RecoverableKeyStoreManager { } /** + * Initializes recovery session given the certificate path of the recovery service. + * + * @param sessionId A unique ID to identify the recovery session. + * @param verifierCertPath The certificate path of the recovery service. + * @param vaultParams Additional params associated with vault. + * @param vaultChallenge Challenge issued by vault service. + * @param secrets Lock-screen hashes. For now only a single secret is supported. + * @return Encrypted bytes of recovery claim. This can then be issued to the vault service. + * + * @hide + */ + public @NonNull byte[] startRecoverySessionWithCertPath( + @NonNull String sessionId, + @NonNull RecoveryCertPath verifierCertPath, + @NonNull byte[] vaultParams, + @NonNull byte[] vaultChallenge, + @NonNull List<KeyChainProtectionParams> secrets) + throws RemoteException { + checkRecoverKeyStorePermission(); + + CertPath certPath; + try { + certPath = verifierCertPath.getCertPath(); + } catch (CertificateException e) { + throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, + "Failed decode the certificate path"); + } + + // TODO: Validate the cert path according to the root of trust + + if (certPath.getCertificates().isEmpty()) { + throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, + "The given CertPath is empty"); + } + byte[] verifierPublicKey = certPath.getCertificates().get(0).getPublicKey().getEncoded(); + if (verifierPublicKey == null) { + Log.e(TAG, "Failed to encode verifierPublicKey"); + throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, + "Failed to encode verifierPublicKey"); + } + + return startRecoverySession( + sessionId, verifierPublicKey, vaultParams, vaultChallenge, secrets); + } + + /** * Invoked by a recovery agent after a successful recovery claim is sent to the remote vault * service. * @@ -526,7 +556,7 @@ public class RecoverableKeyStoreManager { * * @return grant alias, which caller can use to access the key. */ - public String generateKey(@NonNull String alias, byte[] account) throws RemoteException { + public String generateKey(@NonNull String alias) throws RemoteException { int uid = Binder.getCallingUid(); int userId = UserHandle.getCallingUserId(); @@ -546,8 +576,7 @@ public class RecoverableKeyStoreManager { byte[] secretKey = mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias); mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey); - String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias); - return grantAlias; + return mApplicationKeyStorage.getGrantAlias(userId, uid, alias); } catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) { throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage()); } diff --git a/services/core/java/com/android/server/media/MediaSession2Record.java b/services/core/java/com/android/server/media/MediaSession2Record.java deleted file mode 100644 index 97c7bf6ced50..000000000000 --- a/services/core/java/com/android/server/media/MediaSession2Record.java +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 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 com.android.server.media; - -import android.annotation.NonNull; -import android.content.Context; -import android.media.MediaController2; -import android.media.MediaSession2; -import android.media.SessionToken2; -import android.util.Log; -import java.util.concurrent.Executor; - -/** - * Records a {@link MediaSession2} and holds {@link MediaController2}. - * <p> - * Owner of this object should handle synchronization. - */ -class MediaSession2Record { - interface SessionDestroyedListener { - void onSessionDestroyed(MediaSession2Record record); - } - - private static final String TAG = "Session2Record"; - private static final boolean DEBUG = true; // TODO(jaewan): Change - - private final Context mContext; - private final SessionToken2 mSessionToken; - private final SessionDestroyedListener mSessionDestroyedListener; - - // TODO(jaewan): Replace these with the mContext.getMainExecutor() - private final Executor mMainExecutor; - - private MediaController2 mController; - - /** - * Constructor - */ - public MediaSession2Record(@NonNull Context context, @NonNull SessionToken2 token, - @NonNull SessionDestroyedListener listener) { - mContext = context; - mSessionToken = token; - mSessionDestroyedListener = listener; - mMainExecutor = (runnable) -> runnable.run(); - } - - public Context getContext() { - return mContext; - } - - public void onSessionDestroyed() { - if (mController != null) { - mController.close(); - // close() triggers ControllerCallback.onDisconnected() here already. - mController = null; - } - } - - public boolean onSessionCreated(SessionToken2 token) { - if (mController != null) { - // Disclaimer: This may fail if following happens for an app. - // Step 1) Create a session in the process #1 - // Step 2) Process #1 is killed - // Step 3) Before the death of process #1 is delivered, - // (i.e. ControllerCallback#onDisconnected is called), - // new process is started and create another session with the same - // id in the new process. - // Step 4) fail!!! But this is tricky case that wouldn't happen in normal. - Log.w(TAG, "Cannot create a new session with the id=" + token.getId() + " in the" - + " pkg=" + token.getPackageName() + ". ID should be unique in a package"); - return false; - } - mController = new MediaController2(mContext, token, mMainExecutor, - new ControllerCallback()); - return true; - } - - /** - * @return token - */ - public SessionToken2 getToken() { - return mSessionToken; - } - - /** - * @return controller - */ - public MediaController2 getController() { - return mController; - } - - @Override - public String toString() { - return getToken() == null - ? "Token {null}" : "SessionRecord {" + getToken().toString() + "}"; - } - - private class ControllerCallback extends MediaController2.ControllerCallback { - // This is called on the random thread with no lock. So place ensure followings. - // 1. Don't touch anything in the parent class that needs synchronization. - // All other APIs in the MediaSession2Record assumes that server would use them with - // the lock hold. - // 2. This can be called after the controller registered is closed. - @Override - public void onDisconnected() { - if (DEBUG) { - Log.d(TAG, "onDisconnected, token=" + getToken()); - } - mSessionDestroyedListener.onSessionDestroyed(MediaSession2Record.this); - } - }; -} diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index 21d86c452a8e..b110e881bcbe 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -42,6 +42,7 @@ import android.media.AudioSystem; import android.media.IAudioService; import android.media.IRemoteVolumeController; import android.media.ISessionTokensListener; +import android.media.MediaController2; import android.media.MediaLibraryService2; import android.media.MediaSessionService2; import android.media.SessionToken2; @@ -70,6 +71,7 @@ import android.os.UserManager; import android.provider.Settings; import android.speech.RecognizerIntent; import android.text.TextUtils; +import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.util.SparseArray; @@ -86,7 +88,10 @@ import com.android.server.Watchdog.Monitor; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; /** * System implementation of MediaSessionManager @@ -132,14 +137,7 @@ public class MediaSessionService extends SystemService implements Monitor { // MediaSession2 support // TODO(jaewan): Support multi-user and managed profile. // TODO(jaewan): Make it priority list for handling volume/media key. - private final List<MediaSession2Record> mSessions = new ArrayList<>(); - - private final MediaSession2Record.SessionDestroyedListener mSessionDestroyedListener = - (record) -> { - synchronized (mLock) { - destroySessionLocked(record); - } - }; + private final Map<SessionToken2, MediaController2> mSessionRecords = new ArrayMap<>(); public MediaSessionService(Context context) { super(context); @@ -523,12 +521,13 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { // List to keep the session services that need be removed because they don't exist // in the 'services' above. - List<MediaSession2Record> removeCandidates = new ArrayList<>(); - for (int i = 0; i < mSessions.size(); i++) { - if (mSessions.get(i).getToken().getType() != TYPE_SESSION) { - removeCandidates.add(mSessions.get(i)); + Set<SessionToken2> sessionTokensToRemove = new HashSet<>(); + for (SessionToken2 token : mSessionRecords.keySet()) { + if (token.getType() != TYPE_SESSION) { + sessionTokensToRemove.add(token); } } + for (int i = 0; i < services.size(); i++) { if (services.get(i) == null || services.get(i).serviceInfo == null) { continue; @@ -550,57 +549,25 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "Invalid session service", e); continue; } - boolean found = false; - for (int j = 0; j < mSessions.size(); j++) { - if (token.equals(mSessions.get(j).getToken())) { - // If the token already exists, keep it in the mSessions. - removeCandidates.remove(mSessions.get(j)); - found = true; - break; - } - } - if (!found) { + // If the token already exists, keep it in the mSessions by removing from + // sessionTokensToRemove. + if (!sessionTokensToRemove.remove(token)) { // New session service is found. - MediaSession2Record record = new MediaSession2Record(getContext(), - token, mSessionDestroyedListener); - mSessions.add(record); + mSessionRecords.put(token, null); } } - for (int i = 0; i < removeCandidates.size(); i++) { - removeCandidates.get(i).onSessionDestroyed(); - mSessions.remove(removeCandidates.get(i)); + for (SessionToken2 token : sessionTokensToRemove) { + mSessionRecords.remove(token); } - removeCandidates.clear(); } if (DEBUG) { - Log.d(TAG, "Found " + mSessions.size() + " session services"); - for (int i = 0; i < mSessions.size(); i++) { - Log.d(TAG, " " + mSessions.get(i).getToken()); + Log.d(TAG, "Found " + mSessionRecords.size() + " session services"); + for (SessionToken2 token : mSessionRecords.keySet()) { + Log.d(TAG, " " + token); } } } - private MediaSession2Record getSessionRecordLocked(int uid, String packageName, String id) { - for (int i = 0; i < mSessions.size(); i++) { - SessionToken2 token = mSessions.get(i).getToken(); - if (token.getUid() == uid && token.getPackageName().equals(packageName) - && token.getId().equals(id)) { - return mSessions.get(i); - } - } - return null; - } - - private void destroySessionLocked(MediaSession2Record record) { - if (DEBUG) { - Log.d(TAG, record.toString() + " becomes inactive"); - } - record.onSessionDestroyed(); - if (record.getToken().getType() == TYPE_SESSION) { - mSessions.remove(record); - } - } - private void enforcePackageName(String packageName, int uid) { if (TextUtils.isEmpty(packageName)) { throw new IllegalArgumentException("packageName may not be empty"); @@ -811,6 +778,16 @@ public class MediaSessionService extends SystemService implements Monitor { return mUserRecords.get(fullUserId); } + void destroySession2Internal(SessionToken2 token) { + synchronized (mLock) { + if (token.getType() == SessionToken2.TYPE_SESSION) { + mSessionRecords.remove(token); + } else { + mSessionRecords.put(token, null); + } + } + } + /** * Information about a full user and its corresponding managed profiles. * @@ -1502,66 +1479,75 @@ public class MediaSessionService extends SystemService implements Monitor { // TODO(jaewan): Remove this debug command before ship. if (args != null && args.length > 0 && "--purge".equals(args[0])) { - mSessions.clear(); + mSessionRecords.clear(); } pw.println(); - pw.println("Session2: size=" + mSessions.size()); - for (int i = 0; i < mSessions.size(); i++) { - pw.println(" " + mSessions.get(i)); + pw.println("Session2: size=" + mSessionRecords.size()); + for (SessionToken2 token : mSessionRecords.keySet()) { + pw.println(" " + token); } } } + /** + * Called when a {@link android.media.MediaSession2} instance is created. + * <p> + * This does two things. + * 1. Keep the newly created session in the service + * 2. Do sanity check to ensure unique id per package, and return result + * + * @param sessionToken SessionToken2 object in bundled form + * @return {@code true} if the session's id isn't used by the package now. {@code false} + * otherwise. + */ @Override - public boolean onSessionCreated(Bundle sessionToken) { + public boolean createSession2(Bundle sessionToken) { final int uid = Binder.getCallingUid(); - final int pid = Binder.getCallingPid(); final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken); if (token == null || token.getUid() != uid) { Log.w(TAG, "onSessionCreated failed, expected caller uid=" + token.getUid() + " but from uid=" + uid); } if (DEBUG) { - Log.d(TAG, "onSessionCreated " + token); + Log.d(TAG, "createSession2: " + token); } synchronized (mLock) { - MediaSession2Record record = getSessionRecordLocked( - uid, token.getPackageName(), token.getId()); - if (record != null) { - return record.onSessionCreated(token); - } else { - record = new MediaSession2Record( - getContext(), token, mSessionDestroyedListener); - mSessions.add(record); - return record.onSessionCreated(token); + MediaController2 controller = mSessionRecords.get(token); + if (controller != null && controller.isConnected()) { + return false; } + Context context = getContext(); + mSessionRecords.put(token, new MediaController2(context, token, + context.getMainExecutor(), new ControllerCallback(token))); + return true; } } + /** + * Called when a {@link android.media.MediaSession2} instance is closed. (i.e. destroyed) + * <p> + * Ideally service should know that a session is destroyed through the + * {@link android.media.MediaController2.ControllerCallback#onDisconnected()}, which is + * asynchronous call. However, we also need synchronous way together to address timing + * issue. If the package recreates the session almost immediately, which happens commonly + * for tests, service will reject the creation through {@link #onSessionCreated(Bundle)} + * if the service hasn't notified previous destroy yet. This synchronous API will address + * the issue. + * + * @param sessionToken SessionToken2 object in bundled form + */ @Override - public void onSessionDestroyed(Bundle sessionToken) { + public void destroySession2(Bundle sessionToken) { final int uid = Binder.getCallingUid(); - final int pid = Binder.getCallingPid(); final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken); if (token == null || token.getUid() != uid) { Log.w(TAG, "onSessionDestroyed failed, expected caller uid=" + token.getUid() + " but from uid=" + uid); } if (DEBUG) { - Log.d(TAG, "onSessionDestroyed " + token); - } - synchronized (mLock) { - MediaSession2Record record = getSessionRecordLocked( - uid, token.getPackageName(), token.getId()); - if (record != null) { - record.onSessionDestroyed(); - } else { - if (DEBUG) { - Log.d(TAG, "Cannot find a session record to destroy. uid=" + uid - + ", pkg=" + token.getPackageName() + ", id=" + token.getId()); - } - } + Log.d(TAG, "destroySession2 " + token); } + destroySession2Internal(token); } // TODO(jaewan): Protect this API with permission @@ -1570,19 +1556,15 @@ public class MediaSessionService extends SystemService implements Monitor { boolean sessionServiceOnly) throws RemoteException { List<Bundle> tokens = new ArrayList<>(); synchronized (mLock) { - for (int i = 0; i < mSessions.size(); i++) { - MediaSession2Record record = mSessions.get(i); - boolean isSessionService = (record.getToken().getType() != TYPE_SESSION); - boolean isActive = record.getController() != null; - if ((!activeSessionOnly && isSessionService) - || (!sessionServiceOnly && isActive)) { - SessionToken2 token = record.getToken(); - if (token != null) { - tokens.add(token.toBundle()); - } else { - Log.wtf(TAG, "Null token for record=" + record); - } + for (Map.Entry<SessionToken2, MediaController2> record + : mSessionRecords.entrySet()) { + boolean isSessionService = (record.getKey().getType() != TYPE_SESSION); + boolean isActive = record.getValue() != null; + if ((activeSessionOnly && !isActive) + || (sessionServiceOnly && !isSessionService) ){ + continue; } + tokens.add(record.getKey().toBundle()); } } return tokens; @@ -1994,4 +1976,18 @@ public class MediaSessionService extends SystemService implements Monitor { obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget(); } } + + private class ControllerCallback extends MediaController2.ControllerCallback { + + private final SessionToken2 mToken; + + ControllerCallback(SessionToken2 token) { + mToken = token; + } + + @Override + public void onDisconnected() { + destroySession2Internal(mToken); + } + }; } diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index bd9ec55abc04..ab555532a102 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -28,6 +28,11 @@ import static android.content.Intent.ACTION_UID_REMOVED; import static android.content.Intent.ACTION_USER_ADDED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.Intent.EXTRA_UID; +import static android.content.pm.PackageManager.MATCH_ANY_USER; +import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; +import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; +import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS; +import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES; import static android.net.ConnectivityManager.CONNECTIVITY_ACTION; import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED; import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; @@ -61,9 +66,7 @@ import static android.net.NetworkPolicyManager.isProcStateAllowedWhileOnRestrict import static android.net.NetworkPolicyManager.resolveNetworkId; import static android.net.NetworkPolicyManager.uidPoliciesToString; import static android.net.NetworkPolicyManager.uidRulesToString; -import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER; -import static android.net.NetworkTemplate.MATCH_MOBILE_4G; -import static android.net.NetworkTemplate.MATCH_MOBILE_ALL; +import static android.net.NetworkTemplate.MATCH_MOBILE; import static android.net.NetworkTemplate.MATCH_WIFI; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.TrafficStats.MB_IN_BYTES; @@ -71,7 +74,6 @@ import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANG import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED; import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT; import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID; -import static android.text.format.DateUtils.DAY_IN_MILLIS; import static com.android.internal.util.ArrayUtils.appendInt; import static com.android.internal.util.Preconditions.checkNotNull; @@ -139,15 +141,16 @@ import android.net.NetworkQuotaInfo; import android.net.NetworkRequest; import android.net.NetworkSpecifier; import android.net.NetworkState; +import android.net.NetworkStats; import android.net.NetworkTemplate; import android.net.StringNetworkSpecifier; import android.net.TrafficStats; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; +import android.os.BestClock; import android.os.Binder; import android.os.Build; import android.os.Environment; -import android.os.BestClock; import android.os.Handler; import android.os.HandlerThread; import android.os.IDeviceIdleController; @@ -359,7 +362,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private final Context mContext; private final IActivityManager mActivityManager; - private final INetworkStatsService mNetworkStats; + private NetworkStatsManagerInternal mNetworkStats; private final INetworkManagementService mNetworkManager; private UsageStatsManagerInternal mUsageStats; private final Clock mClock; @@ -516,10 +519,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // TODO: migrate notifications to SystemUI public NetworkPolicyManagerService(Context context, IActivityManager activityManager, - INetworkStatsService networkStats, INetworkManagementService networkManagement) { - this(context, activityManager, networkStats, networkManagement, - AppGlobals.getPackageManager(), getDefaultClock(), getDefaultSystemDir(), - false); + INetworkManagementService networkManagement) { + this(context, activityManager, networkManagement, AppGlobals.getPackageManager(), + getDefaultClock(), getDefaultSystemDir(), false); } private static @NonNull File getDefaultSystemDir() { @@ -532,11 +534,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } public NetworkPolicyManagerService(Context context, IActivityManager activityManager, - INetworkStatsService networkStats, INetworkManagementService networkManagement, - IPackageManager pm, Clock clock, File systemDir, boolean suppressDefaultPolicy) { + INetworkManagementService networkManagement, IPackageManager pm, Clock clock, + File systemDir, boolean suppressDefaultPolicy) { mContext = checkNotNull(context, "missing context"); mActivityManager = checkNotNull(activityManager, "missing activityManager"); - mNetworkStats = checkNotNull(networkStats, "missing networkStats"); mNetworkManager = checkNotNull(networkManagement, "missing networkManagement"); mDeviceIdleController = IDeviceIdleController.Stub.asInterface(ServiceManager.getService( Context.DEVICE_IDLE_CONTROLLER)); @@ -660,6 +661,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class); + mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class); synchronized (mUidRulesFirstLock) { synchronized (mNetworkPoliciesSecondLock) { @@ -1063,9 +1065,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { if (policy.isOverLimit(totalBytes)) { final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart; if (snoozedThisCycle) { - enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes); + enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null); } else { - enqueueNotification(policy, TYPE_LIMIT, totalBytes); + enqueueNotification(policy, TYPE_LIMIT, totalBytes, null); notifyOverLimitNL(policy.template); } @@ -1074,7 +1076,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart; if (policy.isOverWarning(totalBytes) && !snoozedThisCycle) { - enqueueNotification(policy, TYPE_WARNING, totalBytes); + enqueueNotification(policy, TYPE_WARNING, totalBytes, null); } } @@ -1082,7 +1084,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // far past the plan limits. if (policy.limitBytes != LIMIT_DISABLED) { final long recentDuration = TimeUnit.DAYS.toMillis(4); - final long recentBytes = getTotalBytes(policy.template, now - recentDuration, now); + final long recentStart = now - recentDuration; + final long recentEnd = now; + final long recentBytes = getTotalBytes(policy.template, recentStart, recentEnd); final long cycleDuration = cycleEnd - cycleStart; final long projectedBytes = (recentBytes * cycleDuration) / recentDuration; @@ -1096,7 +1100,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final boolean snoozedRecently = policy.lastRapidSnooze >= now - DateUtils.DAY_IN_MILLIS; if (projectedBytes > alertBytes && !snoozedRecently) { - enqueueNotification(policy, TYPE_RAPID, 0); + enqueueNotification(policy, TYPE_RAPID, 0, + findRapidBlame(policy.template, recentStart, recentEnd)); } } } @@ -1111,6 +1116,45 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } /** + * Attempt to find a specific app to blame for rapid data usage during the + * given time period. + */ + private @Nullable ApplicationInfo findRapidBlame(NetworkTemplate template, + long start, long end) { + long totalBytes = 0; + long maxBytes = 0; + int maxUid = 0; + + final NetworkStats stats = getNetworkUidBytes(template, start, end); + NetworkStats.Entry entry = null; + for (int i = 0; i < stats.size(); i++) { + entry = stats.getValues(i, entry); + final long bytes = entry.rxBytes + entry.txBytes; + totalBytes += bytes; + if (bytes > maxBytes) { + maxBytes = bytes; + maxUid = entry.uid; + } + } + + // Only point blame if the majority of usage was done by a single app. + // TODO: support shared UIDs + if (maxBytes > 0 && maxBytes > totalBytes / 2) { + final String[] packageNames = mContext.getPackageManager().getPackagesForUid(maxUid); + if (packageNames.length == 1) { + try { + return mContext.getPackageManager().getApplicationInfo(packageNames[0], + MATCH_ANY_USER | MATCH_DISABLED_COMPONENTS | MATCH_DIRECT_BOOT_AWARE + | MATCH_DIRECT_BOOT_UNAWARE | MATCH_UNINSTALLED_PACKAGES); + } catch (NameNotFoundException ignored) { + } + } + } + + return null; + } + + /** * Test if given {@link NetworkTemplate} is relevant to user based on * current device state, such as when * {@link TelephonyManager#getSubscriberId()} matches. This is regardless of @@ -1157,7 +1201,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { * Show notification for combined {@link NetworkPolicy} and specific type, * like {@link #TYPE_LIMIT}. Okay to call multiple times. */ - private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes) { + private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes, + ApplicationInfo rapidBlame) { final NotificationId notificationId = new NotificationId(policy, type); final Notification.Builder builder = new Notification.Builder(mContext, SystemNotificationChannels.NETWORK_ALERTS); @@ -1167,16 +1212,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { com.android.internal.R.color.system_notification_accent_color)); final Resources res = mContext.getResources(); - CharSequence body = null; + final CharSequence title; + final CharSequence body; switch (type) { case TYPE_WARNING: { - final CharSequence title = res.getText(R.string.data_usage_warning_title); - body = res.getString(R.string.data_usage_warning_body); + title = res.getText(R.string.data_usage_warning_title); + body = res.getString(R.string.data_usage_warning_body, + Formatter.formatFileSize(mContext, totalBytes)); builder.setSmallIcon(R.drawable.stat_notify_error); - builder.setTicker(title); - builder.setContentTitle(title); - builder.setContentText(body); final Intent snoozeIntent = buildSnoozeWarningIntent(policy.template); builder.setDeleteIntent(PendingIntent.getBroadcast( @@ -1189,34 +1233,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { break; } case TYPE_LIMIT: { - body = res.getText(R.string.data_usage_limit_body); - - final CharSequence title; - int icon = R.drawable.stat_notify_disabled_data; switch (policy.template.getMatchRule()) { - case MATCH_MOBILE_3G_LOWER: - title = res.getText(R.string.data_usage_3g_limit_title); - break; - case MATCH_MOBILE_4G: - title = res.getText(R.string.data_usage_4g_limit_title); - break; - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: title = res.getText(R.string.data_usage_mobile_limit_title); break; case MATCH_WIFI: title = res.getText(R.string.data_usage_wifi_limit_title); - icon = R.drawable.stat_notify_error; break; default: - title = null; - break; + return; } + body = res.getText(R.string.data_usage_limit_body); builder.setOngoing(true); - builder.setSmallIcon(icon); - builder.setTicker(title); - builder.setContentTitle(title); - builder.setContentText(body); + builder.setSmallIcon(R.drawable.stat_notify_disabled_data); final Intent intent = buildNetworkOverLimitIntent(res, policy.template); builder.setContentIntent(PendingIntent.getActivity( @@ -1224,34 +1254,22 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { break; } case TYPE_LIMIT_SNOOZED: { - final long overBytes = totalBytes - policy.limitBytes; - body = res.getString(R.string.data_usage_limit_snoozed_body, - Formatter.formatFileSize(mContext, overBytes)); - - final CharSequence title; switch (policy.template.getMatchRule()) { - case MATCH_MOBILE_3G_LOWER: - title = res.getText(R.string.data_usage_3g_limit_snoozed_title); - break; - case MATCH_MOBILE_4G: - title = res.getText(R.string.data_usage_4g_limit_snoozed_title); - break; - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: title = res.getText(R.string.data_usage_mobile_limit_snoozed_title); break; case MATCH_WIFI: title = res.getText(R.string.data_usage_wifi_limit_snoozed_title); break; default: - title = null; - break; + return; } + final long overBytes = totalBytes - policy.limitBytes; + body = res.getString(R.string.data_usage_limit_snoozed_body, + Formatter.formatFileSize(mContext, overBytes)); builder.setOngoing(true); builder.setSmallIcon(R.drawable.stat_notify_error); - builder.setTicker(title); - builder.setContentTitle(title); - builder.setContentText(body); builder.setChannelId(SystemNotificationChannels.NETWORK_STATUS); final Intent intent = buildViewDataUsageIntent(res, policy.template); @@ -1260,13 +1278,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { break; } case TYPE_RAPID: { - final CharSequence title = res.getText(R.string.data_usage_rapid_title); - body = res.getText(R.string.data_usage_rapid_body); + title = res.getText(R.string.data_usage_rapid_title); + if (rapidBlame != null) { + body = res.getString(R.string.data_usage_rapid_app_body, + rapidBlame.loadLabel(mContext.getPackageManager())); + } else { + body = res.getString(R.string.data_usage_rapid_body); + } builder.setSmallIcon(R.drawable.stat_notify_error); - builder.setTicker(title); - builder.setContentTitle(title); - builder.setContentText(body); final Intent snoozeIntent = buildSnoozeRapidIntent(policy.template); builder.setDeleteIntent(PendingIntent.getBroadcast( @@ -1277,11 +1297,15 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mContext, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT)); break; } + default: { + return; + } } - if (!TextUtils.isEmpty(body)) { - builder.setStyle(new Notification.BigTextStyle().bigText(body)); - } + builder.setTicker(title); + builder.setContentTitle(title); + builder.setContentText(body); + builder.setStyle(new Notification.BigTextStyle().bigText(body)); mContext.getSystemService(NotificationManager.class).notifyAsUser(notificationId.getTag(), notificationId.getId(), builder.build(), UserHandle.ALL); @@ -1537,7 +1561,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // TODO: reach into ConnectivityManager to proactively disable bringing // up this network, since we know that traffic will be blocked. - if (template.getMatchRule() == MATCH_MOBILE_ALL) { + if (template.getMatchRule() == MATCH_MOBILE) { // If mobile data usage hits the limit or if the user resumes the data, we need to // notify telephony. final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class); @@ -1954,9 +1978,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { metered = readBooleanAttribute(in, ATTR_METERED); } else { switch (networkTemplate) { - case MATCH_MOBILE_3G_LOWER: - case MATCH_MOBILE_4G: - case MATCH_MOBILE_ALL: + case MATCH_MOBILE: metered = true; break; default: @@ -3243,8 +3265,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } try { mNetworkStats.setUidForeground(uid, uidForeground); - } catch (RemoteException e) { - // ignored; service lives in system_server } finally { Trace.traceEnd(Trace.TRACE_TAG_NETWORK); } @@ -3927,7 +3947,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { extends UsageStatsManagerInternal.AppIdleStateChangeListener { @Override - public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) { + public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket, + int reason) { try { final int uid = mContext.getPackageManager().getPackageUidAsUser(packageName, PackageManager.MATCH_UNINSTALLED_PACKAGES, userId); @@ -4028,13 +4049,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { synchronized (mNetworkPoliciesSecondLock) { if (mMeteredIfaces.contains(iface)) { - try { - // force stats update to make sure we have - // numbers that caused alert to trigger. - mNetworkStats.forceUpdate(); - } catch (RemoteException e) { - // ignored; service lives in system_server - } + // force stats update to make sure we have + // numbers that caused alert to trigger. + mNetworkStats.forceUpdate(); updateNetworkEnabledNL(); updateNotificationsNL(); @@ -4075,14 +4092,10 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } case MSG_ADVISE_PERSIST_THRESHOLD: { final long lowestRule = (Long) msg.obj; - try { - // make sure stats are recorded frequently enough; we aim - // for 2MB threshold for 2GB/month rules. - final long persistThreshold = lowestRule / 1000; - mNetworkStats.advisePersistThreshold(persistThreshold); - } catch (RemoteException e) { - // ignored; service lives in system_server - } + // make sure stats are recorded frequently enough; we aim + // for 2MB threshold for 2GB/month rules. + final long persistThreshold = lowestRule / 1000; + mNetworkStats.advisePersistThreshold(persistThreshold); return true; } case MSG_UPDATE_INTERFACE_QUOTA: { @@ -4366,18 +4379,29 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } + @Deprecated private long getTotalBytes(NetworkTemplate template, long start, long end) { + return getNetworkTotalBytes(template, start, end); + } + + private long getNetworkTotalBytes(NetworkTemplate template, long start, long end) { try { return mNetworkStats.getNetworkTotalBytes(template, start, end); } catch (RuntimeException e) { - Slog.w(TAG, "problem reading network stats: " + e); - return 0; - } catch (RemoteException e) { - // ignored; service lives in system_server + Slog.w(TAG, "Failed to read network stats: " + e); return 0; } } + private NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) { + try { + return mNetworkStats.getNetworkUidBytes(template, start, end); + } catch (RuntimeException e) { + Slog.w(TAG, "Failed to read network stats: " + e); + return new NetworkStats(SystemClock.elapsedRealtime(), 0); + } + } + private boolean isBandwidthControlEnabled() { final long token = Binder.clearCallingIdentity(); try { diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java index 3cc4d83267cf..a5f8dc72d87c 100644 --- a/services/core/java/com/android/server/net/NetworkStatsCollection.java +++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java @@ -106,6 +106,10 @@ public class NetworkStatsCollection implements FileRotator.Reader { reset(); } + public void clear() { + reset(); + } + public void reset() { mStats.clear(); mStartMillis = Long.MAX_VALUE; diff --git a/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java new file mode 100644 index 000000000000..4843ede7219d --- /dev/null +++ b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java @@ -0,0 +1,37 @@ +/* + * 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 com.android.server.net; + +import android.net.NetworkStats; +import android.net.NetworkTemplate; + +public abstract class NetworkStatsManagerInternal { + /** Return network layer usage total for traffic that matches template. */ + public abstract long getNetworkTotalBytes(NetworkTemplate template, long start, long end); + + /** Return network layer usage per-UID for traffic that matches template. */ + public abstract NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end); + + /** Mark given UID as being in foreground for stats purposes. */ + public abstract void setUidForeground(int uid, boolean uidForeground); + + /** Advise persistance threshold; may be overridden internally. */ + public abstract void advisePersistThreshold(long thresholdBytes); + + /** Force update of statistics. */ + public abstract void forceUpdate(); +} diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java index 32e15c9d9c98..93c04fe2068c 100644 --- a/services/core/java/com/android/server/net/NetworkStatsService.java +++ b/services/core/java/com/android/server/net/NetworkStatsService.java @@ -49,7 +49,6 @@ import static android.provider.Settings.Global.NETSTATS_DEV_ROTATE_AGE; import static android.provider.Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES; import static android.provider.Settings.Global.NETSTATS_POLL_INTERVAL; import static android.provider.Settings.Global.NETSTATS_SAMPLE_ENABLED; -import static android.provider.Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE; import static android.provider.Settings.Global.NETSTATS_UID_BUCKET_DURATION; import static android.provider.Settings.Global.NETSTATS_UID_DELETE_AGE; import static android.provider.Settings.Global.NETSTATS_UID_PERSIST_BYTES; @@ -95,10 +94,10 @@ import android.net.NetworkStats.NonMonotonicObserver; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.net.TrafficStats; +import android.os.BestClock; import android.os.Binder; import android.os.DropBoxManager; import android.os.Environment; -import android.os.BestClock; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -134,6 +133,7 @@ import com.android.internal.util.DumpUtils; import com.android.internal.util.FileRotator; import com.android.internal.util.IndentingPrintWriter; import com.android.server.EventLogTags; +import com.android.server.LocalServices; import com.android.server.connectivity.Tethering; import java.io.File; @@ -333,6 +333,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mStatsObservers = checkNotNull(statsObservers, "missing NetworkStatsObservers"); mSystemDir = checkNotNull(systemDir, "missing systemDir"); mBaseDir = checkNotNull(baseDir, "missing baseDir"); + + LocalServices.addService(NetworkStatsManagerInternal.class, + new NetworkStatsManagerInternalImpl()); } @VisibleForTesting @@ -640,7 +643,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private SubscriptionPlan resolveSubscriptionPlan(NetworkTemplate template, int flags) { SubscriptionPlan plan = null; if ((flags & NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN) != 0 - && (template.getMatchRule() == NetworkTemplate.MATCH_MOBILE_ALL) + && (template.getMatchRule() == NetworkTemplate.MATCH_MOBILE) && mSettings.getAugmentEnabled()) { if (LOGD) Slog.d(TAG, "Resolving plan for " + template); final long token = Binder.clearCallingIdentity(); @@ -701,12 +704,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } - @Override - public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) { - // Special case - since this is for internal use only, don't worry about - // a full access level check and just require the signature/privileged - // permission. - mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG); + private long getNetworkTotalBytes(NetworkTemplate template, long start, long end) { + assertSystemReady(); assertBandwidthControlEnabled(); // NOTE: if callers want to get non-augmented data, they should go @@ -716,6 +715,18 @@ public class NetworkStatsService extends INetworkStatsService.Stub { NetworkStatsAccess.Level.DEVICE, Binder.getCallingUid()).getTotalBytes(); } + private NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) { + assertSystemReady(); + assertBandwidthControlEnabled(); + + final NetworkStatsCollection uidComplete; + synchronized (mStatsLock) { + uidComplete = mUidRecorder.getOrLoadCompleteLocked(); + } + return uidComplete.getSummary(template, start, end, NetworkStatsAccess.Level.DEVICE, + android.os.Process.SYSTEM_UID); + } + @Override public NetworkStats getDataLayerSnapshotForUid(int uid) throws RemoteException { if (Binder.getCallingUid() != uid) { @@ -777,10 +788,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } - @Override - public void setUidForeground(int uid, boolean uidForeground) { - mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - + @VisibleForTesting + void setUidForeground(int uid, boolean uidForeground) { synchronized (mStatsLock) { final int set = uidForeground ? SET_FOREGROUND : SET_DEFAULT; final int oldSet = mActiveUidCounterSet.get(uid, SET_DEFAULT); @@ -817,9 +826,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } - @Override - public void advisePersistThreshold(long thresholdBytes) { - mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); + private void advisePersistThreshold(long thresholdBytes) { assertBandwidthControlEnabled(); // clamp threshold into safe range @@ -1330,6 +1337,33 @@ public class NetworkStatsService extends INetworkStatsService.Stub { removeUidsLocked(uids); } + private class NetworkStatsManagerInternalImpl extends NetworkStatsManagerInternal { + @Override + public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) { + return NetworkStatsService.this.getNetworkTotalBytes(template, start, end); + } + + @Override + public NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) { + return NetworkStatsService.this.getNetworkUidBytes(template, start, end); + } + + @Override + public void setUidForeground(int uid, boolean uidForeground) { + NetworkStatsService.this.setUidForeground(uid, uidForeground); + } + + @Override + public void advisePersistThreshold(long thresholdBytes) { + NetworkStatsService.this.advisePersistThreshold(thresholdBytes); + } + + @Override + public void forceUpdate() { + NetworkStatsService.this.forceUpdate(); + } + } + @Override protected void dump(FileDescriptor fd, PrintWriter rawWriter, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, rawWriter)) return; @@ -1550,6 +1584,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } + private void assertSystemReady() { + if (!mSystemReady) { + throw new IllegalStateException("System not ready"); + } + } + private void assertBandwidthControlEnabled() { if (!isBandwidthControlEnabled()) { throw new IllegalStateException("Bandwidth module disabled"); diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 7467954918d8..fd51be577308 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -64,6 +64,8 @@ import com.android.server.SystemService; import com.android.server.pm.Installer; import com.android.server.pm.UserManagerService; +import libcore.util.EmptyArray; + import org.xmlpull.v1.XmlPullParserException; import java.io.File; @@ -303,10 +305,10 @@ public final class OverlayManagerService extends SystemService { schedulePersistSettings(); } - private static Set<String> getDefaultOverlayPackages() { + private static String[] getDefaultOverlayPackages() { final String str = SystemProperties.get(DEFAULT_OVERLAYS_PROP); if (TextUtils.isEmpty(str)) { - return Collections.emptySet(); + return EmptyArray.STRING; } final ArraySet<String> defaultPackages = new ArraySet<>(); @@ -315,7 +317,7 @@ public final class OverlayManagerService extends SystemService { defaultPackages.add(packageName); } } - return defaultPackages; + return defaultPackages.toArray(new String[defaultPackages.size()]); } private final class PackageReceiver extends BroadcastReceiver { diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java index 43b17087953a..74eb2ea25e49 100644 --- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java +++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java @@ -60,13 +60,13 @@ final class OverlayManagerServiceImpl { private final PackageManagerHelper mPackageManager; private final IdmapManager mIdmapManager; private final OverlayManagerSettings mSettings; - private final Set<String> mDefaultOverlays; + private final String[] mDefaultOverlays; private final OverlayChangeListener mListener; OverlayManagerServiceImpl(@NonNull final PackageManagerHelper packageManager, @NonNull final IdmapManager idmapManager, @NonNull final OverlayManagerSettings settings, - @NonNull final Set<String> defaultOverlays, + @NonNull final String[] defaultOverlays, @NonNull final OverlayChangeListener listener) { mPackageManager = packageManager; mIdmapManager = idmapManager; @@ -104,31 +104,27 @@ final class OverlayManagerServiceImpl { for (int i = 0; i < overlayPackagesSize; i++) { final PackageInfo overlayPackage = overlayPackages.get(i); final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName); - if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget) - || !Objects.equals(oi.category, overlayPackage.overlayCategory)) { - // Update the overlay if it didn't exist or had the wrong target package. + if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget)) { + // Reset the overlay if it didn't exist or had the wrong target package. mSettings.init(overlayPackage.packageName, newUserId, overlayPackage.overlayTarget, overlayPackage.applicationInfo.getBaseCodePath(), - overlayPackage.isStaticOverlayPackage(), overlayPackage.overlayPriority, + overlayPackage.isStaticOverlayPackage(), + overlayPackage.overlayPriority, overlayPackage.overlayCategory); - if (oi == null) { - // This overlay does not exist in our settings. - if (overlayPackage.isStaticOverlayPackage() || - mDefaultOverlays.contains(overlayPackage.packageName)) { - // Enable this overlay by default. - if (DEBUG) { - Slog.d(TAG, "Enabling overlay " + overlayPackage.packageName - + " for user " + newUserId + " by default"); - } - mSettings.setEnabled(overlayPackage.packageName, newUserId, true); - } - } else { + if (oi != null) { // The targetPackageName we have stored doesn't match the overlay's target. // Queue the old target for an update as well. packagesToUpdateAssets.add(oi.targetPackageName); } + } else { + // Update all other components of an overlay that don't require a hard reset. + if (!Objects.equals(oi.category, overlayPackage.overlayCategory)) { + // When changing categories, it is ok just to update our internal state. + mSettings.setCategory(overlayPackage.packageName, newUserId, + overlayPackage.overlayCategory); + } } try { @@ -160,6 +156,42 @@ final class OverlayManagerServiceImpl { iter.remove(); } } + + // Collect all of the categories in which we have at least one overlay enabled. + final ArraySet<String> enabledCategories = new ArraySet<>(); + final ArrayMap<String, List<OverlayInfo>> userOverlays = + mSettings.getOverlaysForUser(newUserId); + final int userOverlayTargetCount = userOverlays.size(); + for (int i = 0; i < userOverlayTargetCount; i++) { + final List<OverlayInfo> overlayList = userOverlays.valueAt(i); + final int overlayCount = overlayList != null ? overlayList.size() : 0; + for (int j = 0; j < overlayCount; j++) { + final OverlayInfo oi = overlayList.get(j); + if (oi.isEnabled()) { + enabledCategories.add(oi.category); + } + } + } + + // Enable the default overlay if its category does not have a single overlay enabled. + for (final String defaultOverlay : mDefaultOverlays) { + try { + final OverlayInfo oi = mSettings.getOverlayInfo(defaultOverlay, newUserId); + if (!enabledCategories.contains(oi.category)) { + Slog.w(TAG, "Enabling default overlay '" + defaultOverlay + "' for target '" + + oi.targetPackageName + "' in category '" + oi.category + "' for user " + + newUserId); + mSettings.setEnabled(oi.packageName, newUserId, true); + if (updateState(oi.targetPackageName, oi.packageName, newUserId, 0)) { + packagesToUpdateAssets.add(oi.targetPackageName); + } + } + } catch (OverlayManagerSettings.BadKeyException e) { + Slog.e(TAG, "Failed to set default overlay '" + defaultOverlay + "' for user " + + newUserId, e); + } + } + return new ArrayList<>(packagesToUpdateAssets); } @@ -325,6 +357,11 @@ final class OverlayManagerServiceImpl { mSettings.init(packageName, userId, pkg.overlayTarget, pkg.applicationInfo.getBaseCodePath(), pkg.isStaticOverlayPackage(), pkg.overlayPriority, pkg.overlayCategory); + } else { + if (!Objects.equals(oldOi.category, pkg.overlayCategory)) { + // Update the category in-place. + mSettings.setCategory(packageName, userId, pkg.overlayCategory); + } } if (updateState(pkg.overlayTarget, packageName, userId, 0)) { diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java index e57fa0b51d39..0b9412b43bf8 100644 --- a/services/core/java/com/android/server/om/OverlayManagerSettings.java +++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java @@ -20,6 +20,7 @@ import static com.android.server.om.OverlayManagerService.DEBUG; import static com.android.server.om.OverlayManagerService.TAG; import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.om.OverlayInfo; import android.util.ArrayMap; import android.util.Slog; @@ -39,6 +40,7 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -70,6 +72,9 @@ final class OverlayManagerSettings { new SettingsItem(packageName, userId, targetPackageName, baseCodePath, isStatic, priority, overlayCategory); if (isStatic) { + // All static overlays are always enabled. + item.setEnabled(true); + int i; for (i = mItems.size() - 1; i >= 0; i--) { SettingsItem parentItem = mItems.get(i); @@ -122,6 +127,15 @@ final class OverlayManagerSettings { return mItems.get(idx).setBaseCodePath(path); } + boolean setCategory(@NonNull final String packageName, final int userId, + @Nullable String category) throws BadKeyException { + final int idx = select(packageName, userId); + if (idx < 0) { + throw new BadKeyException(packageName, userId); + } + return mItems.get(idx).setCategory(category); + } + boolean getEnabled(@NonNull final String packageName, final int userId) throws BadKeyException { final int idx = select(packageName, userId); if (idx < 0) { @@ -420,7 +434,7 @@ final class OverlayManagerSettings { private OverlayInfo mCache; private boolean mIsStatic; private int mPriority; - private final String mCategory; + private String mCategory; SettingsItem(@NonNull final String packageName, final int userId, @NonNull final String targetPackageName, @NonNull final String baseCodePath, @@ -431,7 +445,7 @@ final class OverlayManagerSettings { mTargetPackageName = targetPackageName; mBaseCodePath = baseCodePath; mState = state; - mIsEnabled = isEnabled; + mIsEnabled = isEnabled || isStatic; mCategory = category; mCache = null; mIsStatic = isStatic; @@ -483,7 +497,11 @@ final class OverlayManagerSettings { return mIsEnabled; } - private boolean setEnabled(final boolean enable) { + private boolean setEnabled(boolean enable) { + if (mIsStatic) { + return false; + } + if (mIsEnabled != enable) { mIsEnabled = enable; invalidateCache(); @@ -492,6 +510,15 @@ final class OverlayManagerSettings { return false; } + private boolean setCategory(String category) { + if (!Objects.equals(mCategory, category)) { + mCategory = category.intern(); + invalidateCache(); + return true; + } + return false; + } + private OverlayInfo getOverlayInfo() { if (mCache == null) { mCache = new OverlayInfo(mPackageName, mTargetPackageName, mCategory, mBaseCodePath, diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index 8591304e512c..e315bc5a6a28 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -146,6 +146,12 @@ public class BackgroundDexOptService extends JobService { Intent intent = registerReceiver(null, filter); int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + boolean present = intent.getBooleanExtra(BatteryManager.EXTRA_PRESENT, true); + + if (!present) { + // No battery, treat as if 100%, no possibility of draining battery. + return 100; + } if (level < 0 || scale <= 0) { // Battery data unavailable. This should never happen, so assume the worst. diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index e4c74edf0f0f..c11c0990fb12 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -490,7 +490,7 @@ class ShortcutPackage extends ShortcutPackageItem { * <p>This takes care of the resetting the counter for foreground apps as well as after * locale changes. */ - public int getApiCallCount() { + public int getApiCallCount(boolean unlimited) { final ShortcutService s = mShortcutUser.mService; // Reset the counter if: @@ -498,8 +498,9 @@ class ShortcutPackage extends ShortcutPackageItem { // - the package is *not* in foreground now, but was in foreground at some point // since the previous time it had been. if (s.isUidForegroundLocked(mPackageUid) - || mLastKnownForegroundElapsedTime - < s.getUidLastForegroundElapsedTimeLocked(mPackageUid)) { + || (mLastKnownForegroundElapsedTime + < s.getUidLastForegroundElapsedTimeLocked(mPackageUid)) + || unlimited) { mLastKnownForegroundElapsedTime = s.injectElapsedRealtime(); resetRateLimiting(); } @@ -538,10 +539,10 @@ class ShortcutPackage extends ShortcutPackageItem { * <p>This takes care of the resetting the counter for foreground apps as well as after * locale changes, which is done internally by {@link #getApiCallCount}. */ - public boolean tryApiCall() { + public boolean tryApiCall(boolean unlimited) { final ShortcutService s = mShortcutUser.mService; - if (getApiCallCount() >= s.mMaxUpdatesPerInterval) { + if (getApiCallCount(unlimited) >= s.mMaxUpdatesPerInterval) { return false; } mApiCallCount++; @@ -1248,7 +1249,7 @@ class ShortcutPackage extends ShortcutPackageItem { pw.print(prefix); pw.print(" "); pw.print("Calls: "); - pw.print(getApiCallCount()); + pw.print(getApiCallCount(/*unlimited=*/ false)); pw.println(); // getApiCallCount() may have updated mLastKnownForegroundElapsedTime. diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 034fd2390a8c..076f81f87340 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -15,6 +15,7 @@ */ package com.android.server.pm; +import android.Manifest.permission; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -1726,6 +1727,9 @@ public class ShortcutService extends IShortcutService.Stub { final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList(); final int size = newShortcuts.size(); + final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission( + injectBinderCallingPid(), injectBinderCallingUid()); + synchronized (mLock) { throwIfUserLockedL(userId); @@ -1738,7 +1742,7 @@ public class ShortcutService extends IShortcutService.Stub { ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_SET); // Throttling. - if (!ps.tryApiCall()) { + if (!ps.tryApiCall(unlimited)) { return false; } @@ -1777,6 +1781,9 @@ public class ShortcutService extends IShortcutService.Stub { final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList(); final int size = newShortcuts.size(); + final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission( + injectBinderCallingPid(), injectBinderCallingUid()); + synchronized (mLock) { throwIfUserLockedL(userId); @@ -1790,7 +1797,7 @@ public class ShortcutService extends IShortcutService.Stub { ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_UPDATE); // Throttling. - if (!ps.tryApiCall()) { + if (!ps.tryApiCall(unlimited)) { return false; } @@ -1859,6 +1866,9 @@ public class ShortcutService extends IShortcutService.Stub { final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList(); final int size = newShortcuts.size(); + final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission( + injectBinderCallingPid(), injectBinderCallingUid()); + synchronized (mLock) { throwIfUserLockedL(userId); @@ -1875,7 +1885,7 @@ public class ShortcutService extends IShortcutService.Stub { assignImplicitRanks(newShortcuts); // Throttling. - if (!ps.tryApiCall()) { + if (!ps.tryApiCall(unlimited)) { return false; } for (int i = 0; i < size; i++) { @@ -2144,11 +2154,14 @@ public class ShortcutService extends IShortcutService.Stub { public int getRemainingCallCount(String packageName, @UserIdInt int userId) { verifyCaller(packageName, userId); + final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission( + injectBinderCallingPid(), injectBinderCallingUid()); + synchronized (mLock) { throwIfUserLockedL(userId); final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId); - return mMaxUpdatesPerInterval - ps.getApiCallCount(); + return mMaxUpdatesPerInterval - ps.getApiCallCount(unlimited); } } @@ -2298,6 +2311,15 @@ public class ShortcutService extends IShortcutService.Stub { callingPid, callingUid) == PackageManager.PERMISSION_GRANTED; } + /** + * Returns true if the caller has the "UNLIMITED_SHORTCUTS_API_CALLS" permission. + */ + @VisibleForTesting + boolean injectHasUnlimitedShortcutsApiCallsPermission(int callingPid, int callingUid) { + return mContext.checkPermission(permission.UNLIMITED_SHORTCUTS_API_CALLS, + callingPid, callingUid) == PackageManager.PERMISSION_GRANTED; + } + // This method is extracted so we can directly call this method from unit tests, // even when hasShortcutPermission() is overridden. @VisibleForTesting @@ -4197,6 +4219,11 @@ public class ShortcutService extends IShortcutService.Stub { return getCallingUid(); } + @VisibleForTesting + int injectBinderCallingPid() { + return getCallingPid(); + } + private int getCallingUserId() { return UserHandle.getUserId(injectBinderCallingUid()); } diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java index e29027288e9b..2ece2b280159 100644 --- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java +++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java @@ -19,18 +19,20 @@ package com.android.server.pm.dex; import android.Manifest; import android.annotation.UserIdInt; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageParser; import android.content.pm.dex.ArtManager; import android.content.pm.dex.ArtManager.ProfileType; +import android.content.pm.dex.ArtManagerInternal; import android.content.pm.dex.DexMetadataHelper; +import android.content.pm.dex.PackageOptimizationInfo; import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.ParcelFileDescriptor; import android.os.RemoteException; -import android.content.pm.IPackageManager; import android.content.pm.dex.ISnapshotRuntimeProfileCallback; import android.os.SystemProperties; import android.os.UserHandle; @@ -42,8 +44,13 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.os.BackgroundThread; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; +import com.android.server.LocalServices; import com.android.server.pm.Installer; import com.android.server.pm.Installer.InstallerException; + +import dalvik.system.DexFile; + +import dalvik.system.VMRuntime; import java.io.File; import java.io.FileNotFoundException; import libcore.io.IoUtils; @@ -86,6 +93,8 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { mInstaller = installer; mInstallLock = installLock; mHandler = new Handler(BackgroundThread.getHandler().getLooper()); + + LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl()); } @Override @@ -397,4 +406,30 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub { } return result; } + + private class ArtManagerInternalImpl extends ArtManagerInternal { + @Override + public PackageOptimizationInfo getPackageOptimizationInfo( + ApplicationInfo info, String abi) { + String compilationReason; + String compilationFilter; + try { + String isa = VMRuntime.getInstructionSet(abi); + String[] stats = DexFile.getDexFileOptimizationStatus(info.getBaseCodePath(), isa); + compilationFilter = stats[0]; + compilationReason = stats[1]; + } catch (FileNotFoundException e) { + Slog.e(TAG, "Could not get optimizations status for " + info.getBaseCodePath(), e); + compilationFilter = "error"; + compilationReason = "error"; + } catch (IllegalArgumentException e) { + Slog.wtf(TAG, "Requested optimization status for " + info.getBaseCodePath() + + " due to an invalid abi " + abi, e); + compilationFilter = "error"; + compilationReason = "error"; + } + + return new PackageOptimizationInfo(compilationFilter, compilationReason); + } + } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 7a5a6c5a9ae8..7efc9876993b 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -785,6 +785,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { private int mCurrentUserId; + /* Whether accessibility is magnifying the screen */ + private boolean mScreenMagnificationActive; + // Maps global key codes to the components that will handle them. private GlobalKeyManager mGlobalKeyManager; @@ -2655,6 +2658,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; break; + case TYPE_DREAM: + // Dreams don't have an app window token and can thus not be letterboxed. + // Hence always let them extend under the cutout. + attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + break; case TYPE_STATUS_BAR: // If the Keyguard is in a hidden state (occluded by another window), we force to @@ -5244,9 +5252,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { final boolean attachedInParent = attached != null && !layoutInScreen; // Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in // the cutout safe zone. - // Windows that are attached to a parent and laid out in said parent are already avoiding - // the cutout according to that parent and don't need to be further constrained. - if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS && !attachedInParent) { + if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) { final Rect displayCutoutSafeExceptMaybeTop = mTmpRect; displayCutoutSafeExceptMaybeTop.set(displayFrames.mDisplayCutoutSafe); if (layoutInScreen && layoutInsetDecor && !requestedFullscreen @@ -5257,7 +5263,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { // the window from that area. displayCutoutSafeExceptMaybeTop.top = Integer.MIN_VALUE; } - pf.intersectUnchecked(displayCutoutSafeExceptMaybeTop); + // Windows that are attached to a parent and laid out in said parent are already + // avoidingthe cutout according to that parent and don't need to be further constrained. + if (!attachedInParent) { + pf.intersectUnchecked(displayCutoutSafeExceptMaybeTop); + } + // Make sure that NO_LIMITS windows clipped to the display don't extend into the display + // don't extend under the cutout. + df.intersectUnchecked(displayCutoutSafeExceptMaybeTop); } // Content should never appear in the cutout. @@ -6695,7 +6708,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mWindowManagerDrawComplete = false; mScreenOnListener = screenOnListener; - if (mKeyguardDelegate != null) { + if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) { mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, getKeyguardDrawnTimeout()); @@ -8154,7 +8167,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { */ private int configureNavBarOpacity(int visibility, boolean dockedStackVisible, boolean freeformStackVisible, boolean isDockedDividerResizing) { - if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { + if (mScreenMagnificationActive) { + // When the screen is magnified, the nav bar should be opaque since its background + // can vary as the user pans and zooms + visibility = setNavBarOpaqueFlag(visibility); + } else if (mNavBarOpacityMode == NAV_BAR_OPAQUE_WHEN_FREEFORM_OR_DOCKED) { if (dockedStackVisible || freeformStackVisible || isDockedDividerResizing) { visibility = setNavBarOpaqueFlag(visibility); } @@ -8309,6 +8326,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override + public void onScreenMagnificationStateChanged(boolean active) { + synchronized (mWindowManagerFuncs.getWindowManagerLock()) { + mScreenMagnificationActive = active; + updateSystemUiVisibilityLw(); + } + } + + @Override public void writeToProto(ProtoOutputStream proto, long fieldId) { final long token = proto.start(fieldId); proto.write(LAST_SYSTEM_UI_FLAGS, mLastSystemUiFlags); diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index dde4bc8f278c..bf0c3da5b99c 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -1700,6 +1700,13 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { boolean canDismissBootAnimation(); /** + * Called when the magnification state changes. + * + * @param active Whether magnification is active (that is, we are zoomed in). + */ + void onScreenMagnificationStateChanged(boolean active); + + /** * Convert the user rotation mode to a human readable format. */ static String userRotationModeToString(int mode) { diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index 18f4a3c5f396..58e8f776f9dd 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -242,6 +242,10 @@ public class KeyguardServiceDelegate { return false; } + public boolean hasKeyguard() { + return mKeyguardState.deviceHasKeyguard; + } + public boolean isInputRestricted() { if (mKeyguardService != null) { mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted(); diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java index efcadadce3f9..941cd4441e23 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java @@ -19,8 +19,6 @@ package com.android.server.policy.keyguard; import android.app.ActivityManager; import android.content.Context; import android.os.RemoteException; -import android.os.ServiceManager; -import android.security.IKeystoreService; import android.util.Slog; import com.android.internal.policy.IKeyguardService; @@ -53,16 +51,11 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { private final LockPatternUtils mLockPatternUtils; private final StateCallback mCallback; - IKeystoreService mKeystoreService; - public KeyguardStateMonitor(Context context, IKeyguardService service, StateCallback callback) { mLockPatternUtils = new LockPatternUtils(context); mCurrentUserId = ActivityManager.getCurrentUser(); mCallback = callback; - mKeystoreService = IKeystoreService.Stub.asInterface(ServiceManager - .getService("android.security.keystore")); - try { service.addStateMonitorCallback(this); } catch (RemoteException e) { @@ -93,12 +86,6 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { @Override // Binder interface public void onShowingStateChanged(boolean showing) { mIsShowing = showing; - - if (showing) try { - mKeystoreService.lock(mCurrentUserId); // as long as this doesn't recur... - } catch (RemoteException e) { - Slog.e(TAG, "Error locking keystore", e); - } } @Override // Binder interface diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java index 8da16d7ea148..f9a4ea211f07 100644 --- a/services/core/java/com/android/server/slice/PinnedSliceState.java +++ b/services/core/java/com/android/server/slice/PinnedSliceState.java @@ -16,7 +16,6 @@ package com.android.server.slice; import static android.app.slice.SliceManager.PERMISSION_GRANTED; -import android.app.slice.ISliceListener; import android.app.slice.Slice; import android.app.slice.SliceProvider; import android.app.slice.SliceSpec; @@ -106,10 +105,6 @@ public class PinnedSliceState { setSlicePinned(false); } - public void onChange() { - mService.getHandler().post(this::handleBind); - } - private void setSlicePinned(boolean pinned) { synchronized (mLock) { if (mSlicePinned == pinned) return; @@ -122,45 +117,23 @@ public class PinnedSliceState { } } - public void addSliceListener(ISliceListener listener, String pkg, SliceSpec[] specs, - boolean hasPermission) { + public void pin(String pkg, SliceSpec[] specs, IBinder token) { synchronized (mLock) { - if (mListeners.size() == 0) { - mService.listen(mUri); - } + mListeners.put(token, new ListenerInfo(token, pkg, true, + Binder.getCallingUid(), Binder.getCallingPid())); try { - listener.asBinder().linkToDeath(mDeathRecipient, 0); + token.linkToDeath(mDeathRecipient, 0); } catch (RemoteException e) { } - mListeners.put(listener.asBinder(), new ListenerInfo(listener, pkg, hasPermission, - Binder.getCallingUid(), Binder.getCallingPid())); mergeSpecs(specs); - setSlicePinned(hasPermission); - } - } - - public boolean removeSliceListener(ISliceListener listener) { - synchronized (mLock) { - listener.asBinder().unlinkToDeath(mDeathRecipient, 0); - if (mListeners.containsKey(listener.asBinder()) && mListeners.size() == 1) { - mService.unlisten(mUri); - } - mListeners.remove(listener.asBinder()); - } - return !hasPinOrListener(); - } - - public void pin(String pkg, SliceSpec[] specs) { - synchronized (mLock) { setSlicePinned(true); - mPinnedPkgs.add(pkg); - mergeSpecs(specs); } } - public boolean unpin(String pkg) { + public boolean unpin(String pkg, IBinder token) { synchronized (mLock) { - mPinnedPkgs.remove(pkg); + token.unlinkToDeath(mDeathRecipient, 0); + mListeners.remove(token); } return !hasPinOrListener(); } @@ -171,30 +144,6 @@ public class PinnedSliceState { } } - public void recheckPackage(String pkg) { - synchronized (mLock) { - for (int i = 0; i < mListeners.size(); i++) { - ListenerInfo info = mListeners.valueAt(i); - if (!info.hasPermission && Objects.equals(info.pkg, pkg)) { - mService.getHandler().post(() -> { - // This bind lets the app itself participate in the permission grant. - Slice s = doBind(info); - if (mService.checkAccess(info.pkg, mUri, info.callingUid, info.callingPid) - == PERMISSION_GRANTED) { - info.hasPermission = true; - setSlicePinned(true); - try { - info.listener.onSliceUpdated(s); - } catch (RemoteException e) { - checkSelfRemove(); - } - } - }); - } - } - } - } - @VisibleForTesting public boolean hasPinOrListener() { synchronized (mLock) { @@ -213,7 +162,6 @@ public class PinnedSliceState { private void checkSelfRemove() { if (!hasPinOrListener()) { // All the listeners died, remove from pinned state. - mService.unlisten(mUri); mService.removePinnedSlice(mUri); } } @@ -223,7 +171,7 @@ public class PinnedSliceState { synchronized (mLock) { for (int i = mListeners.size() - 1; i >= 0; i--) { ListenerInfo l = mListeners.valueAt(i); - if (!l.listener.asBinder().isBinderAlive()) { + if (!l.token.isBinderAlive()) { mListeners.removeAt(i); } } @@ -231,62 +179,6 @@ public class PinnedSliceState { } } - private void handleBind() { - Slice cachedSlice = doBind(null); - synchronized (mLock) { - if (!hasPinOrListener()) return; - for (int i = mListeners.size() - 1; i >= 0; i--) { - ListenerInfo info = mListeners.valueAt(i); - Slice s = cachedSlice; - if (s == null || s.hasHint(Slice.HINT_CALLER_NEEDED) - || !info.hasPermission) { - s = doBind(info); - } - if (s == null) { - mListeners.removeAt(i); - continue; - } - try { - info.listener.onSliceUpdated(s); - } catch (RemoteException e) { - Log.e(TAG, "Unable to notify slice " + mUri, e); - mListeners.removeAt(i); - continue; - } - } - checkSelfRemove(); - } - } - - private Slice doBind(ListenerInfo info) { - try (ContentProviderClient client = getClient()) { - if (client == null) return null; - Bundle extras = new Bundle(); - extras.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri); - extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS, - new ArrayList<>(Arrays.asList(mSupportedSpecs))); - if (info != null) { - extras.putString(SliceProvider.EXTRA_OVERRIDE_PKG, info.pkg); - extras.putInt(SliceProvider.EXTRA_OVERRIDE_UID, info.callingUid); - extras.putInt(SliceProvider.EXTRA_OVERRIDE_PID, info.callingPid); - } - final Bundle res; - try { - res = client.call(SliceProvider.METHOD_SLICE, null, extras); - } catch (RemoteException e) { - Log.e(TAG, "Unable to bind slice " + mUri, e); - return null; - } - if (res == null) return null; - Bundle.setDefusable(res, true); - return res.getParcelable(SliceProvider.EXTRA_SLICE); - } catch (Throwable t) { - // Calling out of the system process, make sure they don't throw anything at us. - Log.e(TAG, "Caught throwable while binding " + mUri, t); - return null; - } - } - private void handleSendPinned() { try (ContentProviderClient client = getClient()) { if (client == null) return; @@ -315,15 +207,15 @@ public class PinnedSliceState { private class ListenerInfo { - private ISliceListener listener; + private IBinder token; private String pkg; private boolean hasPermission; private int callingUid; private int callingPid; - public ListenerInfo(ISliceListener listener, String pkg, boolean hasPermission, + public ListenerInfo(IBinder token, String pkg, boolean hasPermission, int callingUid, int callingPid) { - this.listener = listener; + this.token = token; this.pkg = pkg; this.hasPermission = hasPermission; this.callingUid = callingUid; diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java index a1def440a007..51e4709aa7c7 100644 --- a/services/core/java/com/android/server/slice/SliceManagerService.java +++ b/services/core/java/com/android/server/slice/SliceManagerService.java @@ -28,7 +28,6 @@ import android.app.ActivityManager; import android.app.AppOpsManager; import android.app.ContentProviderHolder; import android.app.IActivityManager; -import android.app.slice.ISliceListener; import android.app.slice.ISliceManager; import android.app.slice.SliceManager; import android.app.slice.SliceSpec; @@ -39,7 +38,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; -import android.database.ContentObserver; import android.net.Uri; import android.os.Binder; import android.os.Environment; @@ -52,7 +50,6 @@ import android.os.UserHandle; import android.util.ArrayMap; import android.util.ArraySet; import android.util.AtomicFile; -import android.util.Log; import android.util.Slog; import android.util.Xml.Encoding; @@ -94,7 +91,6 @@ public class SliceManagerService extends ISliceManager.Stub { @GuardedBy("mLock") private final ArraySet<SliceGrant> mUserGrants = new ArraySet<>(); private final Handler mHandler; - private final ContentObserver mObserver; @GuardedBy("mSliceAccessFile") private final AtomicFile mSliceAccessFile; @GuardedBy("mAccessList") @@ -113,16 +109,6 @@ public class SliceManagerService extends ISliceManager.Stub { mAssistUtils = new AssistUtils(context); mHandler = new Handler(looper); - mObserver = new ContentObserver(mHandler) { - @Override - public void onChange(boolean selfChange, Uri uri, int userId) { - try { - getPinnedSlice(maybeAddUserId(uri, userId)).onChange(); - } catch (IllegalStateException e) { - Log.e(TAG, "Received change for unpinned slice " + uri, e); - } - } - }; final File systemDir = new File(Environment.getDataDirectory(), "system"); mSliceAccessFile = new AtomicFile(new File(systemDir, "slice_access.xml")); mAccessList = new SliceFullAccessList(mContext); @@ -163,40 +149,19 @@ public class SliceManagerService extends ISliceManager.Stub { /// ----- ISliceManager stuff ----- @Override - public void addSliceListener(Uri uri, String pkg, ISliceListener listener, SliceSpec[] specs) - throws RemoteException { - verifyCaller(pkg); - uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier()); - enforceCrossUser(pkg, uri); - getOrCreatePinnedSlice(uri).addSliceListener(listener, pkg, specs, - checkAccess(pkg, uri, Binder.getCallingUid(), Binder.getCallingUid()) - == PERMISSION_GRANTED); - } - - @Override - public void removeSliceListener(Uri uri, String pkg, ISliceListener listener) - throws RemoteException { - verifyCaller(pkg); - uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier()); - if (getPinnedSlice(uri).removeSliceListener(listener)) { - removePinnedSlice(uri); - } - } - - @Override - public void pinSlice(String pkg, Uri uri, SliceSpec[] specs) throws RemoteException { + public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException { verifyCaller(pkg); - enforceFullAccess(pkg, "pinSlice", uri); + enforceAccess(pkg, uri); uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier()); - getOrCreatePinnedSlice(uri).pin(pkg, specs); + getOrCreatePinnedSlice(uri).pin(pkg, specs, token); } @Override - public void unpinSlice(String pkg, Uri uri) throws RemoteException { + public void unpinSlice(String pkg, Uri uri, IBinder token) throws RemoteException { verifyCaller(pkg); - enforceFullAccess(pkg, "unpinSlice", uri); + enforceAccess(pkg, uri); uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier()); - if (getPinnedSlice(uri).unpin(pkg)) { + if (getPinnedSlice(uri).unpin(pkg, token)) { removePinnedSlice(uri); } } @@ -253,11 +218,6 @@ public class SliceManagerService extends ISliceManager.Stub { } finally { Binder.restoreCallingIdentity(ident); } - synchronized (mLock) { - for (PinnedSliceState p : mPinnedSlicesByUri.values()) { - p.recheckPackage(pkg); - } - } } // Backup/restore interface @@ -457,21 +417,6 @@ public class SliceManagerService extends ISliceManager.Stub { return cn.getPackageName().equals(pkg); } - public void listen(Uri uri) { - mContext.getContentResolver().registerContentObserver(uri, true, mObserver); - } - - public void unlisten(Uri uri) { - mContext.getContentResolver().unregisterContentObserver(mObserver); - synchronized (mLock) { - mPinnedSlicesByUri.forEach((u, s) -> { - if (s.isListening()) { - listen(u); - } - }); - } - } - private boolean isDefaultHomeApp(String pkg, int userId) { String defaultHome = getDefaultHome(userId); diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index d6359b8cbee3..95c30d10341f 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -418,10 +418,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void addNetworkStats( int tag, List<StatsLogEventWrapper> ret, NetworkStats stats, boolean withFGBG) { int size = stats.size(); + long elapsedNanos = SystemClock.elapsedRealtimeNanos(); NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling for (int j = 0; j < size; j++) { stats.getValues(j, entry); - StatsLogEventWrapper e = new StatsLogEventWrapper(tag, withFGBG ? 6 : 5); + StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tag, withFGBG ? 6 : 5); e.writeInt(entry.uid); if (withFGBG) { e.writeInt(entry.set); @@ -500,10 +501,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullKernelWakelock(int tagId, List<StatsLogEventWrapper> pulledData) { final KernelWakelockStats wakelockStats = mKernelWakelockReader.readKernelWakelockStats(mTmpWakelockStats); + long elapsedNanos = SystemClock.elapsedRealtimeNanos(); for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) { String name = ent.getKey(); KernelWakelockStats.Entry kws = ent.getValue(); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 4); + StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 4); e.writeString(name); e.writeInt(kws.mCount); e.writeInt(kws.mVersion); @@ -576,8 +578,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullBluetoothBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) { BluetoothActivityEnergyInfo info = pullBluetoothData(); + long elapsedNanos = SystemClock.elapsedRealtimeNanos(); for (UidTraffic traffic : info.getUidTraffic()) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3); + StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3); e.writeInt(traffic.getUid()); e.writeLong(traffic.getRxBytes()); e.writeLong(traffic.getTxBytes()); @@ -605,11 +608,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } private void pullCpuTimePerFreq(int tagId, List<StatsLogEventWrapper> pulledData) { + long elapsedNanos = SystemClock.elapsedRealtimeNanos(); for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) { long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readAbsolute(); if (clusterTimeMs != null) { for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3); + StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3); e.writeInt(cluster); e.writeInt(speed); e.writeLong(clusterTimeMs[speed]); @@ -630,7 +634,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi"); mWifiManager.requestActivityInfo(wifiReceiver); final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6); e.writeLong(wifiInfo.getTimeStamp()); e.writeInt(wifiInfo.getStackState()); e.writeLong(wifiInfo.getControllerTxTimeMillis()); @@ -655,7 +659,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony"); mTelephony.requestModemActivityInfo(modemReceiver); final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6); e.writeLong(modemInfo.getTimestamp()); e.writeLong(modemInfo.getSleepTimeMillis()); e.writeLong(modemInfo.getIdleTimeMillis()); @@ -672,7 +676,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullBluetoothActivityInfo(int tagId, List<StatsLogEventWrapper> pulledData) { BluetoothActivityEnergyInfo info = pullBluetoothData(); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6); e.writeLong(info.getTimeStamp()); e.writeInt(info.getBluetoothStackState()); e.writeLong(info.getControllerTxTimeMillis()); @@ -695,13 +699,13 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } private void pullSystemElapsedRealtime(int tagId, List<StatsLogEventWrapper> pulledData) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 1); e.writeLong(SystemClock.elapsedRealtime()); pulledData.add(e); } private void pullDiskSpace(int tagId, List<StatsLogEventWrapper> pulledData) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 3); e.writeLong(mStatFsData.getAvailableBytes()); e.writeLong(mStatFsSystem.getAvailableBytes()); e.writeLong(mStatFsTemp.getAvailableBytes()); @@ -709,7 +713,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } private void pullSystemUpTime(int tagId, List<StatsLogEventWrapper> pulledData) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1); + StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 1); e.writeLong(SystemClock.uptimeMillis()); pulledData.add(e); } @@ -718,8 +722,9 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { List<ProcessMemoryState> processMemoryStates = LocalServices.getService(ActivityManagerInternal.class) .getMemoryStateForProcesses(); + long elapsedNanos = SystemClock.elapsedRealtimeNanos(); for (ProcessMemoryState processMemoryState : processMemoryStates) { - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 8 /* fields */); + StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 8 /* fields */); e.writeInt(processMemoryState.uid); e.writeString(processMemoryState.processName); e.writeInt(processMemoryState.oomScore); diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java index 872d7237f4f1..23c4a337001b 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerService.java +++ b/services/core/java/com/android/server/timezone/RulesManagerService.java @@ -92,6 +92,9 @@ public final class RulesManagerService extends IRulesManager.Stub { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) static final String REQUIRED_UPDATER_PERMISSION = android.Manifest.permission.UPDATE_TIME_ZONE_RULES; + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) + static final String REQUIRED_QUERY_PERMISSION = + android.Manifest.permission.QUERY_TIME_ZONE_RULES; private static final File SYSTEM_TZ_DATA_FILE = new File("/system/usr/share/zoneinfo/tzdata"); private static final File TZ_DATA_DIR = new File("/data/misc/zoneinfo"); @@ -131,7 +134,7 @@ public final class RulesManagerService extends IRulesManager.Stub { @Override // Binder call public RulesState getRulesState() { - mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); + mPermissionHelper.enforceCallerHasPermission(REQUIRED_QUERY_PERMISSION); return getRulesStateInternal(); } diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java index 659253f9d603..c31cdec0a0fc 100644 --- a/services/core/java/com/android/server/wm/AccessibilityController.java +++ b/services/core/java/com/android/server/wm/AccessibilityController.java @@ -87,6 +87,8 @@ final class AccessibilityController { private WindowsForAccessibilityObserver mWindowsForAccessibilityObserver; + private boolean mScreenMagnificationActive; + public void setMagnificationCallbacksLocked(MagnificationCallbacks callbacks) { if (callbacks != null) { if (mDisplayMagnifier != null) { @@ -136,6 +138,11 @@ final class AccessibilityController { if (mWindowsForAccessibilityObserver != null) { mWindowsForAccessibilityObserver.scheduleComputeChangedWindowsLocked(); } + boolean nowActive = !spec.isNop(); + if (nowActive != mScreenMagnificationActive) { + mScreenMagnificationActive = nowActive; + mService.mPolicy.onScreenMagnificationStateChanged(nowActive); + } } public void getMagnificationRegionLocked(Region outMagnificationRegion) { diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java index ed4543ef82fe..64f77a2cc4ce 100644 --- a/services/core/java/com/android/server/wm/AnimationAdapter.java +++ b/services/core/java/com/android/server/wm/AnimationAdapter.java @@ -39,6 +39,12 @@ interface AnimationAdapter { boolean getDetachWallpaper(); /** + * @return Whether we should show the wallpaper during the animation. + * @see Animation#getShowWallpaper() + */ + boolean getShowWallpaper(); + + /** * @return The background color behind the animation. */ @ColorInt int getBackgroundColor(); diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 0d36145c8661..f0ca2ef1747b 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -29,6 +29,7 @@ import static android.view.WindowManager.TRANSIT_KEYGUARD_OCCLUDE; import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE; import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_TASK_CLOSE; +import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND; import static android.view.WindowManager.TRANSIT_TASK_TO_BACK; @@ -2138,6 +2139,10 @@ public class AppTransition implements Dump { && isTransitionEqual(TRANSIT_ACTIVITY_CLOSE)) { // Opening a new activity always supersedes a close for the anim. setAppTransition(transit, flags); + } else if (isTaskTransit(transit) && isActivityTransit(mNextAppTransition)) { + // Task animations always supersede activity animations, because if we have both, it + // usually means that activity transition were just trampoline activities. + setAppTransition(transit, flags); } } boolean prepared = prepare(); @@ -2162,6 +2167,21 @@ public class AppTransition implements Dump { || transit == TRANSIT_KEYGUARD_UNOCCLUDE; } + private static boolean isTaskTransit(int transit) { + return transit == TRANSIT_TASK_OPEN + || transit == TRANSIT_TASK_CLOSE + || transit == TRANSIT_TASK_OPEN_BEHIND + || transit == TRANSIT_TASK_TO_BACK + || transit == TRANSIT_TASK_TO_FRONT + || transit == TRANSIT_TASK_IN_PLACE; + } + + private static boolean isActivityTransit(int transit) { + return transit == TRANSIT_ACTIVITY_OPEN + || transit == TRANSIT_ACTIVITY_CLOSE + || transit == TRANSIT_ACTIVITY_RELAUNCH; + } + /** * @return whether the transition should show the thumbnail being scaled down. */ diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index e9efd4ec9e3d..40f772aaa529 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -367,15 +367,14 @@ public class AppWindowContainerController if (wtoken.isHidden()) { wtoken.waitingToShow = true; } - - if (wtoken.isClientHidden()) { - // In the case where we are making an app visible but holding off for a - // transition, we still need to tell the client to make its windows visible - // so they get drawn. Otherwise, we will wait on performing the transition - // until all windows have been drawn, they never will be, and we are sad. - wtoken.setClientHidden(false); - } } + + // In the case where we are making an app visible but holding off for a transition, + // we still need to tell the client to make its windows visible so they get drawn. + // Otherwise, we will wait on performing the transition until all windows have been + // drawn, they never will be, and we are sad. + wtoken.setClientHidden(false); + wtoken.requestUpdateWallpaperIfNeeded(); if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "No longer Stopped: " + wtoken); diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index d646c07b1e82..277a04b6b201 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -367,6 +367,8 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (mClientHidden == hideClient || (hideClient && mDeferHidingClient)) { return; } + if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "setClientHidden: " + this + + " clientHidden=" + hideClient + " Callers=" + Debug.getCallers(5)); mClientHidden = hideClient; sendAppVisibilityToClients(); } @@ -1668,6 +1670,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree } if (adapter != null) { startAnimation(getPendingTransaction(), adapter, !isVisible()); + if (adapter.getShowWallpaper()) { + mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER; + } } } else { cancelAnimation(); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 13357b899729..75a633816f03 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1211,7 +1211,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo if (rotation == ROTATION_0) { return cutout.computeSafeInsets(mInitialDisplayWidth, mInitialDisplayHeight); } - final boolean rotated = (rotation == ROTATION_90 || mRotation == ROTATION_270); + final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270); final Path bounds = cutout.getBounds().getBoundaryPath(); transformPhysicalToLogicalCoordinates(rotation, mInitialDisplayWidth, mInitialDisplayHeight, mTmpMatrix); diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 5c8fadbef6e2..46c59c5e7b59 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -242,7 +242,7 @@ public class DockedStackDividerController { final int appWidth = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, rotation, baseConfig.uiMode, displayId, displayCutout); final int appHeight = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, rotation, - baseConfig.uiMode, displayId, mDisplayContent.getDisplayInfo().displayCutout); + baseConfig.uiMode, displayId, displayCutout); mService.mPolicy.getNonDecorInsetsLw(rotation, dw, dh, displayCutout, mTmpRect); final int leftInset = mTmpRect.left; final int topInset = mTmpRect.top; diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java index 2173fa3a283d..1b41cb84516d 100644 --- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java +++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java @@ -43,6 +43,11 @@ class LocalAnimationAdapter implements AnimationAdapter { } @Override + public boolean getShowWallpaper() { + return mSpec.getShowWallpaper(); + } + + @Override public int getBackgroundColor() { return mSpec.getBackgroundColor(); } @@ -82,6 +87,13 @@ class LocalAnimationAdapter implements AnimationAdapter { } /** + * @see AnimationAdapter#getShowWallpaper + */ + default boolean getShowWallpaper() { + return false; + } + + /** * @see AnimationAdapter#getBackgroundColor */ default int getBackgroundColor() { diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java index 78dd580259a0..31b5c698dc5e 100644 --- a/services/core/java/com/android/server/wm/RecentsAnimationController.java +++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java @@ -368,6 +368,11 @@ public class RecentsAnimationController { } @Override + public boolean getShowWallpaper() { + return false; + } + + @Override public int getBackgroundColor() { return 0; } diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java index 35fc99fe4612..ed6e606b0c75 100644 --- a/services/core/java/com/android/server/wm/RemoteAnimationController.java +++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java @@ -221,6 +221,11 @@ class RemoteAnimationController { } @Override + public boolean getShowWallpaper() { + return false; + } + + @Override public int getBackgroundColor() { return 0; } diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index a4f20b012576..6356a3512e65 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -606,8 +606,11 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { // If we are ready to perform an app transition, check through all of the app tokens to be // shown and see if they are ready to go. if (mService.mAppTransition.isReady()) { - defaultDisplay.pendingLayoutChanges |= - surfacePlacer.handleAppTransitionReadyLocked(); + // This needs to be split into two expressions, as handleAppTransitionReadyLocked may + // modify dc.pendingLayoutChanges, which would get lost when writing + // defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked() + final int layoutChanges = surfacePlacer.handleAppTransitionReadyLocked(); + defaultDisplay.pendingLayoutChanges |= layoutChanges; if (DEBUG_LAYOUT_REPEATS) surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked", defaultDisplay.pendingLayoutChanges); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 7d970d9a06b5..2e86351ee4c2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -687,11 +687,12 @@ class Task extends WindowContainer<AppWindowToken> { pw.println(doublePrefix + "mTempInsetBounds=" + mTempInsetBounds.toShortString()); final String triplePrefix = doublePrefix + " "; + final String quadruplePrefix = triplePrefix + " "; for (int i = mChildren.size() - 1; i >= 0; i--) { final AppWindowToken wtoken = mChildren.get(i); pw.println(triplePrefix + "Activity #" + i + " " + wtoken); - wtoken.dump(pw, triplePrefix, dumpAll); + wtoken.dump(pw, quadruplePrefix, dumpAll); } } diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index f2ad6fb7a888..a7d51f175ab5 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -151,7 +151,10 @@ class WallpaperController { final RecentsAnimationController recentsAnimationController = mService.getRecentsAnimationController(); - final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0; + final boolean animationWallpaper = w.mAppToken != null && w.mAppToken.getAnimation() != null + && w.mAppToken.getAnimation().getShowWallpaper(); + final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0 + || animationWallpaper; final boolean isRecentsTransitionTarget = (recentsAnimationController != null && recentsAnimationController.isWallpaperVisible(w)); if (isRecentsTransitionTarget) { diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java index 0863ee9eebb3..43fa3d56914e 100644 --- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java +++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java @@ -69,6 +69,11 @@ public class WindowAnimationSpec implements AnimationSpec { } @Override + public boolean getShowWallpaper() { + return mAnimation.getShowWallpaper(); + } + + @Override public int getBackgroundColor() { return mAnimation.getBackgroundColor(); } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 26ac79e97182..0d9a37a846d0 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -50,6 +50,7 @@ import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHA import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; @@ -1913,6 +1914,11 @@ public class WindowManagerService extends IWindowManager.Stub // No move or resize, but the controller checks for title changes as well mAccessibilityController.onSomeWindowResizedOrMovedLocked(); } + + if ((flagChanges & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) { + updateNonSystemOverlayWindowsVisibilityIfNeeded( + win, win.mWinAnimator.getShown()); + } } if (DEBUG_LAYOUT) Slog.v(TAG_WM, "Relayout " + win + ": viewVisibility=" + viewVisibility @@ -1960,15 +1966,36 @@ public class WindowManagerService extends IWindowManager.Stub win.setDisplayLayoutNeeded(); win.mGivenInsetsPending = (flags & WindowManagerGlobal.RELAYOUT_INSETS_PENDING) != 0; - // We may be deferring layout passes at the moment, but since the client is interested - // in the new out values right now we need to force a layout. - mWindowPlacerLocked.performSurfacePlacement(true /* force */); - // We should only relayout if the view is visible, it is a starting window, or the // associated appToken is not hidden. final boolean shouldRelayout = viewVisibility == View.VISIBLE && - (win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING - || !win.mAppToken.isClientHidden()); + (win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING + || !win.mAppToken.isClientHidden()); + + // If we are not currently running the exit animation, we need to see about starting + // one. + // We don't want to animate visibility of windows which are pending replacement. + // In the case of activity relaunch child windows could request visibility changes as + // they are detached from the main application window during the tear down process. + // If we satisfied these visibility changes though, we would cause a visual glitch + // hiding the window before it's replacement was available. So we just do nothing on + // our side. + // This must be called before the call to performSurfacePlacement. + if (!shouldRelayout && winAnimator.hasSurface() && !win.mAnimatingExit) { + if (DEBUG_VISIBILITY) { + Slog.i(TAG_WM, + "Relayout invis " + win + ": mAnimatingExit=" + win.mAnimatingExit); + } + result |= RELAYOUT_RES_SURFACE_CHANGED; + if (!win.mWillReplaceWindow) { + focusMayChange = tryStartExitingAnimation(win, winAnimator, isDefaultDisplay, + focusMayChange); + } + } + + // We may be deferring layout passes at the moment, but since the client is interested + // in the new out values right now we need to force a layout. + mWindowPlacerLocked.performSurfacePlacement(true /* force */); if (shouldRelayout) { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "relayoutWindow: viewVisibility_1"); @@ -2001,24 +2028,6 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.mEnterAnimationPending = false; winAnimator.mEnteringAnimation = false; - if (winAnimator.hasSurface() && !win.mAnimatingExit) { - if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Relayout invis " + win - + ": mAnimatingExit=" + win.mAnimatingExit); - // If we are not currently running the exit animation, we - // need to see about starting one. - // We don't want to animate visibility of windows which are pending - // replacement. In the case of activity relaunch child windows - // could request visibility changes as they are detached from the main - // application window during the tear down process. If we satisfied - // these visibility changes though, we would cause a visual glitch - // hiding the window before it's replacement was available. - // So we just do nothing on our side. - if (!win.mWillReplaceWindow) { - focusMayChange = tryStartExitingAnimation( - win, winAnimator, isDefaultDisplay, focusMayChange); - } - result |= RELAYOUT_RES_SURFACE_CHANGED; - } if (viewVisibility == View.VISIBLE && winAnimator.hasSurface()) { // We already told the client to go invisible, but the message may not be // handled yet, or it might want to draw a last frame. If we already have a @@ -2116,6 +2125,10 @@ public class WindowManagerService extends IWindowManager.Stub win.setLastReportedMergedConfiguration(mergedConfiguration); + // Update the last inset values here because the values are sent back to the client. + // The last inset values represent the last client state. + win.updateLastInsetValues(); + outFrame.set(win.mCompatFrame); outOverscanInsets.set(win.mOverscanInsets); outContentInsets.set(win.mContentInsets); @@ -7397,7 +7410,8 @@ public class WindowManagerService extends IWindowManager.Stub } void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) { - if (!win.hideNonSystemOverlayWindowsWhenVisible()) { + if (!win.hideNonSystemOverlayWindowsWhenVisible() + && !mHidingNonSystemOverlayWindows.contains(win)) { return; } final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty(); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 875334413b5a..0a6ff6da6e7a 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -50,6 +50,8 @@ import static android.app.admin.DevicePolicyManager.ID_TYPE_IMEI; import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID; import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL; import static android.app.admin.DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED; +import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_HOME; +import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX; import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED; import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER; @@ -9817,6 +9819,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public void setLockTaskFeatures(ComponentName who, int flags) { Preconditions.checkNotNull(who, "ComponentName is null"); + + // Throw if Overview is used without Home. + boolean hasHome = (flags & LOCK_TASK_FEATURE_HOME) != 0; + boolean hasOverview = (flags & LOCK_TASK_FEATURE_OVERVIEW) != 0; + Preconditions.checkArgument(hasHome || !hasOverview, + "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME"); + final int userHandle = mInjector.userHandleGetCallingUserId(); synchronized (this) { enforceCanCallLockTaskLocked(who); @@ -10410,7 +10419,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { public CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId) { synchronized (DevicePolicyManagerService.this) { DevicePolicyData policy = getUserData(userId); - if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING)) { + if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING, + UserHandle.of(userId))) { Log.e(LOG_TAG, "printing is enabled"); return null; } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 61c8b79ae3ce..5b5de0e94eca 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1088,8 +1088,8 @@ public final class SystemServer { traceBeginAndSlog("StartNetworkPolicyManagerService"); try { - networkPolicy = new NetworkPolicyManagerService(context, - mActivityManagerService, networkStats, networkManagement); + networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService, + networkManagement); ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy); } catch (Throwable e) { reportWtf("starting NetworkPolicy Service", e); @@ -1270,7 +1270,8 @@ public final class SystemServer { if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST) || mPackageManager.hasSystemFeature( - PackageManager.FEATURE_USB_ACCESSORY)) { + PackageManager.FEATURE_USB_ACCESSORY) + || isEmulator) { // Manage USB host and device support traceBeginAndSlog("StartUsbService"); mSystemServiceManager.startService(USB_SERVICE_CLASS); diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java index d3a97b3851f4..1f370a574231 100644 --- a/services/net/java/android/net/ip/IpClient.java +++ b/services/net/java/android/net/ip/IpClient.java @@ -72,6 +72,7 @@ import java.util.Objects; import java.util.List; import java.util.Set; import java.util.StringJoiner; +import java.util.concurrent.CountDownLatch; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -100,6 +101,11 @@ public class IpClient extends StateMachine { /** * Callbacks for handling IpClient events. + * + * These methods are called by IpClient on its own thread. Implementations + * of this class MUST NOT carry out long-running computations or hold locks + * for which there might be contention with other code calling public + * methods of the same IpClient instance. */ public static class Callback { // In order to receive onPreDhcpAction(), call #withPreDhcpAction() @@ -545,6 +551,7 @@ public class IpClient extends StateMachine { private final String mClatInterfaceName; @VisibleForTesting protected final Callback mCallback; + private final CountDownLatch mShutdownLatch; private final INetworkManagementService mNwService; private final NetlinkTracker mNetlinkTracker; private final WakeupMessage mProvisioningTimeoutAlarm; @@ -597,6 +604,7 @@ public class IpClient extends StateMachine { mInterfaceName = ifName; mClatInterfaceName = CLAT_PREFIX + ifName; mCallback = new LoggingCallbackWrapper(callback); + mShutdownLatch = new CountDownLatch(1); mNwService = nwService; mLog = new SharedLog(MAX_LOG_RECORDS, mTag); @@ -704,6 +712,7 @@ public class IpClient extends StateMachine { @Override protected void onQuitting() { mCallback.onQuit(); + mShutdownLatch.countDown(); } // Shut down this IpClient instance altogether. @@ -712,6 +721,17 @@ public class IpClient extends StateMachine { sendMessage(CMD_TERMINATE_AFTER_STOP); } + // In order to avoid deadlock, this method MUST NOT be called on the + // IpClient instance's thread. This prohibition includes code executed by + // when methods on the passed-in IpClient.Callback instance are called. + public void awaitShutdown() { + try { + mShutdownLatch.await(); + } catch (InterruptedException e) { + mLog.e("Interrupted while awaiting shutdown: " + e); + } + } + public static ProvisioningConfiguration.Builder buildProvisioningConfiguration() { return new ProvisioningConfiguration.Builder(); } diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java index e8620edc9d5e..83a125d1fc36 100644 --- a/services/print/java/com/android/server/print/PrintManagerService.java +++ b/services/print/java/com/android/server/print/PrintManagerService.java @@ -718,7 +718,8 @@ public final class PrintManagerService extends SystemService { } private boolean isPrintingEnabled() { - return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING); + return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING, + Binder.getCallingUserHandle()); } private void dump(@NonNull DualDumpOutputStream dumpStream, diff --git a/services/print/java/com/android/server/print/RemotePrintService.java b/services/print/java/com/android/server/print/RemotePrintService.java index f72d8eee7b9b..d4cbe7b1cf66 100644 --- a/services/print/java/com/android/server/print/RemotePrintService.java +++ b/services/print/java/com/android/server/print/RemotePrintService.java @@ -18,6 +18,7 @@ package com.android.server.print; import static com.android.internal.print.DumpUtils.writePrinterId; import static com.android.internal.util.dump.DumpUtils.writeComponentName; +import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import android.annotation.FloatRange; import android.annotation.NonNull; @@ -33,8 +34,6 @@ import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; -import android.os.Looper; -import android.os.Message; import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.os.UserHandle; @@ -86,8 +85,6 @@ final class RemotePrintService implements DeathRecipient { private final RemotePrintServiceClient mPrintServiceClient; - private final Handler mHandler; - private IPrintService mPrintService; private boolean mBinding; @@ -128,7 +125,6 @@ final class RemotePrintService implements DeathRecipient { mIntent = new Intent().setComponent(mComponentName); mUserId = userId; mSpooler = spooler; - mHandler = new MyHandler(context.getMainLooper()); mPrintServiceClient = new RemotePrintServiceClient(this); } @@ -137,7 +133,8 @@ final class RemotePrintService implements DeathRecipient { } public void destroy() { - mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleDestroy, this)); } private void handleDestroy() { @@ -163,7 +160,8 @@ final class RemotePrintService implements DeathRecipient { @Override public void binderDied() { - mHandler.sendEmptyMessage(MyHandler.MSG_BINDER_DIED); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleBinderDied, this)); } private void handleBinderDied() { @@ -177,7 +175,8 @@ final class RemotePrintService implements DeathRecipient { } public void onAllPrintJobsHandled() { - mHandler.sendEmptyMessage(MyHandler.MSG_ON_ALL_PRINT_JOBS_HANDLED); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleOnAllPrintJobsHandled, this)); } private void handleOnAllPrintJobsHandled() { @@ -209,8 +208,8 @@ final class RemotePrintService implements DeathRecipient { } public void onRequestCancelPrintJob(PrintJobInfo printJob) { - mHandler.obtainMessage(MyHandler.MSG_ON_REQUEST_CANCEL_PRINT_JOB, - printJob).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleRequestCancelPrintJob, this, printJob)); } private void handleRequestCancelPrintJob(final PrintJobInfo printJob) { @@ -235,8 +234,8 @@ final class RemotePrintService implements DeathRecipient { } public void onPrintJobQueued(PrintJobInfo printJob) { - mHandler.obtainMessage(MyHandler.MSG_ON_PRINT_JOB_QUEUED, - printJob).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleOnPrintJobQueued, this, printJob)); } private void handleOnPrintJobQueued(final PrintJobInfo printJob) { @@ -262,7 +261,8 @@ final class RemotePrintService implements DeathRecipient { } public void createPrinterDiscoverySession() { - mHandler.sendEmptyMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleCreatePrinterDiscoverySession, this)); } private void handleCreatePrinterDiscoverySession() { @@ -288,7 +288,8 @@ final class RemotePrintService implements DeathRecipient { } public void destroyPrinterDiscoverySession() { - mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY_PRINTER_DISCOVERY_SESSION); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleDestroyPrinterDiscoverySession, this)); } private void handleDestroyPrinterDiscoverySession() { @@ -325,8 +326,8 @@ final class RemotePrintService implements DeathRecipient { } public void startPrinterDiscovery(List<PrinterId> priorityList) { - mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_DISCOVERY, - priorityList).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStartPrinterDiscovery, this, priorityList)); } private void handleStartPrinterDiscovery(final List<PrinterId> priorityList) { @@ -356,7 +357,8 @@ final class RemotePrintService implements DeathRecipient { } public void stopPrinterDiscovery() { - mHandler.sendEmptyMessage(MyHandler.MSG_STOP_PRINTER_DISCOVERY); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStopPrinterDiscovery, this)); } private void handleStopPrinterDiscovery() { @@ -387,8 +389,8 @@ final class RemotePrintService implements DeathRecipient { } public void validatePrinters(List<PrinterId> printerIds) { - mHandler.obtainMessage(MyHandler.MSG_VALIDATE_PRINTERS, - printerIds).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleValidatePrinters, this, printerIds)); } private void handleValidatePrinters(final List<PrinterId> printerIds) { @@ -413,8 +415,8 @@ final class RemotePrintService implements DeathRecipient { } public void startPrinterStateTracking(@NonNull PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_STATE_TRACKING, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStartPrinterStateTracking, this, printerId)); } /** @@ -424,8 +426,8 @@ final class RemotePrintService implements DeathRecipient { * @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon */ public void requestCustomPrinterIcon(@NonNull PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_REQUEST_CUSTOM_PRINTER_ICON, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleRequestCustomPrinterIcon, this, printerId)); } /** @@ -481,8 +483,8 @@ final class RemotePrintService implements DeathRecipient { } public void stopPrinterStateTracking(PrinterId printerId) { - mHandler.obtainMessage(MyHandler.MSG_STOP_PRINTER_STATE_TRACKING, - printerId).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + RemotePrintService::handleStopPrinterStateTracking, this, printerId)); } private void handleStopPrinterStateTracking(final PrinterId printerId) { @@ -672,96 +674,6 @@ final class RemotePrintService implements DeathRecipient { } } - private final class MyHandler extends Handler { - public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1; - public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2; - public static final int MSG_START_PRINTER_DISCOVERY = 3; - public static final int MSG_STOP_PRINTER_DISCOVERY = 4; - public static final int MSG_VALIDATE_PRINTERS = 5; - public static final int MSG_START_PRINTER_STATE_TRACKING = 6; - public static final int MSG_STOP_PRINTER_STATE_TRACKING = 7; - public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 8; - public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 9; - public static final int MSG_ON_PRINT_JOB_QUEUED = 10; - public static final int MSG_DESTROY = 11; - public static final int MSG_BINDER_DIED = 12; - public static final int MSG_REQUEST_CUSTOM_PRINTER_ICON = 13; - - public MyHandler(Looper looper) { - super(looper, null, false); - } - - @Override - @SuppressWarnings("unchecked") - public void handleMessage(Message message) { - if (mDestroyed) { - Slog.w(LOG_TAG, "Not handling " + message + " as service for " + mComponentName - + " is already destroyed"); - return; - } - switch (message.what) { - case MSG_CREATE_PRINTER_DISCOVERY_SESSION: { - handleCreatePrinterDiscoverySession(); - } break; - - case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: { - handleDestroyPrinterDiscoverySession(); - } break; - - case MSG_START_PRINTER_DISCOVERY: { - List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj; - handleStartPrinterDiscovery(priorityList); - } break; - - case MSG_STOP_PRINTER_DISCOVERY: { - handleStopPrinterDiscovery(); - } break; - - case MSG_VALIDATE_PRINTERS: { - List<PrinterId> printerIds = (List<PrinterId>) message.obj; - handleValidatePrinters(printerIds); - } break; - - case MSG_START_PRINTER_STATE_TRACKING: { - PrinterId printerId = (PrinterId) message.obj; - handleStartPrinterStateTracking(printerId); - } break; - - case MSG_STOP_PRINTER_STATE_TRACKING: { - PrinterId printerId = (PrinterId) message.obj; - handleStopPrinterStateTracking(printerId); - } break; - - case MSG_ON_ALL_PRINT_JOBS_HANDLED: { - handleOnAllPrintJobsHandled(); - } break; - - case MSG_ON_REQUEST_CANCEL_PRINT_JOB: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - handleRequestCancelPrintJob(printJob); - } break; - - case MSG_ON_PRINT_JOB_QUEUED: { - PrintJobInfo printJob = (PrintJobInfo) message.obj; - handleOnPrintJobQueued(printJob); - } break; - - case MSG_DESTROY: { - handleDestroy(); - } break; - - case MSG_BINDER_DIED: { - handleBinderDied(); - } break; - - case MSG_REQUEST_CUSTOM_PRINTER_ICON: { - PrinterId printerId = (PrinterId) message.obj; - handleRequestCustomPrinterIcon(printerId); - } break; - } - } - } - private static final class RemotePrintServiceClient extends IPrintServiceClient.Stub { private final WeakReference<RemotePrintService> mWeakService; diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java index 84c1bb272b5a..62185d782cbc 100644 --- a/services/print/java/com/android/server/print/UserState.java +++ b/services/print/java/com/android/server/print/UserState.java @@ -38,7 +38,6 @@ import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.graphics.drawable.Icon; import android.net.Uri; -import android.os.AsyncTask; import android.os.Binder; import android.os.Bundle; import android.os.Handler; @@ -46,7 +45,6 @@ import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.IInterface; import android.os.Looper; -import android.os.Message; import android.os.RemoteCallbackList; import android.os.RemoteException; import android.os.UserHandle; @@ -82,6 +80,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.os.BackgroundThread; import com.android.internal.util.dump.DualDumpOutputStream; +import com.android.internal.util.function.pooled.PooledLambda; import com.android.server.print.RemotePrintService.PrintServiceCallbacks; import com.android.server.print.RemotePrintServiceRecommendationService .RemotePrintServiceRecommendationServiceCallbacks; @@ -94,6 +93,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.IntSupplier; /** * Represents the print state for a user. @@ -135,8 +135,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, private final RemotePrintSpooler mSpooler; - private final Handler mHandler; - private PrinterDiscoverySessionMediator mPrinterDiscoverySession; private List<PrintJobStateChangeListenerRecord> mPrintJobStateChangeListenerRecords; @@ -162,7 +160,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, mUserId = userId; mLock = lock; mSpooler = new RemotePrintSpooler(context, userId, lowPriority, this); - mHandler = new UserStateHandler(context.getMainLooper()); synchronized (mLock) { readInstalledPrintServicesLocked(); @@ -173,9 +170,7 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, // Some print services might have gotten installed before the User State came up prunePrintServices(); - synchronized (mLock) { - onConfigurationChangedLocked(); - } + onConfigurationChanged(); } public void increasePriority() { @@ -236,15 +231,6 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, return null; } - // Spin the spooler to add the job and show the config UI. - new AsyncTask<Void, Void, Void>() { - @Override - protected Void doInBackground(Void... params) { - mSpooler.createPrintJob(printJob); - return null; - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null); - final long identity = Binder.clearCallingIdentity(); try { Intent intent = new Intent(PrintManager.ACTION_PRINT_DIALOG); @@ -705,18 +691,22 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, @Override public void onPrintJobStateChanged(PrintJobInfo printJob) { mPrintJobForAppCache.onPrintJobStateChanged(printJob); - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_JOB_STATE_CHANGED, - printJob.getAppId(), 0, printJob.getId()).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintJobStateChanged, + this, printJob.getId(), + PooledLambda.obtainSupplier(printJob.getAppId()).recycleOnUse())); } public void onPrintServicesChanged() { - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_CHANGED).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintServicesChanged, this)); } @Override public void onPrintServiceRecommendationsUpdated(List<RecommendationInfo> recommendations) { - mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED, - 0, 0, recommendations).sendToTarget(); + Handler.getMain().sendMessage(obtainMessage( + UserState::handleDispatchPrintServiceRecommendationsUpdated, + this, recommendations)); } @Override @@ -781,8 +771,8 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, mActiveServices.remove(service.getComponentName()); // The service might need to be restarted if it died because of an update - mHandler.sendMessageDelayed( - mHandler.obtainMessage(UserStateHandler.MSG_CHECK_CONFIG_CHANGED), + Handler.getMain().sendMessageDelayed(obtainMessage( + UserState::onConfigurationChanged, this), SERVICE_RESTART_DELAY_MILLIS); // No session - nothing to do. @@ -1122,24 +1112,26 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - private void handleDispatchPrintJobStateChanged(PrintJobId printJobId, int appId) { + private void handleDispatchPrintJobStateChanged( + PrintJobId printJobId, IntSupplier appIdSupplier) { + int appId = appIdSupplier.getAsInt(); final List<PrintJobStateChangeListenerRecord> records; synchronized (mLock) { if (mPrintJobStateChangeListenerRecords == null) { return; } - records = new ArrayList<PrintJobStateChangeListenerRecord>( - mPrintJobStateChangeListenerRecords); + records = new ArrayList<>(mPrintJobStateChangeListenerRecords); } final int recordCount = records.size(); for (int i = 0; i < recordCount; i++) { PrintJobStateChangeListenerRecord record = records.get(i); if (record.appId == PrintManager.APP_ID_ANY - || record.appId == appId) - try { - record.listener.onPrintJobStateChanged(printJobId); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error notifying for print job state change", re); + || record.appId == appId) { + try { + record.listener.onPrintJobStateChanged(printJobId); + } catch (RemoteException re) { + Log.e(LOG_TAG, "Error notifying for print job state change", re); + } } } } @@ -1187,38 +1179,9 @@ final class UserState implements PrintSpoolerCallbacks, PrintServiceCallbacks, } } - private final class UserStateHandler extends Handler { - public static final int MSG_DISPATCH_PRINT_JOB_STATE_CHANGED = 1; - public static final int MSG_DISPATCH_PRINT_SERVICES_CHANGED = 2; - public static final int MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED = 3; - public static final int MSG_CHECK_CONFIG_CHANGED = 4; - - public UserStateHandler(Looper looper) { - super(looper, null, false); - } - - @Override - public void handleMessage(Message message) { - switch (message.what) { - case MSG_DISPATCH_PRINT_JOB_STATE_CHANGED: - PrintJobId printJobId = (PrintJobId) message.obj; - final int appId = message.arg1; - handleDispatchPrintJobStateChanged(printJobId, appId); - break; - case MSG_DISPATCH_PRINT_SERVICES_CHANGED: - handleDispatchPrintServicesChanged(); - break; - case MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED: - handleDispatchPrintServiceRecommendationsUpdated( - (List<RecommendationInfo>) message.obj); - break; - case MSG_CHECK_CONFIG_CHANGED: - synchronized (mLock) { - onConfigurationChangedLocked(); - } - default: - // not reached - } + private void onConfigurationChanged() { + synchronized (mLock) { + onConfigurationChangedLocked(); } } diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk index d825533e92f5..cd8163dd4852 100644 --- a/services/robotests/Android.mk +++ b/services/robotests/Android.mk @@ -58,14 +58,14 @@ INTERNAL_BACKUP := ../../core/java/com/android/internal/backup LOCAL_SRC_FILES := \ $(call all-java-files-under, src) \ $(call all-Iaidl-files-under, $(INTERNAL_BACKUP)) \ + $(call all-java-files-under, ../../core/java/android/app/backup) \ + $(call all-Iaidl-files-under, ../../core/java/android/app/backup) \ ../../core/java/android/content/pm/PackageInfo.java \ - ../../core/java/android/app/backup/BackupAgent.java \ - ../../core/java/android/app/backup/BackupDataOutput.java \ - ../../core/java/android/app/backup/FullBackupDataOutput.java \ ../../core/java/android/app/IBackupAgent.aidl LOCAL_AIDL_INCLUDES := \ $(call all-Iaidl-files-under, $(INTERNAL_BACKUP)) \ + $(call all-Iaidl-files-under, ../../core/java/android/app/backup) \ ../../core/java/android/app/IBackupAgent.aidl LOCAL_STATIC_JAVA_LIBRARIES := \ diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java index d0e665890b5e..83727782a01c 100644 --- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java +++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java @@ -48,7 +48,6 @@ import android.app.backup.BackupDataInput; import android.app.backup.BackupDataOutput; import android.app.backup.BackupManager; import android.app.backup.BackupTransport; -import android.app.backup.FullBackupDataOutput; import android.app.backup.IBackupManager; import android.app.backup.IBackupManagerMonitor; import android.app.backup.IBackupObserver; @@ -76,11 +75,11 @@ import com.android.server.backup.transport.TransportClient; import com.android.server.testing.FrameworkRobolectricTestRunner; import com.android.server.testing.SystemLoaderClasses; import com.android.server.testing.SystemLoaderPackages; -import com.android.server.testing.shadows.FrameworkShadowPackageManager; import com.android.server.testing.shadows.ShadowBackupDataInput; import com.android.server.testing.shadows.ShadowBackupDataOutput; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; @@ -90,7 +89,6 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; -import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowLooper; import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.shadows.ShadowQueuedWork; @@ -106,17 +104,13 @@ import java.util.stream.Stream; manifest = Config.NONE, sdk = 26, shadows = { - FrameworkShadowPackageManager.class, ShadowBackupDataInput.class, ShadowBackupDataOutput.class, ShadowQueuedWork.class } ) -@SystemLoaderPackages({"com.android.server.backup"}) +@SystemLoaderPackages({"com.android.server.backup", "android.app.backup"}) @SystemLoaderClasses({ - BackupDataOutput.class, - FullBackupDataOutput.class, - BackupAgent.class, IBackupTransport.class, IBackupAgent.class, PackageInfo.class @@ -154,7 +148,7 @@ public class PerformBackupTaskTest { assertThat(dataDir.mkdir()).isTrue(); PackageManager packageManager = application.getPackageManager(); - mShadowPackageManager = Shadow.extract(packageManager); + mShadowPackageManager = shadowOf(packageManager); mWakeLock = createBackupWakeLock(application); @@ -496,8 +490,9 @@ public class PerformBackupTaskTest { } // TODO: Giving NPE at PerformBackupTask:524 because mCurrentPackage is null (PackageManager - // rightfully threw NameNotFoundException). Uncomment @Test when fixed. - // @Test + // rightfully threw NameNotFoundException). Remove @Ignore when fixed. + @Ignore + @Test public void testRunTask_whenAgentUnknown() throws Exception { // Not calling setUpAgent() TransportMock transportMock = setUpTransport(mTransport); diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java index 32697bd57c51..02514b82ffba 100644 --- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java +++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java @@ -30,7 +30,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.robolectric.shadow.api.Shadow.extract; +import static org.robolectric.Shadows.shadowOf; import static org.testng.Assert.expectThrows; import static java.util.Arrays.asList; @@ -58,7 +58,6 @@ import com.android.server.backup.transport.TransportNotRegisteredException; import com.android.server.testing.FrameworkRobolectricTestRunner; import com.android.server.testing.SystemLoaderPackages; import com.android.server.testing.shadows.FrameworkShadowContextImpl; -import com.android.server.testing.shadows.FrameworkShadowPackageManager; import org.junit.Before; import org.junit.Test; @@ -79,7 +78,7 @@ import java.util.stream.Stream; @Config( manifest = Config.NONE, sdk = 26, - shadows = {FrameworkShadowPackageManager.class, FrameworkShadowContextImpl.class} + shadows = {FrameworkShadowContextImpl.class} ) @SystemLoaderPackages({"com.android.server.backup"}) @Presubmit @@ -107,8 +106,7 @@ public class TransportManagerTest { MockitoAnnotations.initMocks(this); mContext = RuntimeEnvironment.application; - mShadowPackageManager = - (FrameworkShadowPackageManager) extract(mContext.getPackageManager()); + mShadowPackageManager = shadowOf(mContext.getPackageManager()); mTransportA1 = genericTransport(PACKAGE_A, "TransportFoo"); mTransportA2 = genericTransport(PACKAGE_A, "TransportBar"); diff --git a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java b/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java deleted file mode 100644 index 5cdbe7ff09ba..000000000000 --- a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2017 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.testing.shadows; - -import android.app.ApplicationPackageManager; -import android.content.Intent; -import android.content.pm.ResolveInfo; -import java.util.List; -import org.robolectric.annotation.Implements; -import org.robolectric.shadows.ShadowApplicationPackageManager; - -/** Extension of ShadowApplicationPackageManager */ -@Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true) -public class FrameworkShadowPackageManager extends ShadowApplicationPackageManager { - @Override - public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) { - return queryIntentServices(intent, flags); - } -} diff --git a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java index 90db2a328c6f..b62f1ceb4596 100644 --- a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java +++ b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java @@ -15,6 +15,9 @@ */ package com.android.server; +import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; + import static com.android.server.AppStateTracker.TARGET_OP; import static org.junit.Assert.assertEquals; @@ -72,6 +75,7 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; import java.util.ArrayList; import java.util.Arrays; @@ -187,6 +191,9 @@ public class AppStateTrackerTest { private final HashMap<String, Integer> mGlobalSettings = new HashMap<>(); + private Answer<List<PackageOps>> mGetPackagesForOps = + inv -> new ArrayList<PackageOps>(); + @Before public void setUp() { mMainHandler = new Handler(Looper.getMainLooper()); @@ -226,7 +233,7 @@ public class AppStateTrackerTest { .thenAnswer(inv -> getPowerSaveState()); when(mMockAppOpsManager.getPackagesForOps( any(int[].class) - )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>()); + )).thenAnswer(mGetPackagesForOps); mMockContentResolver = new MockContentResolver(); when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver); @@ -612,7 +619,7 @@ public class AppStateTrackerTest { // Exempt package 2 on user-10. mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 10, false, - UsageStatsManager.STANDBY_BUCKET_EXEMPTED); + UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT); areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); @@ -624,7 +631,7 @@ public class AppStateTrackerTest { // Exempt package 1 on user-0. mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_1, /*user=*/ 0, false, - UsageStatsManager.STANDBY_BUCKET_EXEMPTED); + UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT); areRestricted(instance, UID_1, PACKAGE_1, NONE); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); @@ -632,7 +639,7 @@ public class AppStateTrackerTest { // Unexempt package 2 on user-10. mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 10, false, - UsageStatsManager.STANDBY_BUCKET_ACTIVE); + UsageStatsManager.STANDBY_BUCKET_ACTIVE, REASON_MAIN_USAGE); areRestricted(instance, UID_1, PACKAGE_1, NONE); areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS); @@ -644,9 +651,9 @@ public class AppStateTrackerTest { mPowerSaveObserver.accept(getPowerSaveState()); mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_1, /*user=*/ 0, false, - UsageStatsManager.STANDBY_BUCKET_EXEMPTED); + UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT); mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 0, false, - UsageStatsManager.STANDBY_BUCKET_EXEMPTED); + UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT); setAppOps(UID_1, PACKAGE_1, true); @@ -657,6 +664,7 @@ public class AppStateTrackerTest { areRestrictedWithExemption(instance, UID_2, PACKAGE_2, NONE); } + @Test public void loadPersistedAppOps() throws Exception { final AppStateTrackerTestable instance = newInstance(); @@ -700,6 +708,13 @@ public class AppStateTrackerTest { ops.add(new PackageOps(PACKAGE_3, UID_10_3, entries)); + mGetPackagesForOps = inv -> { + final int[] arg = (int[]) inv.getArgument(0); + assertEquals(1, arg.length); + assertEquals(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, arg[0]); + return ops; + }; + callStart(instance); assertFalse(instance.isRunAnyInBackgroundAppOpsAllowed(UID_1, PACKAGE_1)); diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java index e1b4422c83c4..d31d550ae902 100644 --- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java @@ -26,6 +26,9 @@ import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND; import static android.net.NetworkPolicyManager.POLICY_NONE; import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND; import static android.net.NetworkPolicyManager.uidPoliciesToString; +import static android.net.NetworkStats.IFACE_ALL; +import static android.net.NetworkStats.SET_ALL; +import static android.net.NetworkStats.TAG_ALL; import static android.net.NetworkTemplate.buildTemplateMobileAll; import static android.net.TrafficStats.MB_IN_BYTES; import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED; @@ -42,8 +45,6 @@ import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOO import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID; import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING; -import static com.google.common.truth.Truth.assertThat; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -86,7 +87,6 @@ import android.net.ConnectivityManager; import android.net.IConnectivityManager; import android.net.INetworkManagementEventObserver; import android.net.INetworkPolicyListener; -import android.net.INetworkStatsService; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; @@ -105,6 +105,7 @@ import android.os.PowerManagerInternal; import android.os.PowerSaveState; import android.os.RemoteException; import android.os.SimpleClock; +import android.os.SystemClock; import android.os.UserHandle; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; @@ -125,6 +126,7 @@ import com.android.internal.util.test.BroadcastInterceptingContext; import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent; import com.android.server.net.NetworkPolicyManagerInternal; import com.android.server.net.NetworkPolicyManagerService; +import com.android.server.net.NetworkStatsManagerInternal; import libcore.io.IoUtils; import libcore.io.Streams; @@ -214,7 +216,6 @@ public class NetworkPolicyManagerServiceTest { private String mNetpolicyXml; private @Mock IActivityManager mActivityManager; - private @Mock INetworkStatsService mStatsService; private @Mock INetworkManagementService mNetworkManager; private @Mock IConnectivityManager mConnManager; private @Mock NotificationManager mNotifManager; @@ -224,7 +225,8 @@ public class NetworkPolicyManagerServiceTest { private @Mock CarrierConfigManager mCarrierConfigManager; private @Mock TelephonyManager mTelephonyManager; - private static ActivityManagerInternal mActivityManagerInternal; + private ActivityManagerInternal mActivityManagerInternal; + private NetworkStatsManagerInternal mStatsService; private IUidObserver mUidObserver; private INetworkManagementEventObserver mNetworkObserver; @@ -264,6 +266,8 @@ public class NetworkPolicyManagerServiceTest { private static final int UID_F = UserHandle.getUid(USER_ID, APP_ID_F); private static final String PKG_NAME_A = "name.is.A,pkg.A"; + private static final String PKG_NAME_B = "name.is.B,pkg.B"; + private static final String PKG_NAME_C = "name.is.C,pkg.C"; public final @Rule NetPolicyMethodRule mNetPolicyXmlRule = new NetPolicyMethodRule(); @@ -287,6 +291,8 @@ public class NetworkPolicyManagerServiceTest { .setBatterySaverEnabled(false).build(); final PowerManagerInternal pmInternal = addLocalServiceMock(PowerManagerInternal.class); when(pmInternal.getLowPowerState(anyInt())).thenReturn(state); + + mStatsService = addLocalServiceMock(NetworkStatsManagerInternal.class); } @Before @@ -347,7 +353,7 @@ public class NetworkPolicyManagerServiceTest { eq(ActivityManager.PROCESS_STATE_UNKNOWN), isNull(String.class)); mFutureIntent = newRestrictBackgroundChangedFuture(); - mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService, + mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mNetworkManager, mIpm, mClock, mPolicyDir, true); mService.bindConnectivityManager(mConnManager); mPolicyListener = new NetworkPolicyListenerAnswer(mService); @@ -375,6 +381,14 @@ public class NetworkPolicyManagerServiceTest { when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt())) .thenReturn(new ApplicationInfo()); when(mPackageManager.getPackagesForUid(UID_A)).thenReturn(new String[] {PKG_NAME_A}); + when(mPackageManager.getPackagesForUid(UID_B)).thenReturn(new String[] {PKG_NAME_B}); + when(mPackageManager.getPackagesForUid(UID_C)).thenReturn(new String[] {PKG_NAME_C}); + when(mPackageManager.getApplicationInfo(eq(PKG_NAME_A), anyInt())) + .thenReturn(buildApplicationInfo(PKG_NAME_A)); + when(mPackageManager.getApplicationInfo(eq(PKG_NAME_B), anyInt())) + .thenReturn(buildApplicationInfo(PKG_NAME_B)); + when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt())) + .thenReturn(buildApplicationInfo(PKG_NAME_C)); when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true); when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true); @@ -409,6 +423,7 @@ public class NetworkPolicyManagerServiceTest { LocalServices.removeServiceForTest(PowerManagerInternal.class); LocalServices.removeServiceForTest(DeviceIdleController.LocalService.class); LocalServices.removeServiceForTest(UsageStatsManagerInternal.class); + LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class); } @After @@ -515,7 +530,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); // RestrictBackground should be on even though battery saver want to turn it off - assertThat(mService.getRestrictBackground()).isTrue(); + assertTrue(mService.getRestrictBackground()); PowerSaveState stateOff = new PowerSaveState.Builder() .setGlobalBatterySaverEnabled(false) @@ -524,7 +539,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); // RestrictBackground should be on, following its previous state - assertThat(mService.getRestrictBackground()).isTrue(); + assertTrue(mService.getRestrictBackground()); } @Test @@ -539,7 +554,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); // RestrictBackground should be turned on because of battery saver - assertThat(mService.getRestrictBackground()).isTrue(); + assertTrue(mService.getRestrictBackground()); PowerSaveState stateOff = new PowerSaveState.Builder() .setGlobalBatterySaverEnabled(false) @@ -548,7 +563,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); // RestrictBackground should be off, following its previous state - assertThat(mService.getRestrictBackground()).isFalse(); + assertFalse(mService.getRestrictBackground()); } @Test @@ -562,7 +577,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOn); // RestrictBackground should still be on - assertThat(mService.getRestrictBackground()).isTrue(); + assertTrue(mService.getRestrictBackground()); // User turns off RestrictBackground manually setRestrictBackground(false); @@ -571,7 +586,7 @@ public class NetworkPolicyManagerServiceTest { mService.updateRestrictBackgroundByLowPowerModeUL(stateOff); // RestrictBackground should be off because user changes it manually - assertThat(mService.getRestrictBackground()).isFalse(); + assertFalse(mService.getRestrictBackground()); } private void removeRestrictBackgroundWhitelist(boolean expectIntent) throws Exception { @@ -974,6 +989,7 @@ public class NetworkPolicyManagerServiceTest { public void testNotificationWarningLimitSnooze() throws Exception { // Create a place to store fake usage final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1)); + final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) .thenAnswer(new Answer<Long>() { @Override @@ -983,6 +999,13 @@ public class NetworkPolicyManagerServiceTest { return entry.rxBytes + entry.txBytes; } }); + when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong())) + .thenAnswer(new Answer<NetworkStats>() { + @Override + public NetworkStats answer(InvocationOnMock invocation) throws Throwable { + return stats; + } + }); // Get active mobile network in place expectMobileDefaults(); @@ -1003,7 +1026,7 @@ public class NetworkPolicyManagerServiceTest { // Normal usage means no notification { - history.removeBucketsBefore(Long.MAX_VALUE); + history.clear(); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0)); @@ -1020,7 +1043,7 @@ public class NetworkPolicyManagerServiceTest { // Push over warning { - history.removeBucketsBefore(Long.MAX_VALUE); + history.clear(); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1799), 0L, 0L, 0L, 0)); @@ -1038,7 +1061,7 @@ public class NetworkPolicyManagerServiceTest { // Push over limit { - history.removeBucketsBefore(Long.MAX_VALUE); + history.clear(); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1810), 0L, 0L, 0L, 0)); @@ -1073,6 +1096,7 @@ public class NetworkPolicyManagerServiceTest { public void testNotificationRapid() throws Exception { // Create a place to store fake usage final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1)); + final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0); when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong())) .thenAnswer(new Answer<Long>() { @Override @@ -1082,6 +1106,13 @@ public class NetworkPolicyManagerServiceTest { return entry.rxBytes + entry.txBytes; } }); + when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong())) + .thenAnswer(new Answer<NetworkStats>() { + @Override + public NetworkStats answer(InvocationOnMock invocation) throws Throwable { + return stats; + } + }); // Get active mobile network in place expectMobileDefaults(); @@ -1102,7 +1133,7 @@ public class NetworkPolicyManagerServiceTest { // Using 20% data in 20% time is normal { - history.removeBucketsBefore(Long.MAX_VALUE); + history.clear(); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0)); @@ -1111,16 +1142,58 @@ public class NetworkPolicyManagerServiceTest { verify(mNotifManager, never()).notifyAsUser(any(), anyInt(), any(), any()); } - // Using 80% data in 20% time is alarming + // Using 80% data in 20% time is alarming; but spread equally among + // three UIDs means we get generic alert { - history.removeBucketsBefore(Long.MAX_VALUE); + history.clear(); history.recordData(start, end, new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1440), 0L, 0L, 0L, 0)); + stats.clear(); + stats.addValues(IFACE_ALL, UID_A, SET_ALL, TAG_ALL, + DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0); + stats.addValues(IFACE_ALL, UID_B, SET_ALL, TAG_ALL, + DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0); + stats.addValues(IFACE_ALL, UID_C, SET_ALL, TAG_ALL, + DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0); reset(mNotifManager); mService.updateNetworks(); + + final ArgumentCaptor<Notification> notif = ArgumentCaptor.forClass(Notification.class); verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_RAPID), - isA(Notification.class), eq(UserHandle.ALL)); + notif.capture(), eq(UserHandle.ALL)); + + final String text = notif.getValue().extras.getCharSequence(Notification.EXTRA_TEXT) + .toString(); + assertFalse(text.contains(PKG_NAME_A)); + assertFalse(text.contains(PKG_NAME_B)); + assertFalse(text.contains(PKG_NAME_C)); + } + + // Using 80% data in 20% time is alarming; but mostly done by one UID + // means we get specific alert + { + history.clear(); + history.recordData(start, end, + new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1440), 0L, 0L, 0L, 0)); + stats.clear(); + stats.addValues(IFACE_ALL, UID_A, SET_ALL, TAG_ALL, + DataUnit.MEGABYTES.toBytes(960), 0, 0, 0, 0); + stats.addValues(IFACE_ALL, UID_B, SET_ALL, TAG_ALL, + DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0); + + reset(mNotifManager); + mService.updateNetworks(); + + final ArgumentCaptor<Notification> notif = ArgumentCaptor.forClass(Notification.class); + verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_RAPID), + notif.capture(), eq(UserHandle.ALL)); + + final String text = notif.getValue().extras.getCharSequence(Notification.EXTRA_TEXT) + .toString(); + assertTrue(text.contains(PKG_NAME_A)); + assertFalse(text.contains(PKG_NAME_B)); + assertFalse(text.contains(PKG_NAME_C)); } } @@ -1411,6 +1484,12 @@ public class NetworkPolicyManagerServiceTest { true); } + private ApplicationInfo buildApplicationInfo(String label) { + final ApplicationInfo ai = new ApplicationInfo(); + ai.nonLocalizedLabel = label; + return ai; + } + private NetworkInfo buildNetworkInfo() { final NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_LTE, null, null); diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java index d3df9241283a..bfc31337134e 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java @@ -22,6 +22,8 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE; import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE; import static android.view.Display.DEFAULT_DISPLAY; +import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; +import static com.android.server.am.ActivityStack.ActivityState.DESTROYING; import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING; import static com.android.server.am.ActivityStack.ActivityState.PAUSING; import static com.android.server.am.ActivityStack.ActivityState.STOPPED; @@ -51,6 +53,7 @@ import android.util.MutableBoolean; import org.junit.runner.RunWith; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -109,7 +112,8 @@ public class ActivityRecordTests extends ActivityTestsBase { } // TODO: b/71582913 - //@Test + @Ignore("b/71582913") + @Test public void testPausingWhenVisibleFromStopped() throws Exception { final MutableBoolean pauseFound = new MutableBoolean(false); doAnswer((InvocationOnMock invocationOnMock) -> { @@ -119,20 +123,20 @@ public class ActivityRecordTests extends ActivityTestsBase { } return null; }).when(mActivity.app.thread).scheduleTransaction(any()); - mActivity.state = STOPPED; + mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped"); mActivity.makeVisibleIfNeeded(null /* starting */); - assertEquals(mActivity.state, PAUSING); + assertTrue(mActivity.isState(PAUSING)); assertTrue(pauseFound.value); // Make sure that the state does not change for current non-stopping states. - mActivity.state = INITIALIZING; + mActivity.setState(INITIALIZING, "testPausingWhenVisibleFromStopped"); mActivity.makeVisibleIfNeeded(null /* starting */); - assertEquals(mActivity.state, INITIALIZING); + assertTrue(mActivity.isState(INITIALIZING)); } @Test @@ -159,7 +163,7 @@ public class ActivityRecordTests extends ActivityTestsBase { when(mService.mWindowManager.getNavBarPosition()).thenReturn(navBarPosition); mTask.getConfiguration().windowConfiguration.setAppBounds(taskBounds); mActivity.info.maxAspectRatio = aspectRatio; - mActivity.ensureActivityConfigurationLocked( + mActivity.ensureActivityConfiguration( 0 /* globalChanges */, false /* preserveWindow */); assertEquals(expectedActivityBounds, mActivity.getBounds()); } @@ -197,7 +201,23 @@ public class ActivityRecordTests extends ActivityTestsBase { record.canBeLaunchedOnDisplay(DEFAULT_DISPLAY); - verify(mService.mStackSupervisor, times(1)).canPlaceEntityOnDisplay(anyInt(), eq(expected), anyInt(), anyInt(), - eq(record.info)); + verify(mService.mStackSupervisor, times(1)).canPlaceEntityOnDisplay(anyInt(), eq(expected), + anyInt(), anyInt(), eq(record.info)); + } + + @Test + public void testFinishingAfterDestroying() throws Exception { + assertFalse(mActivity.finishing); + mActivity.setState(DESTROYING, "testFinishingAfterDestroying"); + assertTrue(mActivity.isState(DESTROYING)); + assertTrue(mActivity.finishing); + } + + @Test + public void testFinishingAfterDestroyed() throws Exception { + assertFalse(mActivity.finishing); + mActivity.setState(DESTROYED, "testFinishingAfterDestroyed"); + assertTrue(mActivity.isState(DESTROYED)); + assertTrue(mActivity.finishing); } } diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java new file mode 100644 index 000000000000..ad21a789b201 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java @@ -0,0 +1,228 @@ +/* + * 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 com.android.server; + +import static android.app.AppOpsManager.MODE_ALLOWED; +import static android.app.AppOpsManager.MODE_ERRORED; +import static android.app.AppOpsManager.OP_READ_SMS; +import static android.app.AppOpsManager.OP_WRITE_SMS; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; + +import android.app.AppOpsManager.OpEntry; +import android.app.AppOpsManager.PackageOps; +import android.content.Context; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Process; +import android.support.test.InstrumentationRegistry; +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 java.io.File; +import java.util.List; + +/** + * Unit tests for AppOpsService. Covers functionality that is difficult to test using CTS tests + * or for which we can write more detailed unit tests than CTS tests (because the internal APIs are + * more finegrained data than the public ones). + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class AppOpsServiceTest { + + private static final String TAG = AppOpsServiceTest.class.getSimpleName(); + // State will be persisted into this XML file. + private static final String APP_OPS_FILENAME = "appops-service-test.xml"; + + private File mAppOpsFile; + private Context mContext; + private Handler mHandler; + private AppOpsService mAppOpsService; + private String mMyPackageName; + private int mMyUid; + private long mTestStartMillis; + + @Before + public void setUp() { + mContext = InstrumentationRegistry.getTargetContext(); + mAppOpsFile = new File(mContext.getFilesDir(), APP_OPS_FILENAME); + if (mAppOpsFile.exists()) { + // Start with a clean state (persisted into XML). + mAppOpsFile.delete(); + } + + HandlerThread handlerThread = new HandlerThread(TAG); + handlerThread.start(); + mHandler = new Handler(handlerThread.getLooper()); + mMyPackageName = mContext.getOpPackageName(); + mMyUid = Process.myUid(); + + mAppOpsService = new AppOpsService(mAppOpsFile, mHandler); + mAppOpsService.mContext = mContext; + mTestStartMillis = System.currentTimeMillis(); + } + + @Test + public void testGetOpsForPackage_noOpsLogged() { + assertThat(getLoggedOps()).isNull(); + } + + @Test + public void testNoteOperationAndGetOpsForPackage() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.setMode(OP_WRITE_SMS, mMyUid, mMyPackageName, MODE_ERRORED); + + // Note an op that's allowed. + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + List<PackageOps> loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + + // Note another op that's not allowed. + mAppOpsService.noteOperation(OP_WRITE_SMS, mMyUid, mMyPackageName); + loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED); + } + + // Tests the dumping and restoring of the in-memory state to/from XML. + @Test + public void testStatePersistence() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.setMode(OP_WRITE_SMS, mMyUid, mMyPackageName, MODE_ERRORED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + mAppOpsService.noteOperation(OP_WRITE_SMS, mMyUid, mMyPackageName); + mAppOpsService.writeState(); + + // Create a new app ops service, and initialize its state from XML. + mAppOpsService = new AppOpsService(mAppOpsFile, mHandler); + mAppOpsService.mContext = mContext; + mAppOpsService.readState(); + + // Query the state of the 2nd service. + List<PackageOps> loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED); + } + + // Tests that ops are persisted during shutdown. + @Test + public void testShutdown() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + mAppOpsService.shutdown(); + + // Create a new app ops service, and initialize its state from XML. + mAppOpsService = new AppOpsService(mAppOpsFile, mHandler); + mAppOpsService.mContext = mContext; + mAppOpsService.readState(); + + // Query the state of the 2nd service. + List<PackageOps> loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + } + + @Test + public void testGetOpsForPackage() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + + // Query all ops + List<PackageOps> loggedOps = mAppOpsService.getOpsForPackage( + mMyUid, mMyPackageName, null /* all ops */); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + + // Query specific ops + loggedOps = mAppOpsService.getOpsForPackage( + mMyUid, mMyPackageName, new int[]{OP_READ_SMS, OP_WRITE_SMS}); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + + // Query unknown UID + loggedOps = mAppOpsService.getOpsForPackage(mMyUid + 1, mMyPackageName, null /* all ops */); + assertThat(loggedOps).isNull(); + + // Query unknown package name + loggedOps = mAppOpsService.getOpsForPackage(mMyUid, "fake.package", null /* all ops */); + assertThat(loggedOps).isNull(); + + // Query op code that's not been logged + loggedOps = mAppOpsService.getOpsForPackage(mMyUid, mMyPackageName, + new int[]{OP_WRITE_SMS}); + assertThat(loggedOps).isNull(); + } + + @Test + public void testPackageRemoved() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + + List<PackageOps> loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + + mAppOpsService.packageRemoved(mMyUid, mMyPackageName); + assertThat(getLoggedOps()).isNull(); + } + + @Test + public void testUidRemoved() { + mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED); + mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName); + + List<PackageOps> loggedOps = getLoggedOps(); + assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED); + + mAppOpsService.uidRemoved(mMyUid); + assertThat(getLoggedOps()).isNull(); + } + + private List<PackageOps> getLoggedOps() { + return mAppOpsService.getOpsForPackage(mMyUid, mMyPackageName, null /* all ops */); + } + + private void assertContainsOp(List<PackageOps> loggedOps, int opCode, long minMillis, + long minRejectMillis, int mode) { + + boolean opLogged = false; + for (PackageOps pkgOps : loggedOps) { + assertWithMessage("Unexpected UID").that(mMyUid).isEqualTo(pkgOps.getUid()); + assertWithMessage("Unexpected package name").that(mMyPackageName).isEqualTo( + pkgOps.getPackageName()); + + for (OpEntry opEntry : pkgOps.getOps()) { + if (opCode != opEntry.getOp()) { + continue; + } + opLogged = true; + + assertWithMessage("Unexpected mode").that(mode).isEqualTo(opEntry.getMode()); + if (minMillis > 0) { + assertWithMessage("Unexpected timestamp") + .that(opEntry.getTime()).isAtLeast(minMillis); + } + if (minRejectMillis > 0) { + assertWithMessage("Unexpected rejection timestamp") + .that(opEntry.getRejectTime()).isAtLeast(minRejectMillis); + } + } + } + assertWithMessage("Op was not logged").that(opLogged).isTrue(); + } +} diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 00a85a539538..f58766f39391 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -94,7 +94,6 @@ import com.android.server.pm.UserRestrictionsUtils; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; -import org.mockito.ArgumentCaptor; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -3765,19 +3764,22 @@ public class DevicePolicyManagerTest extends DpmTestBase { // The DO can still set lock task packages final String[] doPackages = {"doPackage1", "doPackage2"}; final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanSetLockTask(DpmMockContext.CALLER_SYSTEM_USER_UID, UserHandle.USER_SYSTEM, admin1, doPackages, flags); final String[] secondaryPoPackages = {"secondaryPoPackage1", "secondaryPoPackage2"}; final int secondaryPoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(DpmMockContext.CALLER_UID, admin3, secondaryPoPackages, secondaryPoFlags); // Managed profile is unaffiliated - shouldn't be able to setLockTaskPackages. mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; final String[] poPackages = {"poPackage1", "poPackage2"}; final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, poPackages, poFlags); // Setting same affiliation ids @@ -3820,7 +3822,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { final String[] poPackages = {"poPackage1", "poPackage2"}; final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanSetLockTask(DpmMockContext.CALLER_UID, DpmMockContext.CALLER_USER_HANDLE, admin1, poPackages, poFlags); @@ -3836,10 +3839,25 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID; final String[] mpoPackages = {"poPackage1", "poPackage2"}; final int mpoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS - | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS; + | DevicePolicyManager.LOCK_TASK_FEATURE_HOME + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages, mpoFlags); } + public void testLockTaskFeatures_IllegalArgumentException() throws Exception { + // Setup a device owner. + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + // Lock task policy is updated when loading user data. + verifyLockTaskState(UserHandle.USER_SYSTEM); + + final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS + | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW; + assertExpectException(IllegalArgumentException.class, + "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME", + () -> dpm.setLockTaskFeatures(admin1, flags)); + } + public void testIsDeviceManaged() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); diff --git a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java index 35cba1855503..887489423b4c 100644 --- a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java @@ -33,12 +33,14 @@ import android.content.pm.PackageManagerInternal; import android.net.Network; import android.net.NetworkCapabilities; import android.os.Build; +import android.os.Handler; import android.os.SystemClock; import android.support.test.runner.AndroidJUnit4; import android.util.DataUnit; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerService; +import com.android.server.job.JobSchedulerService.Constants; import org.junit.Before; import org.junit.Test; @@ -49,6 +51,8 @@ import java.time.ZoneOffset; @RunWith(AndroidJUnit4.class) public class ConnectivityControllerTest { + private Constants mConstants; + @Before public void setUp() throws Exception { // Assume all packages are current SDK @@ -65,23 +69,26 @@ public class ConnectivityControllerTest { Clock.fixed(SystemClock.uptimeMillisClock().instant(), ZoneOffset.UTC); JobSchedulerService.sElapsedRealtimeClock = Clock.fixed(SystemClock.elapsedRealtimeClock().instant(), ZoneOffset.UTC); + + // Assume default constants for now + mConstants = new Constants(); } @Test public void testInsane() throws Exception { - final Network network = new Network(101); + final Network net = new Network(101); final JobInfo.Builder job = createJob() .setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1)) .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); // Slow network is too slow - assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), network, + assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1) - .setLinkDownstreamBandwidthKbps(1))); + .setLinkDownstreamBandwidthKbps(1), mConstants)); // Fast network looks great - assertTrue(ConnectivityController.isSatisfied(createJobStatus(job), network, + assertTrue(ConnectivityController.isSatisfied(createJobStatus(job), net, createCapabilities().setLinkUpstreamBandwidthKbps(1024) - .setLinkDownstreamBandwidthKbps(1024))); + .setLinkDownstreamBandwidthKbps(1024), mConstants)); } @Test @@ -95,19 +102,19 @@ public class ConnectivityControllerTest { // Uncongested network is whenever { - final Network network = new Network(101); - final NetworkCapabilities capabilities = createCapabilities() + final Network net = new Network(101); + final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED); - assertTrue(ConnectivityController.isSatisfied(early, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(late, network, capabilities)); + assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); } // Congested network is more selective { - final Network network = new Network(101); - final NetworkCapabilities capabilities = createCapabilities(); - assertFalse(ConnectivityController.isSatisfied(early, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(late, network, capabilities)); + final Network net = new Network(101); + final NetworkCapabilities caps = createCapabilities(); + assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); } } @@ -126,25 +133,25 @@ public class ConnectivityControllerTest { // Unmetered network is whenever { - final Network network = new Network(101); - final NetworkCapabilities capabilities = createCapabilities() + final Network net = new Network(101); + final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED) .addCapability(NET_CAPABILITY_NOT_METERED); - assertTrue(ConnectivityController.isSatisfied(early, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(late, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(earlyPrefetch, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(latePrefetch, network, capabilities)); + assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants)); } // Metered network is only when prefetching and late { - final Network network = new Network(101); - final NetworkCapabilities capabilities = createCapabilities() + final Network net = new Network(101); + final NetworkCapabilities caps = createCapabilities() .addCapability(NET_CAPABILITY_NOT_CONGESTED); - assertFalse(ConnectivityController.isSatisfied(early, network, capabilities)); - assertFalse(ConnectivityController.isSatisfied(late, network, capabilities)); - assertFalse(ConnectivityController.isSatisfied(earlyPrefetch, network, capabilities)); - assertTrue(ConnectivityController.isSatisfied(latePrefetch, network, capabilities)); + assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants)); + assertFalse(ConnectivityController.isSatisfied(late, net, caps, mConstants)); + assertFalse(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants)); + assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants)); } } diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java index 8bd0df492dee..b67659debee1 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java @@ -45,6 +45,7 @@ import android.security.keystore.KeyGenParameterSpec; import android.security.keystore.KeyProperties; import android.security.keystore.recovery.KeyDerivationParams; import android.security.keystore.recovery.KeyChainProtectionParams; +import android.security.keystore.recovery.RecoveryCertPath; import android.security.keystore.recovery.WrappedApplicationKey; import android.support.test.filters.SmallTest; import android.support.test.InstrumentationRegistry; @@ -67,6 +68,10 @@ import org.mockito.MockitoAnnotations; import java.io.File; import java.nio.charset.StandardCharsets; +import java.security.cert.CertPath; +import java.security.cert.CertificateFactory; +import java.security.cert.X509Certificate; +import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.Map; import java.util.Random; @@ -335,6 +340,46 @@ public class RecoverableKeyStoreManagerTest { } @Test + public void startRecoverySessionWithCertPath_storesTheSessionInfo() throws Exception { + mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + TEST_SESSION_ID, + RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1), + TEST_VAULT_PARAMS, + TEST_VAULT_CHALLENGE, + ImmutableList.of( + new KeyChainProtectionParams( + TYPE_LOCKSCREEN, + UI_FORMAT_PASSWORD, + KeyDerivationParams.createSha256Params(TEST_SALT), + TEST_SECRET))); + + assertEquals(1, mRecoverySessionStorage.size()); + RecoverySessionStorage.Entry entry = + mRecoverySessionStorage.get(Binder.getCallingUid(), TEST_SESSION_ID); + assertArrayEquals(TEST_SECRET, entry.getLskfHash()); + assertEquals(KEY_CLAIMANT_LENGTH_BYTES, entry.getKeyClaimant().length); + } + + @Test + public void startRecoverySessionWithCertPath_checksPermissionFirst() throws Exception { + mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + TEST_SESSION_ID, + RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1), + TEST_VAULT_PARAMS, + TEST_VAULT_CHALLENGE, + ImmutableList.of( + new KeyChainProtectionParams( + TYPE_LOCKSCREEN, + UI_FORMAT_PASSWORD, + KeyDerivationParams.createSha256Params(TEST_SALT), + TEST_SECRET))); + + verify(mMockContext, times(2)) + .enforceCallingOrSelfPermission( + eq(Manifest.permission.RECOVER_KEYSTORE), any()); + } + + @Test public void startRecoverySession_storesTheSessionInfo() throws Exception { mRecoverableKeyStoreManager.startRecoverySession( TEST_SESSION_ID, @@ -432,6 +477,66 @@ public class RecoverableKeyStoreManagerTest { } @Test + public void startRecoverySessionWithCertPath_throwsIfBadNumberOfSecrets() throws Exception { + try { + mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + TEST_SESSION_ID, + RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1), + TEST_VAULT_PARAMS, + TEST_VAULT_CHALLENGE, + ImmutableList.of()); + fail("should have thrown"); + } catch (UnsupportedOperationException e) { + assertThat(e.getMessage()).startsWith( + "Only a single KeyChainProtectionParams is supported"); + } + } + + @Test + public void startRecoverySessionWithCertPath_throwsIfPublicKeysMismatch() throws Exception { + byte[] vaultParams = TEST_VAULT_PARAMS.clone(); + vaultParams[1] ^= (byte) 1; // Flip 1 bit + try { + mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + TEST_SESSION_ID, + RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1), + vaultParams, + TEST_VAULT_CHALLENGE, + ImmutableList.of( + new KeyChainProtectionParams( + TYPE_LOCKSCREEN, + UI_FORMAT_PASSWORD, + KeyDerivationParams.createSha256Params(TEST_SALT), + TEST_SECRET))); + fail("should have thrown"); + } catch (ServiceSpecificException e) { + assertThat(e.getMessage()).contains("do not match"); + } + } + + @Test + public void startRecoverySessionWithCertPath_throwsIfEmptyCertPath() throws Exception { + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + CertPath emptyCertPath = certFactory.generateCertPath(new ArrayList<X509Certificate>()); + try { + mRecoverableKeyStoreManager.startRecoverySessionWithCertPath( + TEST_SESSION_ID, + RecoveryCertPath.createRecoveryCertPath(emptyCertPath), + TEST_VAULT_PARAMS, + TEST_VAULT_CHALLENGE, + ImmutableList.of( + new KeyChainProtectionParams( + TYPE_LOCKSCREEN, + UI_FORMAT_PASSWORD, + KeyDerivationParams.createSha256Params(TEST_SALT), + TEST_SECRET))); + fail("should have thrown"); + } catch (ServiceSpecificException e) { + assertThat(e.getMessage()).contains("CertPath is empty"); + } + } + + @Test public void recoverKeys_throwsIfNoSessionIsPresent() throws Exception { try { mRecoverableKeyStoreManager.recoverKeys( @@ -639,7 +744,7 @@ public class RecoverableKeyStoreManagerTest { } @Test - public void setRecoveryStatus_forOneAlias() throws Exception { + public void setRecoveryStatus() throws Exception { int userId = UserHandle.getCallingUserId(); int uid = Binder.getCallingUid(); int status = 100; @@ -648,59 +753,16 @@ public class RecoverableKeyStoreManagerTest { WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, GENERATION_ID, status); mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey); Map<String, Integer> statuses = - mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); + mRecoverableKeyStoreManager.getRecoveryStatus(); assertThat(statuses).hasSize(1); assertThat(statuses).containsEntry(alias, status); - mRecoverableKeyStoreManager.setRecoveryStatus( - /*packageName=*/ null, new String[] {alias}, status2); - statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); + mRecoverableKeyStoreManager.setRecoveryStatus(alias, status2); + statuses = mRecoverableKeyStoreManager.getRecoveryStatus(); assertThat(statuses).hasSize(1); assertThat(statuses).containsEntry(alias, status2); // updated } - @Test - public void setRecoveryStatus_for2Aliases() throws Exception { - int userId = UserHandle.getCallingUserId(); - int uid = Binder.getCallingUid(); - int status = 100; - int status2 = 200; - int status3 = 300; - String alias = "key1"; - String alias2 = "key2"; - WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, GENERATION_ID, status); - mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey); - mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey); - Map<String, Integer> statuses = - mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); - assertThat(statuses).hasSize(2); - assertThat(statuses).containsEntry(alias, status); - assertThat(statuses).containsEntry(alias2, status); - - mRecoverableKeyStoreManager.setRecoveryStatus( - /*packageName=*/ null, /*aliases=*/ null, status2); - statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); - assertThat(statuses).hasSize(2); - assertThat(statuses).containsEntry(alias, status2); // updated - assertThat(statuses).containsEntry(alias2, status2); // updated - - mRecoverableKeyStoreManager.setRecoveryStatus( - /*packageName=*/ null, new String[] {alias2}, status3); - - statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); - assertThat(statuses).hasSize(2); - assertThat(statuses).containsEntry(alias, status2); - assertThat(statuses).containsEntry(alias2, status3); // updated - - mRecoverableKeyStoreManager.setRecoveryStatus( - /*packageName=*/ null, new String[] {alias, alias2}, status); - - statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null); - assertThat(statuses).hasSize(2); - assertThat(statuses).containsEntry(alias, status); // updated - assertThat(statuses).containsEntry(alias2, status); // updated - } - private static byte[] encryptedApplicationKey( SecretKey recoveryKey, byte[] applicationKey) throws Exception { return KeySyncUtils.encryptKeysWithRecoveryKey(recoveryKey, ImmutableMap.of( diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index 8cf575eec4d9..4ca1647ef415 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -289,6 +289,12 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override + int injectBinderCallingPid() { + // Note it's not used in tests, so just return a "random" value. + return mInjectedCallingUid * 123; + } + + @Override int injectGetPackageUid(String packageName, int userId) { return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid; } @@ -325,6 +331,11 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override + boolean injectHasUnlimitedShortcutsApiCallsPermission(int callingPid, int callingUid) { + return mInjectHasUnlimitedShortcutsApiCallsPermission; + } + + @Override ComponentName getDefaultLauncher(@UserIdInt int userId) { final ComponentName activity = mDefaultLauncher.get(userId); if (activity != null) { @@ -519,6 +530,12 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override + int injectBinderCallingPid() { + // Note it's not used in tests, so just return a "random" value. + return mInjectedCallingUid * 123; + } + + @Override long injectClearCallingIdentity() { final int prevCallingUid = mInjectedCallingUid; mInjectedCallingUid = Process.SYSTEM_UID; @@ -705,6 +722,8 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { protected boolean mInjectCheckAccessShortcutsPermission = false; + protected boolean mInjectHasUnlimitedShortcutsApiCallsPermission = false; + static { QUERY_ALL.setQueryFlags( ShortcutQuery.FLAG_GET_ALL_KINDS); @@ -1207,7 +1226,7 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } /** - * This controls {@link ShortcutService#hasShortcutHostPermission(String, int)}, but + * This controls {@link ShortcutService#hasShortcutHostPermission}, but * not {@link ShortcutService#getDefaultLauncher(int)}. To control the later, use * {@link #setDefaultLauncher(int, ComponentName)}. */ diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 857925b3ed17..845e05d28465 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -366,7 +366,38 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPublishWithNoActivity() { + public void testUnlimitedCalls() { + setCaller(CALLING_PACKAGE_1, USER_0); + + final ShortcutInfo si1 = makeShortcut("shortcut1"); + + assertEquals(3, mManager.getRemainingCallCount()); + + assertTrue(mManager.setDynamicShortcuts(list(si1))); + assertEquals(2, mManager.getRemainingCallCount()); + + assertTrue(mManager.addDynamicShortcuts(list(si1))); + assertEquals(1, mManager.getRemainingCallCount()); + + assertTrue(mManager.updateShortcuts(list(si1))); + assertEquals(0, mManager.getRemainingCallCount()); + + // Unlimited now. + mInjectHasUnlimitedShortcutsApiCallsPermission = true; + + assertEquals(3, mManager.getRemainingCallCount()); + + assertTrue(mManager.setDynamicShortcuts(list(si1))); + assertEquals(3, mManager.getRemainingCallCount()); + + assertTrue(mManager.addDynamicShortcuts(list(si1))); + assertEquals(3, mManager.getRemainingCallCount()); + + assertTrue(mManager.updateShortcuts(list(si1))); + assertEquals(3, mManager.getRemainingCallCount()); + } + + public void testPublishWithNoActivity() { // If activity is not explicitly set, use the default one. mRunningUsers.put(USER_10, true); diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java index 293f9afeea22..c6800be343af 100644 --- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java +++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java @@ -77,6 +77,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetBy(mAppWindow.displayFrame, 0, 0, 0, 0); } @Test @@ -91,6 +92,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mAppWindow.displayFrame, 0, NAV_BAR_HEIGHT); } @Test @@ -106,6 +108,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, NAV_BAR_HEIGHT); + assertInsetByTopBottom(mAppWindow.displayFrame, 0, NAV_BAR_HEIGHT); } @Test @@ -130,6 +133,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetByTopBottom(mAppWindow.displayFrame, 0, 0); } @Test @@ -146,6 +150,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, 0); } @Test @@ -162,6 +167,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetBy(mAppWindow.displayFrame, 0, 0, 0, 0); } @Test @@ -178,6 +184,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, 0); } @Test @@ -195,6 +202,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0); + assertInsetByTopBottom(mAppWindow.displayFrame, 0, 0); } @@ -212,6 +220,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetBy(mAppWindow.contentFrame, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0); assertInsetBy(mAppWindow.decorFrame, 0, 0, 0, 0); + assertInsetBy(mAppWindow.displayFrame, DISPLAY_CUTOUT_HEIGHT, 0, 0, 0); } @Test @@ -228,6 +237,7 @@ public class PhoneWindowManagerLayoutTest extends PhoneWindowManagerTestBase { assertInsetBy(mAppWindow.contentFrame, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0); assertInsetBy(mAppWindow.decorFrame, 0, 0, 0, 0); + assertInsetBy(mAppWindow.displayFrame, 0, 0, DISPLAY_CUTOUT_HEIGHT, 0); } @Test diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java index f5969f39e87c..c252609b5d88 100644 --- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java @@ -41,6 +41,7 @@ import javax.annotation.Nullable; import libcore.io.IoUtils; +import static com.android.server.timezone.RulesManagerService.REQUIRED_QUERY_PERMISSION; import static com.android.server.timezone.RulesManagerService.REQUIRED_UPDATER_PERMISSION; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -91,25 +92,25 @@ public class RulesManagerServiceTest { @Test(expected = SecurityException.class) public void getRulesState_noCallerPermission() throws Exception { - configureCallerDoesNotHavePermission(); + configureCallerDoesNotHaveQueryPermission(); mRulesManagerService.getRulesState(); } @Test(expected = SecurityException.class) public void requestInstall_noCallerPermission() throws Exception { - configureCallerDoesNotHavePermission(); + configureCallerDoesNotHaveUpdatePermission(); mRulesManagerService.requestInstall(null, null, null); } @Test(expected = SecurityException.class) public void requestUninstall_noCallerPermission() throws Exception { - configureCallerDoesNotHavePermission(); + configureCallerDoesNotHaveUpdatePermission(); mRulesManagerService.requestUninstall(null, null); } @Test(expected = SecurityException.class) public void requestNothing_noCallerPermission() throws Exception { - configureCallerDoesNotHavePermission(); + configureCallerDoesNotHaveUpdatePermission(); mRulesManagerService.requestNothing(null, true); } @@ -916,12 +917,18 @@ public class RulesManagerServiceTest { .enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); } - private void configureCallerDoesNotHavePermission() { + private void configureCallerDoesNotHaveUpdatePermission() { doThrow(new SecurityException("Simulated permission failure")) .when(mMockPermissionHelper) .enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION); } + private void configureCallerDoesNotHaveQueryPermission() { + doThrow(new SecurityException("Simulated permission failure")) + .when(mMockPermissionHelper) + .enforceCallerHasPermission(REQUIRED_QUERY_PERMISSION); + } + private void configureStageInstallExpectation(int resultCode) throws Exception { when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(any(TimeZoneDistro.class))) diff --git a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java index 7b0664844df1..36504ac7ec65 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java @@ -16,10 +16,13 @@ package com.android.server.usage; -import static android.app.usage.UsageStatsManager.REASON_TIMEOUT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_FOREGROUND; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; +import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -92,18 +95,18 @@ public class AppIdleHistoryTests extends AndroidTestCase { AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000); aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 1000, STANDBY_BUCKET_ACTIVE, - UsageStatsManager.REASON_USAGE); + REASON_MAIN_USAGE); // ACTIVE means not idle assertFalse(aih.isIdle(PACKAGE_1, USER_ID, 2000)); aih.setAppStandbyBucket(PACKAGE_2, USER_ID, 2000, STANDBY_BUCKET_ACTIVE, - UsageStatsManager.REASON_USAGE); + REASON_MAIN_USAGE); aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 3000, STANDBY_BUCKET_RARE, - REASON_TIMEOUT); + REASON_MAIN_TIMEOUT); assertEquals(aih.getAppStandbyBucket(PACKAGE_1, USER_ID, 3000), STANDBY_BUCKET_RARE); assertEquals(aih.getAppStandbyBucket(PACKAGE_2, USER_ID, 3000), STANDBY_BUCKET_ACTIVE); - assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000), REASON_TIMEOUT); + assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000), REASON_MAIN_TIMEOUT); // RARE is considered idle assertTrue(aih.isIdle(PACKAGE_1, USER_ID, 3000)); @@ -115,7 +118,7 @@ public class AppIdleHistoryTests extends AndroidTestCase { aih = new AppIdleHistory(mStorageDir, 4000); assertEquals(aih.getAppStandbyBucket(PACKAGE_1, USER_ID, 5000), STANDBY_BUCKET_RARE); assertEquals(aih.getAppStandbyBucket(PACKAGE_2, USER_ID, 5000), STANDBY_BUCKET_ACTIVE); - assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000), REASON_TIMEOUT); + assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000), REASON_MAIN_TIMEOUT); assertTrue(aih.shouldInformListeners(PACKAGE_1, USER_ID, 5000, STANDBY_BUCKET_RARE)); assertFalse(aih.shouldInformListeners(PACKAGE_1, USER_ID, 5000, STANDBY_BUCKET_RARE)); @@ -133,4 +136,18 @@ public class AppIdleHistoryTests extends AndroidTestCase { assertEquals(1000, aih.getTimeSinceLastJobRun(PACKAGE_2, USER_ID, 7000)); assertEquals(5000, aih.getTimeSinceLastJobRun(PACKAGE_1, USER_ID, 7000)); } + + public void testReason() throws Exception { + AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000); + aih.reportUsage(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, + REASON_SUB_USAGE_MOVE_TO_FOREGROUND, 2000, 0); + assertEquals(REASON_MAIN_USAGE | REASON_SUB_USAGE_MOVE_TO_FOREGROUND, + aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000)); + aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 4000, STANDBY_BUCKET_WORKING_SET, + REASON_MAIN_TIMEOUT); + aih.writeAppIdleTimes(USER_ID); + + aih = new AppIdleHistory(mStorageDir, 5000); + assertEquals(REASON_MAIN_TIMEOUT, aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000)); + } }
\ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java index cbbdca6b394f..edf1f746fb4b 100644 --- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java @@ -18,11 +18,11 @@ package com.android.server.usage; import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN; import static android.app.usage.UsageEvents.Event.USER_INTERACTION; -import static android.app.usage.UsageStatsManager.REASON_DEFAULT; -import static android.app.usage.UsageStatsManager.REASON_FORCED; -import static android.app.usage.UsageStatsManager.REASON_PREDICTED; -import static android.app.usage.UsageStatsManager.REASON_TIMEOUT; -import static android.app.usage.UsageStatsManager.REASON_USAGE; +import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT; @@ -410,11 +410,11 @@ public class AppStandbyControllerTests { setChargingState(mController, false); // Set it to timeout or usage, so that prediction can override it mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, - REASON_TIMEOUT, 1 * HOUR_MS); + REASON_MAIN_TIMEOUT, 1 * HOUR_MS); assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController)); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, - REASON_PREDICTED + ":CTS", 1 * HOUR_MS); + REASON_MAIN_PREDICTED, 1 * HOUR_MS); assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController)); // Fast forward 12 hours @@ -440,28 +440,28 @@ public class AppStandbyControllerTests { setChargingState(mController, false); // Can force to NEVER mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, - REASON_FORCED, 1 * HOUR_MS); + REASON_MAIN_FORCED, 1 * HOUR_MS); assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController)); // Prediction can't override FORCED reason mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_FORCED, 1 * HOUR_MS); + REASON_MAIN_FORCED, 1 * HOUR_MS); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, - REASON_PREDICTED, 1 * HOUR_MS); + REASON_MAIN_PREDICTED, 1 * HOUR_MS); assertEquals(STANDBY_BUCKET_FREQUENT, getStandbyBucket(mController)); // Prediction can't override NEVER mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, - REASON_DEFAULT, 2 * HOUR_MS); + REASON_MAIN_DEFAULT, 2 * HOUR_MS); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, - REASON_PREDICTED, 2 * HOUR_MS); + REASON_MAIN_PREDICTED, 2 * HOUR_MS); assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController)); // Prediction can't set to NEVER mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, - REASON_USAGE, 2 * HOUR_MS); + REASON_MAIN_USAGE, 2 * HOUR_MS); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER, - REASON_PREDICTED, 2 * HOUR_MS); + REASON_MAIN_PREDICTED, 2 * HOUR_MS); assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController)); } @@ -474,7 +474,7 @@ public class AppStandbyControllerTests { mInjector.mElapsedRealtime = 2000; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_ACTIVE); // bucketing works after timeout @@ -483,7 +483,7 @@ public class AppStandbyControllerTests { assertBucket(STANDBY_BUCKET_WORKING_SET); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_FREQUENT); } @@ -498,15 +498,15 @@ public class AppStandbyControllerTests { assertBucket(STANDBY_BUCKET_ACTIVE); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET, - REASON_PREDICTED, 1000); + REASON_MAIN_PREDICTED, 1000); assertBucket(STANDBY_BUCKET_ACTIVE); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, 2000 + mController.mStrongUsageTimeoutMillis); + REASON_MAIN_PREDICTED, 2000 + mController.mStrongUsageTimeoutMillis); assertBucket(STANDBY_BUCKET_WORKING_SET); mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, 2000 + mController.mNotificationSeenTimeoutMillis); + REASON_MAIN_PREDICTED, 2000 + mController.mNotificationSeenTimeoutMillis); assertBucket(STANDBY_BUCKET_FREQUENT); } @@ -527,18 +527,18 @@ public class AppStandbyControllerTests { // Still in ACTIVE after first USER_INTERACTION times out mInjector.mElapsedRealtime = mController.mStrongUsageTimeoutMillis + 1000; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_ACTIVE); // Both timed out, so NOTIFICATION_SEEN timeout should be effective mInjector.mElapsedRealtime = mController.mStrongUsageTimeoutMillis * 2 + 2000; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_WORKING_SET); mInjector.mElapsedRealtime = mController.mNotificationSeenTimeoutMillis + 2000; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_RARE); } @@ -561,7 +561,7 @@ public class AppStandbyControllerTests { // Predict to ACTIVE mInjector.mElapsedRealtime += 1000; mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE, - REASON_PREDICTED, mInjector.mElapsedRealtime); + REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime); assertBucket(STANDBY_BUCKET_ACTIVE); // CheckIdleStates should not change the prediction diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 0b99eaa4a570..206ee7af2966 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -644,4 +644,8 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { public boolean canDismissBootAnimation() { return true; } + + @Override + public void onScreenMagnificationStateChanged(boolean active) { + } } diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java index cfd155e81a67..1052e8f377a7 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java @@ -71,6 +71,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase { private PinnedSliceState mPinnedSliceManager; private IContentProvider mIContentProvider; private ContentProvider mContentProvider; + private IBinder mToken = new Binder(); @Before public void setup() { @@ -108,7 +109,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase { TestableLooper.get(this).processAllMessages(); // When pinned for the first time, a pinned message should be sent. - mPinnedSliceManager.pin("pkg", FIRST_SPECS); + mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); TestableLooper.get(this).processAllMessages(); verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), @@ -119,112 +120,27 @@ public class PinnedSliceStateTest extends UiServiceTestCase { } @Test - public void testSendPinnedOnListen() throws RemoteException { - TestableLooper.get(this).processAllMessages(); - - // When a listener is added for the first time, a pinned message should be sent. - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), - argThat(b -> { - assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); - return true; - })); - } - - @Test - public void testNoSendPinnedWithoutPermission() throws RemoteException { - TestableLooper.get(this).processAllMessages(); - - // When a listener is added for the first time, a pinned message should be sent. - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - false); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider, never()).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), - any()); - } - - @Test - public void testSendUnpinnedOnDestroy() throws RemoteException { - TestableLooper.get(this).processAllMessages(); - clearInvocations(mIContentProvider); - - mPinnedSliceManager.pin("pkg", FIRST_SPECS); - mPinnedSliceManager.destroy(); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_UNPIN), eq(null), - argThat(b -> { - assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); - return true; - })); - } - - @Test public void testPkgPin() { assertFalse(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.pin("pkg", FIRST_SPECS); + mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); assertTrue(mPinnedSliceManager.hasPinOrListener()); - assertTrue(mPinnedSliceManager.unpin("pkg")); + assertTrue(mPinnedSliceManager.unpin("pkg", mToken)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } @Test public void testMultiPkgPin() { + IBinder t2 = new Binder(); assertFalse(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.pin("pkg", FIRST_SPECS); - assertTrue(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.pin("pkg2", FIRST_SPECS); - - assertFalse(mPinnedSliceManager.unpin("pkg")); - assertTrue(mPinnedSliceManager.unpin("pkg2")); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - } - - @Test - public void testListenerPin() { - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); - assertTrue(mPinnedSliceManager.hasPinOrListener()); - - assertTrue(mPinnedSliceManager.removeSliceListener(listener)); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - } - - @Test - public void testMultiListenerPin() { - ISliceListener listener = mock(ISliceListener.class); - Binder value = new Binder(); - when(listener.asBinder()).thenReturn(value); - ISliceListener listener2 = mock(ISliceListener.class); - Binder value2 = new Binder(); - when(listener2.asBinder()).thenReturn(value2); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); + mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken); assertTrue(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.addSliceListener(listener2, mContext.getPackageName(), FIRST_SPECS, - true); + mPinnedSliceManager.pin("pkg2", FIRST_SPECS, t2); - assertFalse(mPinnedSliceManager.removeSliceListener(listener)); - assertTrue(mPinnedSliceManager.removeSliceListener(listener2)); + assertFalse(mPinnedSliceManager.unpin("pkg", mToken)); + assertTrue(mPinnedSliceManager.unpin("pkg2", t2)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } @@ -236,8 +152,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase { when(listener.asBinder()).thenReturn(binder); assertFalse(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); + mPinnedSliceManager.pin(mContext.getPackageName(), FIRST_SPECS, binder); assertTrue(mPinnedSliceManager.hasPinOrListener()); ArgumentCaptor<DeathRecipient> arg = ArgumentCaptor.forClass(DeathRecipient.class); @@ -246,79 +161,7 @@ public class PinnedSliceStateTest extends UiServiceTestCase { when(binder.isBinderAlive()).thenReturn(false); arg.getValue().binderDied(); - verify(mSliceService).unlisten(eq(TEST_URI)); verify(mSliceService).removePinnedSlice(eq(TEST_URI)); assertFalse(mPinnedSliceManager.hasPinOrListener()); } - - @Test - public void testPkgListenerPin() { - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); - assertTrue(mPinnedSliceManager.hasPinOrListener()); - mPinnedSliceManager.pin("pkg", FIRST_SPECS); - - assertFalse(mPinnedSliceManager.removeSliceListener(listener)); - assertTrue(mPinnedSliceManager.unpin("pkg")); - assertFalse(mPinnedSliceManager.hasPinOrListener()); - } - - @Test - public void testBind() throws RemoteException { - TestableLooper.get(this).processAllMessages(); - clearInvocations(mIContentProvider); - - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - Slice s = new Slice.Builder(TEST_URI).build(); - Bundle b = new Bundle(); - b.putParcelable(SliceProvider.EXTRA_SLICE, s); - when(mIContentProvider.call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null), - any())).thenReturn(b); - - assertFalse(mPinnedSliceManager.hasPinOrListener()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - true); - - mPinnedSliceManager.onChange(); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null), - argThat(bundle -> { - assertEquals(TEST_URI, bundle.getParcelable(SliceProvider.EXTRA_BIND_URI)); - return true; - })); - verify(listener).onSliceUpdated(eq(s)); - } - - @Test - public void testRecheckPackage() throws RemoteException { - TestableLooper.get(this).processAllMessages(); - - ISliceListener listener = mock(ISliceListener.class); - when(listener.asBinder()).thenReturn(new Binder()); - - mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS, - false); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider, never()).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), - any()); - - when(mSliceService.checkAccess(any(), any(), anyInt(), anyInt())) - .thenReturn(PERMISSION_GRANTED); - mPinnedSliceManager.recheckPackage(mContext.getPackageName()); - TestableLooper.get(this).processAllMessages(); - - verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null), - argThat(b -> { - assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI)); - return true; - })); - } }
\ No newline at end of file diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java index fe9ea7a1bb9b..6fc300959144 100644 --- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java @@ -32,6 +32,8 @@ import android.app.slice.ISliceListener; import android.app.slice.SliceSpec; import android.content.pm.PackageManagerInternal; import android.net.Uri; +import android.os.Binder; +import android.os.IBinder; import android.os.RemoteException; import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; @@ -59,6 +61,7 @@ public class SliceManagerServiceTest extends UiServiceTestCase { private SliceManagerService mService; private PinnedSliceState mCreatedSliceState; + private IBinder mToken = new Binder(); @Before public void setup() { @@ -77,43 +80,11 @@ public class SliceManagerServiceTest extends UiServiceTestCase { } @Test - public void testAddListenerCreatesPinned() throws RemoteException { - mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS); - verify(mService, times(1)).createPinnedSlice(eq(TEST_URI)); - } - - @Test - public void testAddListenerCreatesOnePinned() throws RemoteException { - mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS); - mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS); - verify(mService, times(1)).createPinnedSlice(eq(TEST_URI)); - } - - @Test - public void testRemoveListenerDestroysPinned() throws RemoteException { - ISliceListener listener = mock(ISliceListener.class); - mService.addSliceListener(TEST_URI, "pkg", listener, EMPTY_SPECS); - - when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(false); - mService.removeSliceListener(TEST_URI, "pkg", listener); - verify(mCreatedSliceState, never()).destroy(); - - when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(true); - mService.removeSliceListener(TEST_URI, "pkg", listener); - verify(mCreatedSliceState).destroy(); - } - - @Test(expected = IllegalStateException.class) - public void testUnrecognizedThrows() throws RemoteException { - mService.removeSliceListener(TEST_URI, "pkg", mock(ISliceListener.class)); - } - - @Test public void testAddPinCreatesPinned() throws RemoteException { doReturn("pkg").when(mService).getDefaultHome(anyInt()); - mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS); - mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS); + mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); + mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); verify(mService, times(1)).createPinnedSlice(eq(TEST_URI)); } @@ -121,15 +92,11 @@ public class SliceManagerServiceTest extends UiServiceTestCase { public void testRemovePinDestroysPinned() throws RemoteException { doReturn("pkg").when(mService).getDefaultHome(anyInt()); - mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS); + mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); - when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(false); - mService.unpinSlice("pkg", TEST_URI); + when(mCreatedSliceState.unpin(eq("pkg"), eq(mToken))).thenReturn(false); + mService.unpinSlice("pkg", TEST_URI, mToken); verify(mCreatedSliceState, never()).destroy(); - - when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(true); - mService.unpinSlice("pkg", TEST_URI); - verify(mCreatedSliceState).destroy(); } }
\ No newline at end of file diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java index f26c2ae771f0..fd28b65137f1 100644 --- a/services/usage/java/com/android/server/usage/AppIdleHistory.java +++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java @@ -16,15 +16,18 @@ package com.android.server.usage; -import static android.app.usage.UsageStatsManager.REASON_DEFAULT; -import static android.app.usage.UsageStatsManager.REASON_FORCED; -import static android.app.usage.UsageStatsManager.REASON_PREDICTED; -import static android.app.usage.UsageStatsManager.REASON_USAGE; +import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; +import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET; +import android.app.usage.AppStandbyInfo; import android.app.usage.UsageStatsManager; import android.os.SystemClock; import android.util.ArrayMap; @@ -37,8 +40,6 @@ import android.util.Xml; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.FastXmlSerializer; import com.android.internal.util.IndentingPrintWriter; -import com.android.server.LocalServices; -import com.android.server.job.JobSchedulerInternal; import libcore.io.IoUtils; @@ -53,8 +54,7 @@ import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; /** * Keeps track of recent active state changes in apps. @@ -114,8 +114,10 @@ public class AppIdleHistory { // Standby bucket @UsageStatsManager.StandbyBuckets int currentBucket; - // Reason for setting the standby bucket. TODO: Switch to int. - String bucketingReason; + // Reason for setting the standby bucket. The value here is a combination of + // one of UsageStatsManager.REASON_MAIN_* and one (or none) of + // UsageStatsManager.REASON_SUB_*. Also see REASON_MAIN_MASK and REASON_SUB_MASK. + int bucketingReason; // In-memory only, last bucket for which the listeners were informed int lastInformedBucket; // The last time a job was run for this app, using elapsed timebase @@ -214,13 +216,14 @@ public class AppIdleHistory { * @param appUsageHistory the usage record for the app being updated * @param packageName name of the app being updated, for logging purposes * @param newBucket the bucket to set the app to + * @param usageReason the sub-reason for usage, one of REASON_SUB_USAGE_* * @param elapsedRealtime mark as used time if non-zero * @param timeout set the timeout of the specified bucket, if non-zero. Can only be used * with bucket values of ACTIVE and WORKING_SET. * @return */ public AppUsageHistory reportUsage(AppUsageHistory appUsageHistory, String packageName, - int newBucket, long elapsedRealtime, long timeout) { + int newBucket, int usageReason, long elapsedRealtime, long timeout) { // Set the timeout if applicable if (timeout > elapsedRealtime) { // Convert to elapsed timebase @@ -248,10 +251,10 @@ public class AppIdleHistory { if (DEBUG) { Slog.d(TAG, "Moved " + packageName + " to bucket=" + appUsageHistory .currentBucket - + ", reason=" + appUsageHistory.bucketingReason); + + ", reason=0x0" + Integer.toHexString(appUsageHistory.bucketingReason)); } } - appUsageHistory.bucketingReason = REASON_USAGE; + appUsageHistory.bucketingReason = REASON_MAIN_USAGE | usageReason; return appUsageHistory; } @@ -264,16 +267,17 @@ public class AppIdleHistory { * @param packageName * @param userId * @param newBucket the bucket to set the app to - * @param elapsedRealtime mark as used time if non-zero + * @param usageReason sub reason for usage + * @param nowElapsed mark as used time if non-zero * @param timeout set the timeout of the specified bucket, if non-zero. Can only be used * with bucket values of ACTIVE and WORKING_SET. * @return */ public AppUsageHistory reportUsage(String packageName, int userId, int newBucket, - long nowElapsed, long timeout) { + int usageReason, long nowElapsed, long timeout) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory history = getPackageHistory(userHistory, packageName, nowElapsed, true); - return reportUsage(history, packageName, newBucket, nowElapsed, timeout); + return reportUsage(history, packageName, newBucket, usageReason, nowElapsed, timeout); } private ArrayMap<String, AppUsageHistory> getUserHistory(int userId) { @@ -295,7 +299,7 @@ public class AppIdleHistory { appUsageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime); appUsageHistory.lastPredictedTime = getElapsedTime(0); appUsageHistory.currentBucket = STANDBY_BUCKET_NEVER; - appUsageHistory.bucketingReason = REASON_DEFAULT; + appUsageHistory.bucketingReason = REASON_MAIN_DEFAULT; appUsageHistory.lastInformedBucket = -1; appUsageHistory.lastJobRunTime = Long.MIN_VALUE; // long long time ago userHistory.put(packageName, appUsageHistory); @@ -330,18 +334,18 @@ public class AppIdleHistory { } public void setAppStandbyBucket(String packageName, int userId, long elapsedRealtime, - int bucket, String reason) { + int bucket, int reason) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory appUsageHistory = getPackageHistory(userHistory, packageName, elapsedRealtime, true); appUsageHistory.currentBucket = bucket; appUsageHistory.bucketingReason = reason; - if (reason.startsWith(REASON_PREDICTED)) { + if ((reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED) { appUsageHistory.lastPredictedTime = getElapsedTime(elapsedRealtime); } if (DEBUG) { Slog.d(TAG, "Moved " + packageName + " to bucket=" + appUsageHistory.currentBucket - + ", reason=" + appUsageHistory.bucketingReason); + + ", reason=0x0" + Integer.toHexString(appUsageHistory.bucketingReason)); } } @@ -384,23 +388,22 @@ public class AppIdleHistory { return appUsageHistory.currentBucket; } - public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime, - boolean appIdleEnabled) { + public ArrayList<AppStandbyInfo> getAppStandbyBuckets(int userId, boolean appIdleEnabled) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); int size = userHistory.size(); - HashMap<String, Integer> buckets = new HashMap<>(size); + ArrayList<AppStandbyInfo> buckets = new ArrayList<>(size); for (int i = 0; i < size; i++) { - buckets.put(userHistory.keyAt(i), - appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE); + buckets.add(new AppStandbyInfo(userHistory.keyAt(i), + appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE)); } return buckets; } - public String getAppStandbyReason(String packageName, int userId, long elapsedRealtime) { + public int getAppStandbyReason(String packageName, int userId, long elapsedRealtime) { ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId); AppUsageHistory appUsageHistory = getPackageHistory(userHistory, packageName, elapsedRealtime, false); - return appUsageHistory != null ? appUsageHistory.bucketingReason : null; + return appUsageHistory != null ? appUsageHistory.bucketingReason : 0; } public long getElapsedTime(long elapsedRealtime) { @@ -414,11 +417,11 @@ public class AppIdleHistory { elapsedRealtime, true); if (idle) { appUsageHistory.currentBucket = STANDBY_BUCKET_RARE; - appUsageHistory.bucketingReason = REASON_FORCED; + appUsageHistory.bucketingReason = REASON_MAIN_FORCED; } else { appUsageHistory.currentBucket = STANDBY_BUCKET_ACTIVE; // This is to pretend that the app was just used, don't freeze the state anymore. - appUsageHistory.bucketingReason = REASON_USAGE; + appUsageHistory.bucketingReason = REASON_MAIN_USAGE | REASON_SUB_USAGE_USER_INTERACTION; } return appUsageHistory.currentBucket; } @@ -519,7 +522,7 @@ public class AppIdleHistory { appUsageHistory.currentBucket = currentBucketString == null ? STANDBY_BUCKET_ACTIVE : Integer.parseInt(currentBucketString); - appUsageHistory.bucketingReason = + String bucketingReason = parser.getAttributeValue(null, ATTR_BUCKETING_REASON); appUsageHistory.lastJobRunTime = getLongValue(parser, ATTR_LAST_RUN_JOB_TIME, Long.MIN_VALUE); @@ -527,8 +530,13 @@ public class AppIdleHistory { ATTR_BUCKET_ACTIVE_TIMEOUT_TIME, 0L); appUsageHistory.bucketWorkingSetTimeoutTime = getLongValue(parser, ATTR_BUCKET_WORKING_SET_TIMEOUT_TIME, 0L); - if (appUsageHistory.bucketingReason == null) { - appUsageHistory.bucketingReason = REASON_DEFAULT; + appUsageHistory.bucketingReason = REASON_MAIN_DEFAULT; + if (bucketingReason != null) { + try { + appUsageHistory.bucketingReason = + Integer.parseInt(bucketingReason, 16); + } catch (NumberFormatException nfe) { + } } appUsageHistory.lastInformedBucket = -1; userHistory.put(packageName, appUsageHistory); @@ -577,7 +585,8 @@ public class AppIdleHistory { Long.toString(history.lastPredictedTime)); xml.attribute(null, ATTR_CURRENT_BUCKET, Integer.toString(history.currentBucket)); - xml.attribute(null, ATTR_BUCKETING_REASON, history.bucketingReason); + xml.attribute(null, ATTR_BUCKETING_REASON, + Integer.toHexString(history.bucketingReason)); if (history.bucketActiveTimeoutTime > 0) { xml.attribute(null, ATTR_BUCKET_ACTIVE_TIMEOUT_TIME, Long.toString(history .bucketActiveTimeoutTime)); @@ -603,7 +612,7 @@ public class AppIdleHistory { } public void dump(IndentingPrintWriter idpw, int userId, String pkg) { - idpw.println("Package idle stats:"); + idpw.println("App Standby States:"); idpw.increaseIndent(); ArrayMap<String, AppUsageHistory> userHistory = mIdleHistory.get(userId); final long elapsedRealtime = SystemClock.elapsedRealtime(); @@ -618,24 +627,25 @@ public class AppIdleHistory { continue; } idpw.print("package=" + packageName); - idpw.print(" userId=" + userId); - idpw.print(" lastUsedElapsed="); + idpw.print(" u=" + userId); + idpw.print(" bucket=" + appUsageHistory.currentBucket + + " reason=" + + UsageStatsManager.reasonToString(appUsageHistory.bucketingReason)); + idpw.print(" used="); TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastUsedElapsedTime, idpw); - idpw.print(" lastUsedScreenOn="); + idpw.print(" usedScr="); TimeUtils.formatDuration(screenOnTime - appUsageHistory.lastUsedScreenTime, idpw); - idpw.print(" lastPredictedTime="); + idpw.print(" lastPred="); TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastPredictedTime, idpw); - idpw.print(" bucketActiveTimeoutTime="); - TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.bucketActiveTimeoutTime, + idpw.print(" activeLeft="); + TimeUtils.formatDuration(appUsageHistory.bucketActiveTimeoutTime - totalElapsedTime, idpw); - idpw.print(" bucketWorkingSetTimeoutTime="); - TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.bucketWorkingSetTimeoutTime, + idpw.print(" wsLeft="); + TimeUtils.formatDuration(appUsageHistory.bucketWorkingSetTimeoutTime - totalElapsedTime, idpw); - idpw.print(" lastJobRunTime="); + idpw.print(" lastJob="); TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastJobRunTime, idpw); idpw.print(" idle=" + (isIdle(packageName, userId, elapsedRealtime) ? "y" : "n")); - idpw.print(" bucket=" + appUsageHistory.currentBucket - + " reason=" + appUsageHistory.bucketingReason); idpw.println(); } idpw.println(); diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java index c31809e913ad..e836677e38fc 100644 --- a/services/usage/java/com/android/server/usage/AppStandbyController.java +++ b/services/usage/java/com/android/server/usage/AppStandbyController.java @@ -16,11 +16,20 @@ package com.android.server.usage; -import static android.app.usage.UsageStatsManager.REASON_DEFAULT; -import static android.app.usage.UsageStatsManager.REASON_FORCED; -import static android.app.usage.UsageStatsManager.REASON_PREDICTED; -import static android.app.usage.UsageStatsManager.REASON_TIMEOUT; -import static android.app.usage.UsageStatsManager.REASON_USAGE; +import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK; +import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED; +import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT; +import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_ACTIVE_TIMEOUT; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_BACKGROUND; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_FOREGROUND; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_NOTIFICATION_SEEN; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYNC_ADAPTER; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_INTERACTION; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_UPDATE; +import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED; import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT; @@ -33,6 +42,7 @@ import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.AppGlobals; +import android.app.usage.AppStandbyInfo; import android.app.usage.UsageStatsManager.StandbyBuckets; import android.app.usage.UsageEvents; import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener; @@ -128,8 +138,8 @@ public class AppStandbyController { STANDBY_BUCKET_RARE }; - // Expiration time for predicted bucket - private static final long PREDICTION_TIMEOUT = 12 * ONE_HOUR; + /** Default expiration time for bucket prediction. After this, use thresholds to downgrade. */ + private static final long DEFAULT_PREDICTION_TIMEOUT = 12 * ONE_HOUR; /** * Indicates the maximum wait time for admin data to be available; @@ -186,6 +196,8 @@ public class AppStandbyController { long mNotificationSeenTimeoutMillis; /** Minimum time a system update event should keep the buckets elevated. */ long mSystemUpdateUsageTimeoutMillis; + /** Maximum time to wait for a prediction before using simple timeouts to downgrade buckets. */ + long mPredictionTimeoutMillis; volatile boolean mAppIdleEnabled; boolean mAppIdleTempParoled; @@ -222,24 +234,30 @@ public class AppStandbyController { // Whether the bucket change is because the user has started interacting with the app boolean isUserInteraction; - StandbyUpdateRecord(String pkgName, int userId, int bucket, boolean isInteraction) { + // Reason for bucket change + int reason; + + StandbyUpdateRecord(String pkgName, int userId, int bucket, int reason, + boolean isInteraction) { this.packageName = pkgName; this.userId = userId; this.bucket = bucket; + this.reason = reason; this.isUserInteraction = isInteraction; } public static StandbyUpdateRecord obtain(String pkgName, int userId, - int bucket, boolean isInteraction) { + int bucket, int reason, boolean isInteraction) { synchronized (sStandbyUpdatePool) { final int size = sStandbyUpdatePool.size(); if (size < 1) { - return new StandbyUpdateRecord(pkgName, userId, bucket, isInteraction); + return new StandbyUpdateRecord(pkgName, userId, bucket, reason, isInteraction); } StandbyUpdateRecord r = sStandbyUpdatePool.remove(size - 1); r.packageName = pkgName; r.userId = userId; r.bucket = bucket; + r.reason = reason; r.isUserInteraction = isInteraction; return r; } @@ -338,10 +356,11 @@ public class AppStandbyController { if (!packageName.equals(providerPkgName)) { synchronized (mAppIdleLock) { AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId, - STANDBY_BUCKET_ACTIVE, elapsedRealtime, + STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER, + elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis); maybeInformListeners(packageName, userId, elapsedRealtime, - appUsage.currentBucket, false); + appUsage.currentBucket, appUsage.bucketingReason, false); } } } catch (PackageManager.NameNotFoundException e) { @@ -496,50 +515,54 @@ public class AppStandbyController { if (isSpecial) { synchronized (mAppIdleLock) { mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, - STANDBY_BUCKET_EXEMPTED, REASON_DEFAULT); + STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT); } maybeInformListeners(packageName, userId, elapsedRealtime, - STANDBY_BUCKET_EXEMPTED, false); + STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT, false); } else { synchronized (mAppIdleLock) { final AppIdleHistory.AppUsageHistory app = mAppIdleHistory.getAppUsageHistory(packageName, userId, elapsedRealtime); - String reason = app.bucketingReason; + int reason = app.bucketingReason; + final int oldMainReason = reason & REASON_MAIN_MASK; // If the bucket was forced by the user/developer, leave it alone. // A usage event will be the only way to bring it out of this forced state - if (REASON_FORCED.equals(app.bucketingReason)) { + if (oldMainReason == REASON_MAIN_FORCED) { return; } final int oldBucket = app.currentBucket; int newBucket = Math.max(oldBucket, STANDBY_BUCKET_ACTIVE); // Undo EXEMPTED boolean predictionLate = false; // Compute age-based bucket - if (REASON_DEFAULT.equals(app.bucketingReason) - || REASON_USAGE.equals(app.bucketingReason) - || REASON_TIMEOUT.equals(app.bucketingReason) + if (oldMainReason == REASON_MAIN_DEFAULT + || oldMainReason == REASON_MAIN_USAGE + || oldMainReason == REASON_MAIN_TIMEOUT || (predictionLate = predictionTimedOut(app, elapsedRealtime))) { newBucket = getBucketForLocked(packageName, userId, elapsedRealtime); if (DEBUG) { Slog.d(TAG, "Evaluated AOSP newBucket = " + newBucket); } - reason = REASON_TIMEOUT; + reason = REASON_MAIN_TIMEOUT; } // Check if the app is within one of the timeouts for forced bucket elevation final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime); if (newBucket >= STANDBY_BUCKET_ACTIVE && app.bucketActiveTimeoutTime > elapsedTimeAdjusted) { newBucket = STANDBY_BUCKET_ACTIVE; - reason = REASON_USAGE; + reason = app.bucketingReason; if (DEBUG) { Slog.d(TAG, " Keeping at ACTIVE due to min timeout"); } } else if (newBucket >= STANDBY_BUCKET_WORKING_SET && app.bucketWorkingSetTimeoutTime > elapsedTimeAdjusted) { newBucket = STANDBY_BUCKET_WORKING_SET; - reason = REASON_USAGE; + // If it was already there, keep the reason, else assume timeout to WS + reason = (newBucket == oldBucket) + ? app.bucketingReason + : REASON_MAIN_USAGE | REASON_SUB_USAGE_ACTIVE_TIMEOUT; if (DEBUG) { Slog.d(TAG, " Keeping at WORKING_SET due to min timeout"); } @@ -552,43 +575,41 @@ public class AppStandbyController { mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket, reason); maybeInformListeners(packageName, userId, elapsedRealtime, - newBucket, false); + newBucket, reason, false); } } } } + /** Returns true if there hasn't been a prediction for the app in a while. */ private boolean predictionTimedOut(AppIdleHistory.AppUsageHistory app, long elapsedRealtime) { - return app.bucketingReason != null - && app.bucketingReason.startsWith(REASON_PREDICTED) + return (app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED && app.lastPredictedTime > 0 && mAppIdleHistory.getElapsedTime(elapsedRealtime) - - app.lastPredictedTime > PREDICTION_TIMEOUT; - } - - private boolean hasBucketTimeoutPassed(AppIdleHistory.AppUsageHistory app, - long elapsedRealtime) { - final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime); - return app.bucketActiveTimeoutTime < elapsedTimeAdjusted - && app.bucketWorkingSetTimeoutTime < elapsedTimeAdjusted; + - app.lastPredictedTime > mPredictionTimeoutMillis; } + /** Inform listeners if the bucket has changed since it was last reported to listeners */ private void maybeInformListeners(String packageName, int userId, - long elapsedRealtime, int bucket, boolean userStartedInteracting) { + long elapsedRealtime, int bucket, int reason, boolean userStartedInteracting) { synchronized (mAppIdleLock) { - // TODO: fold these into one call + lookup for efficiency if needed if (mAppIdleHistory.shouldInformListeners(packageName, userId, elapsedRealtime, bucket)) { - StandbyUpdateRecord r = StandbyUpdateRecord.obtain(packageName, userId, - bucket, userStartedInteracting); + final StandbyUpdateRecord r = StandbyUpdateRecord.obtain(packageName, userId, + bucket, reason, userStartedInteracting); if (DEBUG) Slog.d(TAG, "Standby bucket for " + packageName + "=" + bucket); - mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, - StandbyUpdateRecord.obtain(packageName, userId, - bucket, userStartedInteracting))); + mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, r)); } } } + /** + * Evaluates next bucket based on time since last used and the bucketing thresholds. + * @param packageName the app + * @param userId the user + * @param elapsedRealtime as the name suggests, current elapsed time + * @return the bucket for the app, based on time since last used + */ @GuardedBy("mAppIdleLock") @StandbyBuckets int getBucketForLocked(String packageName, int userId, long elapsedRealtime) { @@ -674,17 +695,20 @@ public class AppStandbyController { final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory( event.mPackage, userId, elapsedRealtime); final int prevBucket = appHistory.currentBucket; - final String prevBucketReason = appHistory.bucketingReason; + final int prevBucketReason = appHistory.bucketingReason; final long nextCheckTime; + final int subReason = usageEventToSubReason(event.mEventType); + final int reason = REASON_MAIN_USAGE | subReason; if (event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN) { // Mild usage elevates to WORKING_SET but doesn't change usage time. mAppIdleHistory.reportUsage(appHistory, event.mPackage, - STANDBY_BUCKET_WORKING_SET, + STANDBY_BUCKET_WORKING_SET, subReason, 0, elapsedRealtime + mNotificationSeenTimeoutMillis); nextCheckTime = mNotificationSeenTimeoutMillis; + } else { mAppIdleHistory.reportUsage(appHistory, event.mPackage, - STANDBY_BUCKET_ACTIVE, + STANDBY_BUCKET_ACTIVE, subReason, elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis); nextCheckTime = mStrongUsageTimeoutMillis; } @@ -694,9 +718,9 @@ public class AppStandbyController { final boolean userStartedInteracting = appHistory.currentBucket == STANDBY_BUCKET_ACTIVE && prevBucket != appHistory.currentBucket && - prevBucketReason != REASON_USAGE; + (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE; maybeInformListeners(event.mPackage, userId, elapsedRealtime, - appHistory.currentBucket, userStartedInteracting); + appHistory.currentBucket, reason, userStartedInteracting); if (previouslyIdle) { notifyBatteryStats(event.mPackage, userId, false); @@ -705,6 +729,17 @@ public class AppStandbyController { } } + private int usageEventToSubReason(int eventType) { + switch (eventType) { + case UsageEvents.Event.MOVE_TO_FOREGROUND: return REASON_SUB_USAGE_MOVE_TO_FOREGROUND; + case UsageEvents.Event.MOVE_TO_BACKGROUND: return REASON_SUB_USAGE_MOVE_TO_BACKGROUND; + case UsageEvents.Event.SYSTEM_INTERACTION: return REASON_SUB_USAGE_SYSTEM_INTERACTION; + case UsageEvents.Event.USER_INTERACTION: return REASON_SUB_USAGE_USER_INTERACTION; + case UsageEvents.Event.NOTIFICATION_SEEN: return REASON_SUB_USAGE_NOTIFICATION_SEEN; + default: return 0; + } + } + /** * Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle, * then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind @@ -730,7 +765,8 @@ public class AppStandbyController { userId, elapsedRealtime); // Inform listeners if necessary if (previouslyIdle != stillIdle) { - maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket, false); + maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket, + REASON_MAIN_FORCED, false); if (!stillIdle) { notifyBatteryStats(packageName, userId, idle); } @@ -954,18 +990,18 @@ public class AppStandbyController { } } - public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) { + public List<AppStandbyInfo> getAppStandbyBuckets(int userId) { synchronized (mAppIdleLock) { - return mAppIdleHistory.getAppStandbyBuckets(userId, elapsedRealtime, mAppIdleEnabled); + return mAppIdleHistory.getAppStandbyBuckets(userId, mAppIdleEnabled); } } void setAppStandbyBucket(String packageName, int userId, @StandbyBuckets int newBucket, - String reason, long elapsedRealtime) { + int reason, long elapsedRealtime) { synchronized (mAppIdleLock) { AppIdleHistory.AppUsageHistory app = mAppIdleHistory.getAppUsageHistory(packageName, userId, elapsedRealtime); - boolean predicted = reason != null && reason.startsWith(REASON_PREDICTED); + boolean predicted = (reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED; // Don't allow changing bucket if higher than ACTIVE if (app.currentBucket < STANDBY_BUCKET_ACTIVE) return; @@ -978,7 +1014,7 @@ public class AppStandbyController { } // If the bucket was forced, don't allow prediction to override - if (app.bucketingReason.equals(REASON_FORCED) && predicted) return; + if ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED && predicted) return; // If the bucket is required to stay in a higher state for a specified duration, don't // override unless the duration has passed @@ -988,14 +1024,18 @@ public class AppStandbyController { if (newBucket > STANDBY_BUCKET_ACTIVE && app.bucketActiveTimeoutTime > elapsedTimeAdjusted) { newBucket = STANDBY_BUCKET_ACTIVE; - reason = REASON_USAGE; + reason = app.bucketingReason; if (DEBUG) { Slog.d(TAG, " Keeping at ACTIVE due to min timeout"); } } else if (newBucket > STANDBY_BUCKET_WORKING_SET && app.bucketWorkingSetTimeoutTime > elapsedTimeAdjusted) { newBucket = STANDBY_BUCKET_WORKING_SET; - reason = REASON_USAGE; + if (app.currentBucket != newBucket) { + reason = REASON_MAIN_USAGE | REASON_SUB_USAGE_ACTIVE_TIMEOUT; + } else { + reason = app.bucketingReason; + } if (DEBUG) { Slog.d(TAG, " Keeping at WORKING_SET due to min timeout"); } @@ -1005,7 +1045,7 @@ public class AppStandbyController { mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket, reason); } - maybeInformListeners(packageName, userId, elapsedRealtime, newBucket, false); + maybeInformListeners(packageName, userId, elapsedRealtime, newBucket, reason, false); } @VisibleForTesting @@ -1105,11 +1145,12 @@ public class AppStandbyController { return packageName != null && packageName.equals(activeScorer); } - void informListeners(String packageName, int userId, int bucket, boolean userInteraction) { + void informListeners(String packageName, int userId, int bucket, int reason, + boolean userInteraction) { final boolean idle = bucket >= STANDBY_BUCKET_RARE; synchronized (mPackageAccessListeners) { for (AppIdleStateChangeListener listener : mPackageAccessListeners) { - listener.onAppIdleStateChanged(packageName, userId, idle, bucket); + listener.onAppIdleStateChanged(packageName, userId, idle, bucket, reason); if (userInteraction) { listener.onUserInteractionStarted(packageName, userId); } @@ -1187,7 +1228,8 @@ public class AppStandbyController { if (pi.applicationInfo != null && pi.applicationInfo.isSystemApp()) { // Mark app as used for 2 hours. After that it can timeout to whatever the // past usage pattern was. - mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE, 0, + mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE, + REASON_SUB_USAGE_SYSTEM_UPDATE, 0, elapsedRealtime + mSystemUpdateUsageTimeoutMillis); } } @@ -1368,7 +1410,8 @@ public class AppStandbyController { switch (msg.what) { case MSG_INFORM_LISTENERS: StandbyUpdateRecord r = (StandbyUpdateRecord) msg.obj; - informListeners(r.packageName, r.userId, r.bucket, r.isUserInteraction); + informListeners(r.packageName, r.userId, r.bucket, r.reason, + r.isUserInteraction); r.recycle(); break; @@ -1476,7 +1519,7 @@ public class AppStandbyController { "notification_seen_duration"; private static final String KEY_SYSTEM_UPDATE_HOLD_DURATION = "system_update_usage_duration"; - + private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout"; private final KeyValueListParser mParser = new KeyValueListParser(','); @@ -1546,6 +1589,9 @@ public class AppStandbyController { mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis (KEY_SYSTEM_UPDATE_HOLD_DURATION, COMPRESS_TIME ? 2 * ONE_MINUTE : 2 * ONE_HOUR); + mPredictionTimeoutMillis = mParser.getDurationMillis + (KEY_PREDICTION_TIMEOUT, + COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT); } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 3b0fd1f9d37c..69b2c63efc18 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -20,6 +20,7 @@ import android.Manifest; import android.app.ActivityManager; import android.app.AppOpsManager; import android.app.IUidObserver; +import android.app.usage.AppStandbyInfo; import android.app.usage.ConfigurationStats; import android.app.usage.IUsageStatsManager; import android.app.usage.UsageEvents; @@ -98,6 +99,7 @@ public class UsageStatsService extends SystemService implements static final int MSG_REPORT_EVENT = 0; static final int MSG_FLUSH_TO_DISK = 1; static final int MSG_REMOVE_USER = 2; + static final int MSG_UID_STATE_CHANGED = 3; private final Object mLock = new Object(); Handler mHandler; @@ -119,10 +121,10 @@ public class UsageStatsService extends SystemService implements new UsageStatsManagerInternal.AppIdleStateChangeListener() { @Override public void onAppIdleStateChanged(String packageName, int userId, boolean idle, - int bucket) { + int bucket, int reason) { Event event = new Event(); event.mEventType = Event.STANDBY_BUCKET_CHANGED; - event.mBucket = bucket; + event.mBucketAndReason = (bucket << 16) | (reason & 0xFFFF); event.mPackage = packageName; // This will later be converted to system time. event.mTimeStamp = SystemClock.elapsedRealtime(); @@ -219,18 +221,7 @@ public class UsageStatsService extends SystemService implements private final IUidObserver mUidObserver = new IUidObserver.Stub() { @Override public void onUidStateChanged(int uid, int procState, long procStateSeq) { - final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1; - synchronized (mUidToKernelCounter) { - final int oldCounter = mUidToKernelCounter.get(uid, 0); - if (newCounter != oldCounter) { - mUidToKernelCounter.put(uid, newCounter); - try { - FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter); - } catch (IOException e) { - Slog.w(TAG, "Failed to update counter set: " + e); - } - } - } + mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget(); } @Override @@ -560,6 +551,25 @@ public class UsageStatsService extends SystemService implements onUserRemoved(msg.arg1); break; + case MSG_UID_STATE_CHANGED: { + final int uid = msg.arg1; + final int procState = msg.arg2; + + final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1; + synchronized (mUidToKernelCounter) { + final int oldCounter = mUidToKernelCounter.get(uid, 0); + if (newCounter != oldCounter) { + mUidToKernelCounter.put(uid, newCounter); + try { + FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter); + } catch (IOException e) { + Slog.w(TAG, "Failed to update counter set: " + e); + } + } + } + break; + } + default: super.handleMessage(msg); break; @@ -740,9 +750,9 @@ public class UsageStatsService extends SystemService implements throw re.rethrowFromSystemServer(); } final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID; - final String reason = shellCaller - ? UsageStatsManager.REASON_FORCED - : UsageStatsManager.REASON_PREDICTED + ":" + callingUid; + final int reason = shellCaller + ? UsageStatsManager.REASON_MAIN_FORCED + : UsageStatsManager.REASON_MAIN_PREDICTED; final long token = Binder.clearCallingIdentity(); try { // Caller cannot set their own standby state @@ -758,7 +768,8 @@ public class UsageStatsService extends SystemService implements } @Override - public Map getAppStandbyBuckets(String callingPackageName, int userId) { + public ParceledListSlice<AppStandbyInfo> getAppStandbyBuckets(String callingPackageName, + int userId) { final int callingUid = Binder.getCallingUid(); try { userId = ActivityManager.getService().handleIncomingUser( @@ -773,15 +784,17 @@ public class UsageStatsService extends SystemService implements } final long token = Binder.clearCallingIdentity(); try { - return mAppStandby.getAppStandbyBuckets(userId, - SystemClock.elapsedRealtime()); + final List<AppStandbyInfo> standbyBucketList = + mAppStandby.getAppStandbyBuckets(userId); + return (standbyBucketList == null) ? ParceledListSlice.emptyList() + : new ParceledListSlice<>(standbyBucketList); } finally { Binder.restoreCallingIdentity(token); } } @Override - public void setAppStandbyBuckets(Map appBuckets, int userId) { + public void setAppStandbyBuckets(ParceledListSlice appBuckets, int userId) { getContext().enforceCallingPermission(Manifest.permission.CHANGE_APP_IDLE_STATE, "No permission to change app standby state"); @@ -794,16 +807,16 @@ public class UsageStatsService extends SystemService implements throw re.rethrowFromSystemServer(); } final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID; - final String reason = shellCaller - ? UsageStatsManager.REASON_FORCED - : UsageStatsManager.REASON_PREDICTED + ":" + callingUid; + final int reason = shellCaller + ? UsageStatsManager.REASON_MAIN_FORCED + : UsageStatsManager.REASON_MAIN_PREDICTED; final long token = Binder.clearCallingIdentity(); try { final long elapsedRealtime = SystemClock.elapsedRealtime(); - Map<String, Integer> buckets = (Map<String, Integer>) appBuckets; - for (Map.Entry<String, Integer> entry: buckets.entrySet()) { - String packageName = entry.getKey(); - int bucket = entry.getValue(); + List<AppStandbyInfo> bucketList = appBuckets.getList(); + for (AppStandbyInfo bucketInfo : bucketList) { + final String packageName = bucketInfo.mPackageName; + final int bucket = bucketInfo.mStandbyBucket; if (bucket < UsageStatsManager.STANDBY_BUCKET_ACTIVE || bucket > UsageStatsManager.STANDBY_BUCKET_NEVER) { throw new IllegalArgumentException( diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java index d1ed59921d4d..5e7e80db410b 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java +++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java @@ -26,10 +26,7 @@ import android.app.usage.TimeSparseArray; import android.app.usage.UsageEvents; import android.app.usage.UsageStats; import android.content.res.Configuration; -import android.text.TextUtils; import android.util.ArrayMap; -import android.util.Log; -import android.util.LogWriter; import java.io.IOException; import java.net.ProtocolException; @@ -175,7 +172,7 @@ final class UsageStatsXmlV1 { event.mShortcutId = (id != null) ? id.intern() : null; break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: - event.mBucket = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0); + event.mBucketAndReason = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0); break; } @@ -281,8 +278,8 @@ final class UsageStatsXmlV1 { } break; case UsageEvents.Event.STANDBY_BUCKET_CHANGED: - if (event.mBucket != 0) { - XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucket); + if (event.mBucketAndReason != 0) { + XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucketAndReason); } } diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index ec12da231568..3fbcd8116d9d 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -24,6 +24,7 @@ import android.app.usage.UsageStatsManager; import android.content.res.Configuration; import android.os.SystemClock; import android.content.Context; +import android.text.format.DateFormat; import android.text.format.DateUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -474,25 +475,25 @@ class UserUsageStatsService { mDatabase.checkinDailyFiles(new UsageStatsDatabase.CheckinAction() { @Override public boolean checkin(IntervalStats stats) { - printIntervalStats(pw, stats, false, null); + printIntervalStats(pw, stats, true, null); return true; } }); } void dump(IndentingPrintWriter pw, String pkg) { - // This is not a check-in, only dump in-memory stats. + printLast24HrEvents(pw, true, pkg); for (int interval = 0; interval < mCurrentStats.length; interval++) { pw.print("In-memory "); pw.print(intervalToString(interval)); pw.println(" stats"); - printIntervalStats(pw, mCurrentStats[interval], true, pkg); + printIntervalStats(pw, mCurrentStats[interval], false, pkg); } } private String formatDateTime(long dateTime, boolean pretty) { if (pretty) { - return "\"" + DateUtils.formatDateTime(mContext, dateTime, sDateFormatFlags) + "\""; + return "\"" + DateFormat.format("yyyy-MM-dd HH:mm:ss", dateTime).toString() + "\""; } return Long.toString(dateTime); } @@ -504,8 +505,83 @@ class UserUsageStatsService { return Long.toString(elapsedTime); } + + void printEvent(IndentingPrintWriter pw, UsageEvents.Event event, boolean prettyDates) { + pw.printPair("time", formatDateTime(event.mTimeStamp, prettyDates)); + pw.printPair("type", eventToString(event.mEventType)); + pw.printPair("package", event.mPackage); + if (event.mClass != null) { + pw.printPair("class", event.mClass); + } + if (event.mConfiguration != null) { + pw.printPair("config", Configuration.resourceQualifierString(event.mConfiguration)); + } + if (event.mShortcutId != null) { + pw.printPair("shortcutId", event.mShortcutId); + } + if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) { + pw.printPair("standbyBucket", event.getStandbyBucket()); + pw.printPair("reason", UsageStatsManager.reasonToString(event.getStandbyReason())); + } + pw.printHexPair("flags", event.mFlags); + pw.println(); + } + + void printLast24HrEvents(IndentingPrintWriter pw, boolean prettyDates, final String pkg) { + final long endTime = System.currentTimeMillis(); + UnixCalendar yesterday = new UnixCalendar(endTime); + yesterday.addDays(-1); + + final long beginTime = yesterday.getTimeInMillis(); + + List<UsageEvents.Event> events = queryStats(UsageStatsManager.INTERVAL_DAILY, + beginTime, endTime, new StatCombiner<UsageEvents.Event>() { + @Override + public void combine(IntervalStats stats, boolean mutable, + List<UsageEvents.Event> accumulatedResult) { + if (stats.events == null) { + return; + } + + final int startIndex = stats.events.closestIndexOnOrAfter(beginTime); + if (startIndex < 0) { + return; + } + + final int size = stats.events.size(); + for (int i = startIndex; i < size; i++) { + if (stats.events.keyAt(i) >= endTime) { + return; + } + + UsageEvents.Event event = stats.events.valueAt(i); + if (pkg != null && !pkg.equals(event.mPackage)) { + continue; + } + accumulatedResult.add(event); + } + } + }); + + pw.print("Last 24 hour events ("); + if (prettyDates) { + pw.printPair("timeRange", "\"" + DateUtils.formatDateRange(mContext, + beginTime, endTime, sDateFormatFlags) + "\""); + } else { + pw.printPair("beginTime", beginTime); + pw.printPair("endTime", endTime); + } + pw.println(")"); + pw.increaseIndent(); + for (UsageEvents.Event event : events) { + printEvent(pw, event, prettyDates); + } + pw.decreaseIndent(); + } + void printIntervalStats(IndentingPrintWriter pw, IntervalStats stats, - boolean prettyDates, String pkg) { + boolean checkin, String pkg) { + boolean prettyDates = !checkin; if (prettyDates) { pw.printPair("timeRange", "\"" + DateUtils.formatDateRange(mContext, stats.beginTime, stats.endTime, sDateFormatFlags) + "\""); @@ -578,35 +654,23 @@ class UserUsageStatsService { pw.decreaseIndent(); } - pw.println("events"); - pw.increaseIndent(); - final TimeSparseArray<UsageEvents.Event> events = stats.events; - final int eventCount = events != null ? events.size() : 0; - for (int i = 0; i < eventCount; i++) { - final UsageEvents.Event event = events.valueAt(i); - if (pkg != null && !pkg.equals(event.mPackage)) { - continue; - } - pw.printPair("time", formatDateTime(event.mTimeStamp, prettyDates)); - pw.printPair("type", eventToString(event.mEventType)); - pw.printPair("package", event.mPackage); - if (event.mClass != null) { - pw.printPair("class", event.mClass); - } - if (event.mConfiguration != null) { - pw.printPair("config", Configuration.resourceQualifierString(event.mConfiguration)); - } - if (event.mShortcutId != null) { - pw.printPair("shortcutId", event.mShortcutId); - } - if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) { - pw.printPair("standbyBucket", event.mBucket); + // The last 24 hours of events is already printed in the non checkin dump + // No need to repeat here. + if (checkin) { + pw.println("events"); + pw.increaseIndent(); + final TimeSparseArray<UsageEvents.Event> events = stats.events; + final int eventCount = events != null ? events.size() : 0; + for (int i = 0; i < eventCount; i++) { + final UsageEvents.Event event = events.valueAt(i); + if (pkg != null && !pkg.equals(event.mPackage)) { + continue; + } + printEvent(pw, event, prettyDates); } - pw.printHexPair("flags", event.mFlags); - pw.println(); + pw.decreaseIndent(); } pw.decreaseIndent(); - pw.decreaseIndent(); } private static String intervalToString(int interval) { diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index a7fc470864a5..ef0780a0eeff 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -1359,9 +1359,7 @@ public class UsbDeviceManager implements ActivityManagerInternal.ScreenObserver UsbManager.USB_FUNCTION_NONE).equals( getSystemProperty(USB_STATE_PROPERTY, UsbManager.USB_FUNCTION_NONE)); } - // Mask out adb, since it is stored in mAdbEnabled - mCurrentFunctions = UsbManager.usbFunctionsFromString(mCurrentFunctionsStr) - & ~UsbManager.FUNCTION_ADB; + mCurrentFunctions = UsbManager.FUNCTION_NONE; mCurrentUsbFunctionsReceived = true; String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim(); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 0c92c2000f92..a79f2c9eaf17 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -422,6 +422,7 @@ public final class Call { /** * Indicates the call used Assisted Dialing. * See also {@link Connection#PROPERTY_ASSISTED_DIALING_USED} + * @hide */ public static final int PROPERTY_ASSISTED_DIALING_USED = 0x00000200; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 26a2f1cb8c4f..36333e448b15 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -35,7 +35,6 @@ import android.os.IBinder; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; -import android.os.Parcelable; import android.os.RemoteException; import android.os.SystemClock; import android.util.ArraySet; @@ -407,6 +406,7 @@ public abstract class Connection extends Conferenceable { /** * Set by the framework to indicate that a connection is using assisted dialing. + * @hide */ public static final int PROPERTY_ASSISTED_DIALING_USED = 1 << 9; @@ -2553,19 +2553,6 @@ public abstract class Connection extends Conferenceable { } /** - * Adds a parcelable extra to this {@code Connection}. - * - * @param key The extra key. - * @param value The value. - * @hide - */ - public final void putExtra(@NonNull String key, @NonNull Parcelable value) { - Bundle newExtras = new Bundle(); - newExtras.putParcelable(key, value); - putExtras(newExtras); - } - - /** * Removes extras from this {@code Connection}. * * @param keys The keys of the extras to remove. diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index a180da6d6480..e456830dafbe 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -111,12 +111,6 @@ public class TelecomManager { "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS"; /** - * The {@link android.content.Intent} action used to show the assisted dialing settings. - */ - public static final String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = - "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS"; - - /** * The {@link android.content.Intent} action used to show the settings page used to configure * {@link PhoneAccount} preferences. */ @@ -619,17 +613,12 @@ public class TelecomManager { /** * The boolean indicated by this extra controls whether or not a call is eligible to undergo * assisted dialing. This extra is stored under {@link #EXTRA_OUTGOING_CALL_EXTRAS}. + * @hide */ public static final String EXTRA_USE_ASSISTED_DIALING = "android.telecom.extra.USE_ASSISTED_DIALING"; /** - * The bundle indicated by this extra store information related to the assisted dialing action. - */ - public static final String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO = - "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO"; - - /** * The following 4 constants define how properties such as phone numbers and names are * displayed to the user. */ diff --git a/telecomm/java/android/telecom/TransformationInfo.java b/telecomm/java/android/telecom/TransformationInfo.java deleted file mode 100755 index 3e848c6f2f80..000000000000 --- a/telecomm/java/android/telecom/TransformationInfo.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2017 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.telecom; - -import android.os.Parcelable; -import android.os.Parcel; - -/** - * A container class to hold information related to the Assisted Dialing operation. All member - * variables must be set when constructing a new instance of this class. - */ -public final class TransformationInfo implements Parcelable { - private String mOriginalNumber; - private String mTransformedNumber; - private String mUserHomeCountryCode; - private String mUserRoamingCountryCode; - private int mTransformedNumberCountryCallingCode; - - public TransformationInfo(String originalNumber, - String transformedNumber, - String userHomeCountryCode, - String userRoamingCountryCode, - int transformedNumberCountryCallingCode) { - String missing = ""; - if (originalNumber == null) { - missing += " mOriginalNumber"; - } - if (transformedNumber == null) { - missing += " mTransformedNumber"; - } - if (userHomeCountryCode == null) { - missing += " mUserHomeCountryCode"; - } - if (userRoamingCountryCode == null) { - missing += " mUserRoamingCountryCode"; - } - - if (!missing.isEmpty()) { - throw new IllegalStateException("Missing required properties:" + missing); - } - this.mOriginalNumber = originalNumber; - this.mTransformedNumber = transformedNumber; - this.mUserHomeCountryCode = userHomeCountryCode; - this.mUserRoamingCountryCode = userRoamingCountryCode; - this.mTransformedNumberCountryCallingCode = transformedNumberCountryCallingCode; - } - - public int describeContents() { - return 0; - } - - public void writeToParcel(Parcel out, int flags) { - out.writeString(mOriginalNumber); - out.writeString(mTransformedNumber); - out.writeString(mUserHomeCountryCode); - out.writeString(mUserRoamingCountryCode); - out.writeInt(mTransformedNumberCountryCallingCode); - } - - public static final Parcelable.Creator<TransformationInfo> CREATOR - = new Parcelable.Creator<TransformationInfo>() { - public TransformationInfo createFromParcel(Parcel in) { - return new TransformationInfo(in); - } - - public TransformationInfo[] newArray(int size) { - return new TransformationInfo[size]; - } - }; - - private TransformationInfo(Parcel in) { - mOriginalNumber = in.readString(); - mTransformedNumber = in.readString(); - mUserHomeCountryCode = in.readString(); - mUserRoamingCountryCode = in.readString(); - mTransformedNumberCountryCallingCode = in.readInt(); - } - - /** - * The original number that underwent Assisted Dialing. - */ - public String getOriginalNumber() { - return mOriginalNumber; - } - - /** - * The number after it underwent Assisted Dialing. - */ - public String getTransformedNumber() { - return mTransformedNumber; - } - - /** - * The user's home country code that was used when attempting to transform the number. - */ - public String getUserHomeCountryCode() { - return mUserHomeCountryCode; - } - - /** - * The users's roaming country code that was used when attempting to transform the number. - */ - public String getUserRoamingCountryCode() { - return mUserRoamingCountryCode; - } - - /** - * The country calling code that was used in the transformation. - */ - public int getTransformedNumberCountryCallingCode() { - return mTransformedNumberCountryCallingCode; - } -} diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java index 63263bd37206..e7f0cc2423f4 100644 --- a/telephony/java/android/provider/Telephony.java +++ b/telephony/java/android/provider/Telephony.java @@ -2732,6 +2732,7 @@ public final class Telephony { * This should be spread to other technologies, * but is currently only used for LTE (14) and eHRPD (13). * <P>Type: INTEGER</P> + * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead */ @Deprecated public static final String BEARER = "bearer"; @@ -2744,13 +2745,14 @@ public final class Telephony { * Bitmask for a radio tech R is (1 << (R - 1)) * <P>Type: INTEGER</P> * @hide + * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead */ @Deprecated public static final String BEARER_BITMASK = "bearer_bitmask"; /** * Radio technology (network type) bitmask. - * To check what values can be contained, refer to + * To check what values can be contained, refer to the NETWORK_TYPE_ constants in * {@link android.telephony.TelephonyManager}. * Bitmask for a radio tech R is (1 << (R - 1)) * <P>Type: INTEGER</P> diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 2d3d49ce3d51..6798a83142dc 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -1704,13 +1704,6 @@ public class CarrierConfigManager { "roaming_operator_string_array"; /** - * Controls whether Assisted Dialing is enabled and the preference is shown. This feature - * transforms numbers when the user is roaming. - */ - public static final String KEY_ASSISTED_DIALING_ENABLED_BOOL = - "assisted_dialing_enabled_bool"; - - /** * URL from which the proto containing the public key of the Carrier used for * IMSI encryption will be downloaded. * @hide @@ -2131,7 +2124,6 @@ public class CarrierConfigManager { false); sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null); sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null); - sDefaults.putBoolean(KEY_ASSISTED_DIALING_ENABLED_BOOL, true); sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false); sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false); sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false); diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java index da3d87bc7211..ce1b80c2c860 100644 --- a/telephony/java/android/telephony/MbmsDownloadSession.java +++ b/telephony/java/android/telephony/MbmsDownloadSession.java @@ -30,7 +30,6 @@ import android.content.SharedPreferences; import android.net.Uri; import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.telephony.mbms.DownloadStateCallback; import android.telephony.mbms.FileInfo; @@ -53,6 +52,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -107,11 +107,8 @@ public class MbmsDownloadSession implements AutoCloseable { /** * {@link Uri} extra that Android will attach to the intent supplied via * {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)} - * Indicates the location of the successfully downloaded file within the temp file root set - * via {@link #setTempFileRootDirectory(File)}. - * While you may use this file in-place, it is highly encouraged that you move - * this file to a different location after receiving the download completion intent, as this - * file resides within the temp file directory. + * Indicates the location of the successfully downloaded file within the directory that the + * app provided via the builder. * * Will always be set to a non-null value if * {@link #EXTRA_MBMS_DOWNLOAD_RESULT} is set to {@link #RESULT_SUCCESSFUL}. @@ -220,6 +217,8 @@ public class MbmsDownloadSession implements AutoCloseable { */ public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4; + private static final String DESTINATION_SANITY_CHECK_FILE_NAME = "destinationSanityCheckFile"; + private static AtomicBoolean sIsInitialized = new AtomicBoolean(false); private final Context mContext; @@ -236,23 +235,20 @@ public class MbmsDownloadSession implements AutoCloseable { private final Map<DownloadStateCallback, InternalDownloadStateCallback> mInternalDownloadCallbacks = new HashMap<>(); - private MbmsDownloadSession(Context context, MbmsDownloadSessionCallback callback, - int subscriptionId, Handler handler) { + private MbmsDownloadSession(Context context, Executor executor, int subscriptionId, + MbmsDownloadSessionCallback callback) { mContext = context; mSubscriptionId = subscriptionId; - if (handler == null) { - handler = new Handler(Looper.getMainLooper()); - } - mInternalCallback = new InternalDownloadSessionCallback(callback, handler); + mInternalCallback = new InternalDownloadSessionCallback(callback, executor); } /** * Create a new {@link MbmsDownloadSession} using the system default data subscription ID. - * See {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)} + * See {@link #create(Context, Executor, int, MbmsDownloadSessionCallback)} */ public static MbmsDownloadSession create(@NonNull Context context, - @NonNull MbmsDownloadSessionCallback callback, @NonNull Handler handler) { - return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler); + @NonNull Executor executor, @NonNull MbmsDownloadSessionCallback callback) { + return create(context, executor, SubscriptionManager.getDefaultSubscriptionId(), callback); } /** @@ -279,24 +275,24 @@ public class MbmsDownloadSession implements AutoCloseable { * {@link MbmsDownloadSession} that you received before calling this method again. * * @param context The instance of {@link Context} to use - * @param callback A callback to get asynchronous error messages and file service updates. + * @param executor The executor on which you wish to execute callbacks. * @param subscriptionId The data subscription ID to use - * @param handler The {@link Handler} on which callbacks should be enqueued. + * @param callback A callback to get asynchronous error messages and file service updates. * @return A new instance of {@link MbmsDownloadSession}, or null if an error occurred during * setup. */ public static @Nullable MbmsDownloadSession create(@NonNull Context context, - final @NonNull MbmsDownloadSessionCallback callback, - int subscriptionId, @NonNull Handler handler) { + @NonNull Executor executor, int subscriptionId, + final @NonNull MbmsDownloadSessionCallback callback) { if (!sIsInitialized.compareAndSet(false, true)) { throw new IllegalStateException("Cannot have two active instances"); } MbmsDownloadSession session = - new MbmsDownloadSession(context, callback, subscriptionId, handler); + new MbmsDownloadSession(context, executor, subscriptionId, callback); final int result = session.bindAndInitialize(); if (result != MbmsErrors.SUCCESS) { sIsInitialized.set(false); - handler.post(new Runnable() { + executor.execute(new Runnable() { @Override public void run() { callback.onError(result, null); @@ -500,6 +496,10 @@ public class MbmsDownloadSession implements AutoCloseable { * {@link MbmsDownloadSession#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY} and store that as the temp * file root directory. * + * If the {@link DownloadRequest} has a destination that is not on the same filesystem as the + * temp file directory provided via {@link #getTempFileRootDirectory()}, an + * {@link IllegalArgumentException} will be thrown. + * * Asynchronous errors through the callback may include any error not specific to the * streaming use-case. * @param request The request that specifies what should be downloaded. @@ -522,6 +522,8 @@ public class MbmsDownloadSession implements AutoCloseable { setTempFileRootDirectory(tempRootDirectory); } + checkDownloadRequestDestination(request); + try { int result = downloadService.download(request); if (result == MbmsErrors.SUCCESS) { @@ -568,21 +570,21 @@ public class MbmsDownloadSession implements AutoCloseable { * this method will throw an {@link IllegalArgumentException}. * * @param request The {@link DownloadRequest} that you want updates on. + * @param executor The {@link Executor} on which calls to {@code callback} should be executed. * @param callback The callback that should be called when the middleware has information to * share on the download. - * @param handler The {@link Handler} on which calls to {@code callback} should be enqueued on. * @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error, * and some other error code otherwise. */ public int registerStateCallback(@NonNull DownloadRequest request, - @NonNull DownloadStateCallback callback, @NonNull Handler handler) { + @NonNull Executor executor, @NonNull DownloadStateCallback callback) { IMbmsDownloadService downloadService = mService.get(); if (downloadService == null) { throw new IllegalStateException("Middleware not yet bound"); } InternalDownloadStateCallback internalCallback = - new InternalDownloadStateCallback(callback, handler); + new InternalDownloadStateCallback(callback, executor); try { int result = downloadService.registerStateCallback(request, internalCallback, @@ -604,7 +606,7 @@ public class MbmsDownloadSession implements AutoCloseable { /** * Un-register a callback previously registered via - * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}. After + * {@link #registerStateCallback(DownloadRequest, Executor, DownloadStateCallback)}. After * this method is called, no further callbacks will be enqueued on the {@link Handler} * provided upon registration, even if this method throws an exception. * @@ -692,7 +694,7 @@ public class MbmsDownloadSession implements AutoCloseable { * The state will be delivered as a callback via * {@link DownloadStateCallback#onStateUpdated(DownloadRequest, FileInfo, int)}. If no such * callback has been registered via - * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}, this + * {@link #registerStateCallback(DownloadRequest, Executor, DownloadStateCallback)}, this * method will be a no-op. * * If the middleware has no record of the @@ -775,7 +777,7 @@ public class MbmsDownloadSession implements AutoCloseable { * instance of {@link MbmsDownloadSessionCallback}, but callbacks that have already been * enqueued will still be delivered. * - * It is safe to call {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)} to + * It is safe to call {@link #create(Context, Executor, int, MbmsDownloadSessionCallback)} to * obtain another instance of {@link MbmsDownloadSession} immediately after this method * returns. * @@ -831,6 +833,36 @@ public class MbmsDownloadSession implements AutoCloseable { } } + private void checkDownloadRequestDestination(DownloadRequest request) { + File downloadRequestDestination = new File(request.getDestinationUri().getPath()); + if (!downloadRequestDestination.isDirectory()) { + throw new IllegalArgumentException("The destination path must be a directory"); + } + // Check if the request destination is okay to use by attempting to rename an empty + // file to there. + File testFile = new File(MbmsTempFileProvider.getEmbmsTempFileDir(mContext), + DESTINATION_SANITY_CHECK_FILE_NAME); + File testFileDestination = new File(downloadRequestDestination, + DESTINATION_SANITY_CHECK_FILE_NAME); + + try { + if (!testFile.exists()) { + testFile.createNewFile(); + } + if (!testFile.renameTo(testFileDestination)) { + throw new IllegalArgumentException("Destination provided in the download request " + + "is invalid -- files in the temp file directory cannot be directly moved " + + "there."); + } + } catch (IOException e) { + throw new IllegalStateException("Got IOException while testing out the destination: " + + e); + } finally { + testFile.delete(); + testFileDestination.delete(); + } + } + private File getDownloadRequestTokenPath(DownloadRequest request) { File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext, request.getFileServiceId()); diff --git a/telephony/java/android/telephony/MbmsStreamingSession.java b/telephony/java/android/telephony/MbmsStreamingSession.java index fb2ff7b178b1..42c760d4dde8 100644 --- a/telephony/java/android/telephony/MbmsStreamingSession.java +++ b/telephony/java/android/telephony/MbmsStreamingSession.java @@ -24,9 +24,7 @@ import android.annotation.TestApi; import android.content.ComponentName; import android.content.Context; import android.content.ServiceConnection; -import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.telephony.mbms.InternalStreamingSessionCallback; import android.telephony.mbms.InternalStreamingServiceCallback; @@ -42,6 +40,7 @@ import android.util.Log; import java.util.List; import java.util.Set; +import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -89,14 +88,11 @@ public class MbmsStreamingSession implements AutoCloseable { private int mSubscriptionId = INVALID_SUBSCRIPTION_ID; /** @hide */ - private MbmsStreamingSession(Context context, MbmsStreamingSessionCallback callback, - int subscriptionId, Handler handler) { + private MbmsStreamingSession(Context context, Executor executor, int subscriptionId, + MbmsStreamingSessionCallback callback) { mContext = context; mSubscriptionId = subscriptionId; - if (handler == null) { - handler = new Handler(Looper.getMainLooper()); - } - mInternalCallback = new InternalStreamingSessionCallback(callback, handler); + mInternalCallback = new InternalStreamingSessionCallback(callback, executor); } /** @@ -117,25 +113,25 @@ public class MbmsStreamingSession implements AutoCloseable { * {@link MbmsStreamingSession} that you received before calling this method again. * * @param context The {@link Context} to use. + * @param executor The executor on which you wish to execute callbacks. + * @param subscriptionId The subscription ID to use. * @param callback A callback object on which you wish to receive results of asynchronous * operations. - * @param subscriptionId The subscription ID to use. - * @param handler The handler you wish to receive callbacks on. * @return An instance of {@link MbmsStreamingSession}, or null if an error occurred. */ public static @Nullable MbmsStreamingSession create(@NonNull Context context, - final @NonNull MbmsStreamingSessionCallback callback, int subscriptionId, - @NonNull Handler handler) { + @NonNull Executor executor, int subscriptionId, + final @NonNull MbmsStreamingSessionCallback callback) { if (!sIsInitialized.compareAndSet(false, true)) { throw new IllegalStateException("Cannot create two instances of MbmsStreamingSession"); } - MbmsStreamingSession session = new MbmsStreamingSession(context, callback, - subscriptionId, handler); + MbmsStreamingSession session = new MbmsStreamingSession(context, executor, + subscriptionId, callback); final int result = session.bindAndInitialize(); if (result != MbmsErrors.SUCCESS) { sIsInitialized.set(false); - handler.post(new Runnable() { + executor.execute(new Runnable() { @Override public void run() { callback.onError(result, null); @@ -148,22 +144,22 @@ public class MbmsStreamingSession implements AutoCloseable { /** * Create a new {@link MbmsStreamingSession} using the system default data subscription ID. - * See {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)}. + * See {@link #create(Context, Executor, int, MbmsStreamingSessionCallback)}. */ public static MbmsStreamingSession create(@NonNull Context context, - @NonNull MbmsStreamingSessionCallback callback, @NonNull Handler handler) { - return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler); + @NonNull Executor executor, @NonNull MbmsStreamingSessionCallback callback) { + return create(context, executor, SubscriptionManager.getDefaultSubscriptionId(), callback); } /** * Terminates this instance. Also terminates * any streaming services spawned from this instance as if - * {@link StreamingService#stopStreaming()} had been called on them. After this method returns, + * {@link StreamingService#close()} had been called on them. After this method returns, * no further callbacks originating from the middleware will be enqueued on the provided * instance of {@link MbmsStreamingSessionCallback}, but callbacks that have already been * enqueued will still be delivered. * - * It is safe to call {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)} to + * It is safe to call {@link #create(Context, Executor, int, MbmsStreamingSessionCallback)} to * obtain another instance of {@link MbmsStreamingSession} immediately after this method * returns. * @@ -237,20 +233,20 @@ public class MbmsStreamingSession implements AutoCloseable { * {@link MbmsErrors.StreamingErrors}. * * @param serviceInfo The information about the service to stream. + * @param executor The executor on which you wish to execute callbacks for this stream. * @param callback A callback that'll be called when something about the stream changes. - * @param handler A handler that calls to {@code callback} should be called on. * @return An instance of {@link StreamingService} through which the stream can be controlled. * May be {@code null} if an error occurred. */ public @Nullable StreamingService startStreaming(StreamingServiceInfo serviceInfo, - StreamingServiceCallback callback, @NonNull Handler handler) { + @NonNull Executor executor, StreamingServiceCallback callback) { IMbmsStreamingService streamingService = mService.get(); if (streamingService == null) { throw new IllegalStateException("Middleware not yet bound"); } InternalStreamingServiceCallback serviceCallback = new InternalStreamingServiceCallback( - callback, handler); + callback, executor); StreamingService serviceForApp = new StreamingService( mSubscriptionId, streamingService, this, serviceInfo, serviceCallback); diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index ec348dfcc047..82a7450945f7 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -19,6 +19,7 @@ package android.telephony; import android.annotation.IntDef; import android.annotation.Nullable; import android.annotation.SystemApi; +import android.annotation.TestApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -178,7 +179,6 @@ public class ServiceState implements Parcelable { /** * Number of radio technologies for GSM, UMTS and CDMA. - * @hide */ private static final int NEXT_RIL_RADIO_TECHNOLOGY = 20; @@ -340,6 +340,8 @@ public class ServiceState implements Parcelable { mIsEmergencyOnly = s.mIsEmergencyOnly; mIsDataRoamingFromRegistration = s.mIsDataRoamingFromRegistration; mIsUsingCarrierAggregation = s.mIsUsingCarrierAggregation; + mChannelNumber = s.mChannelNumber; + mCellBandwidths = Arrays.copyOf(s.mCellBandwidths, s.mCellBandwidths.length); mLteEarfcnRsrpBoost = s.mLteEarfcnRsrpBoost; mNetworkRegistrationStates = new ArrayList<>(s.mNetworkRegistrationStates); } @@ -1214,6 +1216,7 @@ public class ServiceState implements Parcelable { } /** @hide */ + @TestApi public void setSystemAndNetworkId(int systemId, int networkId) { this.mSystemId = systemId; this.mNetworkId = networkId; diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 0874b86494e6..8a3f138cae1d 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -395,6 +395,112 @@ public final class SmsManager { } /** + * Send a text based SMS with messaging options. + * + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param text the body of the message to send + * @param sentIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is successfully sent, or failed. + * The result code will be <code>Activity.RESULT_OK</code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is delivered to the recipient. The + * raw pdu of the status report is in the extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending messages through same link or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + * + * @throws IllegalArgumentException if destinationAddress or text are empty + * {@hide} + */ + public void sendTextMessage( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, + int priority, boolean expectMore, int validityPeriod) { + sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, + true /* persistMessage*/, priority, expectMore, validityPeriod); + } + + private void sendTextMessageInternal( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage, + int priority, boolean expectMore, int validityPeriod) { + if (TextUtils.isEmpty(destinationAddress)) { + throw new IllegalArgumentException("Invalid destinationAddress"); + } + + if (TextUtils.isEmpty(text)) { + throw new IllegalArgumentException("Invalid message body"); + } + + if (priority < 0x00 || priority > 0x03) { + throw new IllegalArgumentException("Invalid priority"); + } + + if (validityPeriod < 0x05 || validityPeriod > 0x09b0a0) { + throw new IllegalArgumentException("Invalid validity period"); + } + + try { + ISms iccISms = getISmsServiceOrThrow(); + if (iccISms != null) { + iccISms.sendTextForSubscriberWithOptions(getSubscriptionId(), + ActivityThread.currentPackageName(), destinationAddress, scAddress, text, + sentIntent, deliveryIntent, persistMessage, priority, expectMore, + validityPeriod); + } + } catch (RemoteException ex) { + // ignore it + } + } + + /** + * Send a text based SMS without writing it into the SMS Provider. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier + * privileges. + * </p> + * + * @see #sendTextMessage(String, String, String, PendingIntent, + * PendingIntent, int, boolean, int) + * @hide + */ + public void sendTextMessageWithoutPersisting( + String destinationAddress, String scAddress, String text, + PendingIntent sentIntent, PendingIntent deliveryIntent, int priority, + boolean expectMore, int validityPeriod) { + sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, + false /* persistMessage */, priority, expectMore, validityPeriod); + } + + /** + * * Inject an SMS PDU into the android application framework. * * <p>Requires permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE} or carrier @@ -552,6 +658,140 @@ public final class SmsManager { } /** + * Send a multi-part text based SMS with messaging options. The callee should have already + * divided the message into correctly sized parts by calling + * <code>divideMessage</code>. + * + * <p class="note"><strong>Note:</strong> Using this method requires that your app has the + * {@link android.Manifest.permission#SEND_SMS} permission.</p> + * + * <p class="note"><strong>Note:</strong> Beginning with Android 4.4 (API level 19), if + * <em>and only if</em> an app is not selected as the default SMS app, the system automatically + * writes messages sent using this method to the SMS Provider (the default SMS app is always + * responsible for writing its sent messages to the SMS Provider). For information about + * how to behave as the default SMS app, see {@link android.provider.Telephony}.</p> + * + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param parts an <code>ArrayList</code> of strings that, in order, + * comprise the original message + * @param sentIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been sent. + * The result code will be <code>Activity.RESULT_OK</code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> each sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been delivered + * to the recipient. The raw pdu of the status report is in the + * extended data ("pdu"). + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending messages through same link or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + * + * @throws IllegalArgumentException if destinationAddress or data are empty + * {@hide} + */ + public void sendMultipartTextMessage( + String destinationAddress, String scAddress, ArrayList<String> parts, + ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, + int priority, boolean expectMore, int validityPeriod) { + sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, + deliveryIntents, true /* persistMessage*/); + } + + private void sendMultipartTextMessageInternal( + String destinationAddress, String scAddress, List<String> parts, + List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents, + boolean persistMessage, int priority, boolean expectMore, int validityPeriod) { + if (TextUtils.isEmpty(destinationAddress)) { + throw new IllegalArgumentException("Invalid destinationAddress"); + } + if (parts == null || parts.size() < 1) { + throw new IllegalArgumentException("Invalid message body"); + } + + if (priority < 0x00 || priority > 0x03) { + throw new IllegalArgumentException("Invalid priority"); + } + + if (validityPeriod < 0x05 || validityPeriod > 0x09b0a0) { + throw new IllegalArgumentException("Invalid validity period"); + } + + if (parts.size() > 1) { + try { + ISms iccISms = getISmsServiceOrThrow(); + if (iccISms != null) { + iccISms.sendMultipartTextForSubscriberWithOptions(getSubscriptionId(), + ActivityThread.currentPackageName(), destinationAddress, scAddress, + parts, sentIntents, deliveryIntents, persistMessage, priority, + expectMore, validityPeriod); + } + } catch (RemoteException ex) { + // ignore it + } + } else { + PendingIntent sentIntent = null; + PendingIntent deliveryIntent = null; + if (sentIntents != null && sentIntents.size() > 0) { + sentIntent = sentIntents.get(0); + } + if (deliveryIntents != null && deliveryIntents.size() > 0) { + deliveryIntent = deliveryIntents.get(0); + } + sendTextMessageInternal(destinationAddress, scAddress, parts.get(0), + sentIntent, deliveryIntent, persistMessage, priority, expectMore, + validityPeriod); + } + } + + /** + * Send a multi-part text based SMS without writing it into the SMS Provider. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#MODIFY_PHONE_STATE} or the calling app has carrier + * privileges. + * </p> + * + * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, + * ArrayList, int, boolean, int) + * @hide + **/ + public void sendMultipartTextMessageWithoutPersisting( + String destinationAddress, String scAddress, List<String> parts, + List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents, + int priority, boolean expectMore, int validityPeriod) { + sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, + deliveryIntents, false /* persistMessage*/, priority, expectMore, + validityPeriod); + } + + /** * Send a data based SMS to a specific application port. * * <p class="note"><strong>Note:</strong> Using this method requires that your app has the @@ -1014,7 +1254,7 @@ public final class SmsManager { * <code>getAllMessagesFromIcc</code> * @return <code>ArrayList</code> of <code>SmsMessage</code> objects. */ - private static ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { + private ArrayList<SmsMessage> createMessageListFromRawRecords(List<SmsRawData> records) { ArrayList<SmsMessage> messages = new ArrayList<SmsMessage>(); if (records != null) { int count = records.size(); @@ -1022,7 +1262,8 @@ public final class SmsManager { SmsRawData data = records.get(i); // List contains all records, including "free" records (null) if (data != null) { - SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes()); + SmsMessage sms = SmsMessage.createFromEfRecord(i+1, data.getBytes(), + getSubscriptionId()); if (sms != null) { messages.add(sms); } diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java index 577ea7dfc004..9d03b59797ac 100644 --- a/telephony/java/android/telephony/SmsMessage.java +++ b/telephony/java/android/telephony/SmsMessage.java @@ -277,6 +277,31 @@ public class SmsMessage { } /** + * Create an SmsMessage from an SMS EF record. + * + * @param index Index of SMS record. This should be index in ArrayList + * returned by SmsManager.getAllMessagesFromSim + 1. + * @param data Record data. + * @param subId Subscription Id of the SMS + * @return An SmsMessage representing the record. + * + * @hide + */ + public static SmsMessage createFromEfRecord(int index, byte[] data, int subId) { + SmsMessageBase wrappedMessage; + + if (isCdmaVoice(subId)) { + wrappedMessage = com.android.internal.telephony.cdma.SmsMessage.createFromEfRecord( + index, data); + } else { + wrappedMessage = com.android.internal.telephony.gsm.SmsMessage.createFromEfRecord( + index, data); + } + + return wrappedMessage != null ? new SmsMessage(wrappedMessage) : null; + } + + /** * Get the TP-Layer-Length for the given SMS-SUBMIT PDU Basically, the * length in bytes (not hex chars) less the SMSC header * @@ -836,6 +861,7 @@ public class SmsMessage { int activePhone = TelephonyManager.getDefault().getCurrentPhoneType(subId); return (PHONE_TYPE_CDMA == activePhone); } + /** * Decide if the carrier supports long SMS. * {@hide} diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 97cc6fe8c5d4..cdc1ba99b6f4 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -4849,8 +4849,6 @@ public class TelephonyManager { return; } - Rlog.d(TAG, "setTelephonyProperty: success phoneId=" + phoneId + - " property=" + property + " value: " + value + " propVal=" + propVal); SystemProperties.set(property, propVal); } diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java index c3f8a1930409..d8836dccbcde 100644 --- a/telephony/java/android/telephony/UiccAccessRule.java +++ b/telephony/java/android/telephony/UiccAccessRule.java @@ -157,6 +157,13 @@ public final class UiccAccessRule implements Parcelable { } /** + * Returns the hex string of the certificate hash. + */ + public String getCertificateHexString() { + return IccUtils.bytesToHexString(mCertificateHash); + } + + /** * Returns the carrier privilege status associated with the given package. * * @param packageInfo package info fetched from @@ -221,6 +228,15 @@ public final class UiccAccessRule implements Parcelable { } @Override + public int hashCode() { + int result = 1; + result = 31 * result + Arrays.hashCode(mCertificateHash); + result = 31 * result + Objects.hashCode(mPackageName); + result = 31 * result + Objects.hashCode(mAccessType); + return result; + } + + @Override public String toString() { return "cert: " + IccUtils.bytesToHexString(mCertificateHash) + " pkg: " + mPackageName + " access: " + mAccessType; diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java index 41c1430e386f..e8597b221391 100644 --- a/telephony/java/android/telephony/data/DataProfile.java +++ b/telephony/java/android/telephony/data/DataProfile.java @@ -17,6 +17,7 @@ package android.telephony.data; import android.annotation.SystemApi; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.text.TextUtils; @@ -230,8 +231,10 @@ public final class DataProfile implements Parcelable { @Override public String toString() { - return "DataProfile=" + mProfileId + "/" + mApn + "/" + mProtocol + "/" + mAuthType - + "/" + mUserName + "/" + mPassword + "/" + mType + "/" + mMaxConnsTime + return "DataProfile=" + mProfileId + "/" + mProtocol + "/" + mAuthType + + "/" + (Build.IS_USER ? "***/***/***" : + (mApn + "/" + mUserName + "/" + mPassword)) + + "/" + mType + "/" + mMaxConnsTime + "/" + mMaxConns + "/" + mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmap + "/" + mRoamingProtocol + "/" + mBearerBitmap + "/" + mMtu + "/" + mMvnoType + "/" + mMvnoMatchData + "/" + mModemCognitive; diff --git a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java index 0673a3845383..0664a7e9a973 100644 --- a/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsSmsImplBase.java @@ -74,7 +74,9 @@ public class ImsSmsImplBase { /** @hide */ @IntDef({ DELIVER_STATUS_OK, - DELIVER_STATUS_ERROR + DELIVER_STATUS_ERROR_GENERIC, + DELIVER_STATUS_ERROR_NO_MEMORY, + DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED }) @Retention(RetentionPolicy.SOURCE) public @interface DeliverStatusResult {} @@ -86,7 +88,17 @@ public class ImsSmsImplBase { /** * Message was not delivered. */ - public static final int DELIVER_STATUS_ERROR = 2; + public static final int DELIVER_STATUS_ERROR_GENERIC = 2; + + /** + * Message was not delivered due to lack of memory. + */ + public static final int DELIVER_STATUS_ERROR_NO_MEMORY = 3; + + /** + * Message was not delivered as the request is not supported. + */ + public static final int DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED = 4; /** @hide */ @IntDef({ @@ -106,7 +118,6 @@ public class ImsSmsImplBase { */ public static final int STATUS_REPORT_STATUS_ERROR = 2; - // Lock for feature synchronization private final Object mLock = new Object(); private IImsSmsListener mListener; @@ -157,7 +168,9 @@ public class ImsSmsImplBase { * @param token token provided in {@link #onSmsReceived(int, String, byte[])} * @param result result of delivering the message. Valid values are: * {@link #DELIVER_STATUS_OK}, - * {@link #DELIVER_STATUS_ERROR} + * {@link #DELIVER_STATUS_ERROR_GENERIC}, + * {@link #DELIVER_STATUS_ERROR_NO_MEMORY}, + * {@link #DELIVER_STATUS_ERROR_REQUEST_NOT_SUPPORTED} * @param messageRef the message reference */ public void acknowledgeSms(int token, @DeliverStatusResult int messageRef, int result) { @@ -200,7 +213,7 @@ public class ImsSmsImplBase { mListener.onSmsReceived(token, format, pdu); } catch (RemoteException e) { Log.e(LOG_TAG, "Can not deliver sms: " + e.getMessage()); - acknowledgeSms(token, 0, DELIVER_STATUS_ERROR); + acknowledgeSms(token, 0, DELIVER_STATUS_ERROR_GENERIC); } } } diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java index f0d60b68eb94..602c796aa188 100644 --- a/telephony/java/android/telephony/mbms/DownloadRequest.java +++ b/telephony/java/android/telephony/mbms/DownloadRequest.java @@ -27,10 +27,13 @@ import android.util.Log; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.Externalizable; +import java.io.File; import java.io.IOException; +import java.io.ObjectInput; import java.io.ObjectInputStream; +import java.io.ObjectOutput; import java.io.ObjectOutputStream; -import java.io.Serializable; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -54,34 +57,116 @@ public final class DownloadRequest implements Parcelable { public static final int MAX_DESTINATION_URI_SIZE = 50000; /** @hide */ - private static class OpaqueDataContainer implements Serializable { - private final String appIntent; - private final int version; + private static class SerializationDataContainer implements Externalizable { + private String fileServiceId; + private Uri source; + private Uri destination; + private int subscriptionId; + private String appIntent; + private int version; - public OpaqueDataContainer(String appIntent, int version) { - this.appIntent = appIntent; - this.version = version; + public SerializationDataContainer() {} + + SerializationDataContainer(DownloadRequest request) { + fileServiceId = request.fileServiceId; + source = request.sourceUri; + destination = request.destinationUri; + subscriptionId = request.subscriptionId; + appIntent = request.serializedResultIntentForApp; + version = request.version; + } + + @Override + public void writeExternal(ObjectOutput objectOutput) throws IOException { + objectOutput.write(version); + objectOutput.writeUTF(fileServiceId); + objectOutput.writeUTF(source.toString()); + objectOutput.writeUTF(destination.toString()); + objectOutput.write(subscriptionId); + objectOutput.writeUTF(appIntent); + } + + @Override + public void readExternal(ObjectInput objectInput) throws IOException { + version = objectInput.read(); + fileServiceId = objectInput.readUTF(); + source = Uri.parse(objectInput.readUTF()); + destination = Uri.parse(objectInput.readUTF()); + subscriptionId = objectInput.read(); + appIntent = objectInput.readUTF(); + // Do version checks here -- future versions may have other fields. } } public static class Builder { private String fileServiceId; private Uri source; + private Uri destination; private int subscriptionId; private String appIntent; private int version = CURRENT_VERSION; + /** + * Constructs a {@link Builder} from a {@link DownloadRequest} + * @param other The {@link DownloadRequest} from which the data for the {@link Builder} + * should come. + * @return An instance of {@link Builder} pre-populated with data from the provided + * {@link DownloadRequest}. + */ + public static Builder fromDownloadRequest(DownloadRequest other) { + Builder result = new Builder(other.sourceUri, other.destinationUri) + .setServiceId(other.fileServiceId) + .setSubscriptionId(other.subscriptionId); + result.appIntent = other.serializedResultIntentForApp; + // Version of the result is going to be the current version -- as this class gets + // updated, new fields will be set to default values in here. + return result; + } + + /** + * This method constructs a new instance of {@link Builder} based on the serialized data + * passed in. + * @param data A byte array, the contents of which should have been originally obtained + * from {@link DownloadRequest#toByteArray()}. + */ + public static Builder fromSerializedRequest(byte[] data) { + Builder builder; + try { + ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data)); + SerializationDataContainer dataContainer = + (SerializationDataContainer) stream.readObject(); + builder = new Builder(dataContainer.source, dataContainer.destination); + builder.version = dataContainer.version; + builder.appIntent = dataContainer.appIntent; + builder.fileServiceId = dataContainer.fileServiceId; + builder.subscriptionId = dataContainer.subscriptionId; + } catch (IOException e) { + // Really should never happen + Log.e(LOG_TAG, "Got IOException trying to parse opaque data"); + throw new IllegalArgumentException(e); + } catch (ClassNotFoundException e) { + Log.e(LOG_TAG, "Got ClassNotFoundException trying to parse opaque data"); + throw new IllegalArgumentException(e); + } + return builder; + } /** * Builds a new DownloadRequest. * @param sourceUri the source URI for the DownloadRequest to be built. This URI should * never be null. + * @param destinationUri The final location for the file(s) that are to be downloaded. It + * must be on the same filesystem as the temp file directory set via + * {@link android.telephony.MbmsDownloadSession#setTempFileRootDirectory(File)}. + * The provided path must be a directory that exists. An + * {@link IllegalArgumentException} will be thrown otherwise. */ - public Builder(@NonNull Uri sourceUri) { - if (sourceUri == null) { - throw new IllegalArgumentException("Source URI must be non-null."); + public Builder(@NonNull Uri sourceUri, @NonNull Uri destinationUri) { + if (sourceUri == null || destinationUri == null) { + throw new IllegalArgumentException("Source and destination URIs must be non-null."); } source = sourceUri; + destination = destinationUri; } /** @@ -130,68 +215,34 @@ public final class DownloadRequest implements Parcelable { return this; } - /** - * For use by the middleware to set the byte array of opaque data. The opaque data - * includes information about the download request that is used by the client app and the - * manager code, but is irrelevant to the middleware. - * @param data A byte array, the contents of which should have been originally obtained - * from {@link DownloadRequest#getOpaqueData()}. - * @hide - */ - @SystemApi - public Builder setOpaqueData(byte[] data) { - try { - ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data)); - OpaqueDataContainer dataContainer = (OpaqueDataContainer) stream.readObject(); - version = dataContainer.version; - appIntent = dataContainer.appIntent; - } catch (IOException e) { - // Really should never happen - Log.e(LOG_TAG, "Got IOException trying to parse opaque data"); - throw new IllegalArgumentException(e); - } catch (ClassNotFoundException e) { - Log.e(LOG_TAG, "Got ClassNotFoundException trying to parse opaque data"); - throw new IllegalArgumentException(e); - } - return this; - } - public DownloadRequest build() { - return new DownloadRequest(fileServiceId, source, subscriptionId, appIntent, version); + return new DownloadRequest(fileServiceId, source, destination, + subscriptionId, appIntent, version); } } private final String fileServiceId; private final Uri sourceUri; + private final Uri destinationUri; private final int subscriptionId; private final String serializedResultIntentForApp; private final int version; private DownloadRequest(String fileServiceId, - Uri source, int sub, + Uri source, Uri destination, int sub, String appIntent, int version) { this.fileServiceId = fileServiceId; sourceUri = source; subscriptionId = sub; + destinationUri = destination; serializedResultIntentForApp = appIntent; this.version = version; } - public static DownloadRequest copy(DownloadRequest other) { - return new DownloadRequest(other); - } - - private DownloadRequest(DownloadRequest dr) { - fileServiceId = dr.fileServiceId; - sourceUri = dr.sourceUri; - subscriptionId = dr.subscriptionId; - serializedResultIntentForApp = dr.serializedResultIntentForApp; - version = dr.version; - } - private DownloadRequest(Parcel in) { fileServiceId = in.readString(); sourceUri = in.readParcelable(getClass().getClassLoader()); + destinationUri = in.readParcelable(getClass().getClassLoader()); subscriptionId = in.readInt(); serializedResultIntentForApp = in.readString(); version = in.readInt(); @@ -204,6 +255,7 @@ public final class DownloadRequest implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeString(fileServiceId); out.writeParcelable(sourceUri, flags); + out.writeParcelable(destinationUri, flags); out.writeInt(subscriptionId); out.writeString(serializedResultIntentForApp); out.writeInt(version); @@ -224,6 +276,13 @@ public final class DownloadRequest implements Parcelable { } /** + * @return The destination {@link Uri} of the downloaded file. + */ + public Uri getDestinationUri() { + return destinationUri; + } + + /** * @return The subscription ID on which to perform MBMS operations. */ public int getSubscriptionId() { @@ -244,19 +303,16 @@ public final class DownloadRequest implements Parcelable { } /** - * For use by the middleware only. The byte array returned from this method should be - * persisted and sent back to the app upon download completion or failure by passing it into - * {@link Builder#setOpaqueData(byte[])}. - * @return A byte array of opaque data to persist. - * @hide + * This method returns a byte array that may be persisted to disk and restored to a + * {@link DownloadRequest}. The instance of {@link DownloadRequest} persisted by this method + * may be recovered via {@link Builder#fromSerializedRequest(byte[])}. + * @return A byte array of data to persist. */ - @SystemApi - public byte[] getOpaqueData() { + public byte[] toByteArray() { try { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream); - OpaqueDataContainer container = new OpaqueDataContainer( - serializedResultIntentForApp, version); + SerializationDataContainer container = new SerializationDataContainer(this); stream.writeObject(container); stream.flush(); return byteArrayOutputStream.toByteArray(); @@ -299,15 +355,6 @@ public final class DownloadRequest implements Parcelable { } /** - * @hide - */ - public boolean isMultipartDownload() { - // TODO: figure out what qualifies a request as a multipart download request. - return getSourceUri().getLastPathSegment() != null && - getSourceUri().getLastPathSegment().contains("*"); - } - - /** * Retrieves the hash string that should be used as the filename when storing a token for * this DownloadRequest. * @hide @@ -320,8 +367,9 @@ public final class DownloadRequest implements Parcelable { throw new RuntimeException("Could not get sha256 hash object"); } if (version >= 1) { - // Hash the source URI and the app intent + // Hash the source, destination, and the app intent digest.update(sourceUri.toString().getBytes(StandardCharsets.UTF_8)); + digest.update(destinationUri.toString().getBytes(StandardCharsets.UTF_8)); if (serializedResultIntentForApp != null) { digest.update(serializedResultIntentForApp.getBytes(StandardCharsets.UTF_8)); } @@ -344,12 +392,13 @@ public final class DownloadRequest implements Parcelable { version == request.version && Objects.equals(fileServiceId, request.fileServiceId) && Objects.equals(sourceUri, request.sourceUri) && + Objects.equals(destinationUri, request.destinationUri) && Objects.equals(serializedResultIntentForApp, request.serializedResultIntentForApp); } @Override public int hashCode() { - return Objects.hash(fileServiceId, sourceUri, + return Objects.hash(fileServiceId, sourceUri, destinationUri, subscriptionId, serializedResultIntentForApp, version); } } diff --git a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java index a7a5958fff56..c2a79d82f8b6 100644 --- a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java +++ b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java @@ -16,22 +16,23 @@ package android.telephony.mbms; -import android.os.Handler; +import android.os.Binder; import android.os.RemoteException; import java.util.List; +import java.util.concurrent.Executor; /** @hide */ public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallback.Stub { - private final Handler mHandler; + private final Executor mExecutor; private final MbmsDownloadSessionCallback mAppCallback; private volatile boolean mIsStopped = false; public InternalDownloadSessionCallback(MbmsDownloadSessionCallback appCallback, - Handler handler) { + Executor executor) { mAppCallback = appCallback; - mHandler = handler; + mExecutor = executor; } @Override @@ -40,10 +41,15 @@ public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallbac return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onError(errorCode, message); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onError(errorCode, message); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -54,10 +60,15 @@ public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallbac return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onFileServicesUpdated(services); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onFileServicesUpdated(services); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -68,18 +79,19 @@ public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallbac return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onMiddlewareReady(); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onMiddlewareReady(); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } - public Handler getHandler() { - return mHandler; - } - public void stop() { mIsStopped = true; } diff --git a/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java index 8702952cf06b..f30ae27b19b1 100644 --- a/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java +++ b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java @@ -16,20 +16,22 @@ package android.telephony.mbms; -import android.os.Handler; +import android.os.Binder; import android.os.RemoteException; +import java.util.concurrent.Executor; + /** * @hide */ public class InternalDownloadStateCallback extends IDownloadStateCallback.Stub { - private final Handler mHandler; + private final Executor mExecutor; private final DownloadStateCallback mAppCallback; private volatile boolean mIsStopped = false; - public InternalDownloadStateCallback(DownloadStateCallback appCallback, Handler handler) { + public InternalDownloadStateCallback(DownloadStateCallback appCallback, Executor executor) { mAppCallback = appCallback; - mHandler = handler; + mExecutor = executor; } @Override @@ -40,11 +42,16 @@ public class InternalDownloadStateCallback extends IDownloadStateCallback.Stub { return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onProgressUpdated(request, fileInfo, currentDownloadSize, - fullDownloadSize, currentDecodedSize, fullDecodedSize); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onProgressUpdated(request, fileInfo, currentDownloadSize, + fullDownloadSize, currentDecodedSize, fullDecodedSize); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -56,10 +63,15 @@ public class InternalDownloadStateCallback extends IDownloadStateCallback.Stub { return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onStateUpdated(request, fileInfo, state); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onStateUpdated(request, fileInfo, state); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } diff --git a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java index eb6579cec471..e9f39ff959cc 100644 --- a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java +++ b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java @@ -16,18 +16,21 @@ package android.telephony.mbms; -import android.os.Handler; +import android.os.Binder; import android.os.RemoteException; +import java.util.concurrent.Executor; + /** @hide */ public class InternalStreamingServiceCallback extends IStreamingServiceCallback.Stub { private final StreamingServiceCallback mAppCallback; - private final Handler mHandler; + private final Executor mExecutor; private volatile boolean mIsStopped = false; - public InternalStreamingServiceCallback(StreamingServiceCallback appCallback, Handler handler) { + public InternalStreamingServiceCallback(StreamingServiceCallback appCallback, + Executor executor) { mAppCallback = appCallback; - mHandler = handler; + mExecutor = executor; } @Override @@ -36,10 +39,15 @@ public class InternalStreamingServiceCallback extends IStreamingServiceCallback. return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onError(errorCode, message); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onError(errorCode, message); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -50,10 +58,15 @@ public class InternalStreamingServiceCallback extends IStreamingServiceCallback. return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onStreamStateUpdated(state, reason); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onStreamStateUpdated(state, reason); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -64,10 +77,15 @@ public class InternalStreamingServiceCallback extends IStreamingServiceCallback. return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onMediaDescriptionUpdated(); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onMediaDescriptionUpdated(); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -78,10 +96,15 @@ public class InternalStreamingServiceCallback extends IStreamingServiceCallback. return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onBroadcastSignalStrengthUpdated(signalStrength); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onBroadcastSignalStrengthUpdated(signalStrength); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -92,10 +115,15 @@ public class InternalStreamingServiceCallback extends IStreamingServiceCallback. return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onStreamMethodUpdated(methodType); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onStreamMethodUpdated(methodType); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } diff --git a/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java index d782d12c00d6..d47f5adbaf91 100644 --- a/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java +++ b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java @@ -16,21 +16,22 @@ package android.telephony.mbms; -import android.os.Handler; +import android.os.Binder; import android.os.RemoteException; import java.util.List; +import java.util.concurrent.Executor; /** @hide */ public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallback.Stub { - private final Handler mHandler; + private final Executor mExecutor; private final MbmsStreamingSessionCallback mAppCallback; private volatile boolean mIsStopped = false; public InternalStreamingSessionCallback(MbmsStreamingSessionCallback appCallback, - Handler handler) { + Executor executor) { mAppCallback = appCallback; - mHandler = handler; + mExecutor = executor; } @Override @@ -39,10 +40,15 @@ public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallb return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onError(errorCode, message); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onError(errorCode, message); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -54,10 +60,15 @@ public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallb return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onStreamingServicesUpdated(services); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onStreamingServicesUpdated(services); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } @@ -68,18 +79,19 @@ public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallb return; } - mHandler.post(new Runnable() { + mExecutor.execute(new Runnable() { @Override public void run() { - mAppCallback.onMiddlewareReady(); + long token = Binder.clearCallingIdentity(); + try { + mAppCallback.onMiddlewareReady(); + } finally { + Binder.restoreCallingIdentity(token); + } } }); } - public Handler getHandler() { - return mHandler; - } - public void stop() { mIsStopped = true; } diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java index 9ef188cfd2b3..b0c00c6284a6 100644 --- a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java +++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java @@ -21,8 +21,10 @@ import android.content.BroadcastReceiver; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.net.Uri; import android.os.Bundle; import android.telephony.MbmsDownloadSession; @@ -31,14 +33,11 @@ import android.util.Log; import java.io.File; import java.io.FileFilter; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -62,6 +61,8 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { /** @hide */ public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority"; + private static final String EMBMS_INTENT_PERMISSION = "android.permission.SEND_EMBMS_INTENTS"; + /** * Indicates that the requested operation completed without error. * @hide @@ -137,6 +138,8 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { /** @hide */ @Override public void onReceive(Context context, Intent intent) { + verifyPermissionIntegrity(context); + if (!verifyIntentContents(context, intent)) { setResultCode(RESULT_MALFORMED_INTENT); return; @@ -260,20 +263,18 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { FileInfo completedFileInfo = (FileInfo) intent.getParcelableExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO); - Path stagingDirectory = FileSystems.getDefault().getPath( - MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath(), - TEMP_FILE_STAGING_LOCATION); + Path appSpecifiedDestination = FileSystems.getDefault().getPath( + request.getDestinationUri().getPath()); - Uri stagedFileLocation; + Uri finalLocation; try { - stagedFileLocation = stageTempFile(finalTempFile, stagingDirectory); + finalLocation = moveToFinalLocation(finalTempFile, appSpecifiedDestination); } catch (IOException e) { Log.w(LOG_TAG, "Failed to move temp file to final destination"); setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR); return; } - intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI, - stagedFileLocation); + intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI, finalLocation); intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO, completedFileInfo); context.sendBroadcast(intentForApp); @@ -437,19 +438,22 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { } /* - * Moves a tempfile located at fromPath to a new location in the staging directory. + * Moves a tempfile located at fromPath to its final home where the app wants it */ - private static Uri stageTempFile(Uri fromPath, Path stagingDirectory) throws IOException { + private static Uri moveToFinalLocation(Uri fromPath, Path appSpecifiedPath) throws IOException { if (!ContentResolver.SCHEME_FILE.equals(fromPath.getScheme())) { - Log.w(LOG_TAG, "Moving source uri " + fromPath+ " does not have a file scheme"); + Log.w(LOG_TAG, "Downloaded file location uri " + fromPath + + " does not have a file scheme"); return null; } Path fromFile = FileSystems.getDefault().getPath(fromPath.getPath()); - if (!Files.isDirectory(stagingDirectory)) { - Files.createDirectory(stagingDirectory); + if (!Files.isDirectory(appSpecifiedPath)) { + Files.createDirectory(appSpecifiedPath); } - Path result = Files.move(fromFile, stagingDirectory.resolve(fromFile.getFileName())); + // TODO: do we want to support directory trees within the download directory? + Path result = Files.move(fromFile, appSpecifiedPath.resolve(fromFile.getFileName()), + StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); return Uri.fromFile(result.toFile()); } @@ -513,39 +517,29 @@ public class MbmsDownloadReceiver extends BroadcastReceiver { return mMiddlewarePackageNameCache; } - private static boolean manualMove(File src, File dst) { - InputStream in = null; - OutputStream out = null; - try { - if (!dst.exists()) { - dst.createNewFile(); - } - in = new FileInputStream(src); - out = new FileOutputStream(dst); - byte[] buffer = new byte[2048]; - int len; - do { - len = in.read(buffer); - out.write(buffer, 0, len); - } while (len > 0); - } catch (IOException e) { - Log.w(LOG_TAG, "Manual file move failed due to exception " + e); - if (dst.exists()) { - dst.delete(); - } - return false; - } finally { - try { - if (in != null) { - in.close(); - } - if (out != null) { - out.close(); - } - } catch (IOException e) { - Log.w(LOG_TAG, "Error closing streams: " + e); + private void verifyPermissionIntegrity(Context context) { + PackageManager pm = context.getPackageManager(); + Intent queryIntent = new Intent(context, MbmsDownloadReceiver.class); + List<ResolveInfo> infos = pm.queryBroadcastReceivers(queryIntent, 0); + if (infos.size() != 1) { + throw new IllegalStateException("Non-unique download receiver in your app"); + } + ActivityInfo selfInfo = infos.get(0).activityInfo; + if (selfInfo == null) { + throw new IllegalStateException("Queried ResolveInfo does not contain a receiver"); + } + if (MbmsUtils.getOverrideServiceName(context, + MbmsDownloadSession.MBMS_DOWNLOAD_SERVICE_ACTION) != null) { + // If an override was specified, just make sure that the permission isn't null. + if (selfInfo.permission == null) { + throw new IllegalStateException( + "MbmsDownloadReceiver must require some permission"); } + return; + } + if (!Objects.equals(EMBMS_INTENT_PERMISSION, selfInfo.permission)) { + throw new IllegalStateException("MbmsDownloadReceiver must require the " + + "SEND_EMBMS_INTENTS permission."); } - return true; } } diff --git a/telephony/java/android/telephony/mbms/MbmsErrors.java b/telephony/java/android/telephony/mbms/MbmsErrors.java index 75ca35e2342f..b5fec445d853 100644 --- a/telephony/java/android/telephony/mbms/MbmsErrors.java +++ b/telephony/java/android/telephony/mbms/MbmsErrors.java @@ -108,8 +108,8 @@ public class MbmsErrors { /** * Indicates that the app called - * {@link MbmsStreamingSession#startStreaming( - * StreamingServiceInfo, StreamingServiceCallback, android.os.Handler)} + * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo, + * java.util.concurrent.Executor, StreamingServiceCallback)} * more than once for the same {@link StreamingServiceInfo}. */ public static final int ERROR_DUPLICATE_START_STREAM = 303; diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java index 5c130a09773e..6e0395730aba 100644 --- a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java +++ b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java @@ -22,11 +22,12 @@ import android.os.Handler; import android.telephony.MbmsStreamingSession; import java.util.List; +import java.util.concurrent.Executor; /** * A callback class that is used to receive information from the middleware on MBMS streaming * services. An instance of this object should be passed into - * {@link MbmsStreamingSession#create(Context, MbmsStreamingSessionCallback, int, Handler)}. + * {@link MbmsStreamingSession#create(Context, Executor, int, MbmsStreamingSessionCallback)}. */ public class MbmsStreamingSessionCallback { /** diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java index b4ad1d77760a..ef317eefb3e3 100644 --- a/telephony/java/android/telephony/mbms/MbmsUtils.java +++ b/telephony/java/android/telephony/mbms/MbmsUtils.java @@ -50,7 +50,7 @@ public class MbmsUtils { return new ComponentName(ci.packageName, ci.name); } - private static ComponentName getOverrideServiceName(Context context, String serviceAction) { + public static ComponentName getOverrideServiceName(Context context, String serviceAction) { String metaDataKey = null; switch (serviceAction) { case MbmsDownloadSession.MBMS_DOWNLOAD_SERVICE_ACTION: diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java index ec9134a4b855..b6239fe98a99 100644 --- a/telephony/java/android/telephony/mbms/StreamingService.java +++ b/telephony/java/android/telephony/mbms/StreamingService.java @@ -29,11 +29,11 @@ import java.lang.annotation.RetentionPolicy; /** * Class used to represent a single MBMS stream. After a stream has been started with - * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo, - * StreamingServiceCallback, android.os.Handler)}, + * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo, java.util.concurrent.Executor, + * StreamingServiceCallback)}, * this class is used to hold information about the stream and control it. */ -public class StreamingService { +public class StreamingService implements AutoCloseable { private static final String LOG_TAG = "MbmsStreamingService"; /** @@ -41,7 +41,7 @@ public class StreamingService { * @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef({STATE_STOPPED, STATE_STARTED, STATE_STALLED}) + @IntDef(prefix = { "STATE_" }, value = {STATE_STOPPED, STATE_STARTED, STATE_STALLED}) public @interface StreamingState {} public final static int STATE_STOPPED = 1; public final static int STATE_STARTED = 2; @@ -53,7 +53,8 @@ public class StreamingService { * @hide */ @Retention(RetentionPolicy.SOURCE) - @IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT, + @IntDef(prefix = { "REASON_" }, + value = {REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT, REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE, REASON_LEFT_MBMS_BROADCAST_AREA, REASON_NONE}) public @interface StreamingStateChangeReason {} @@ -64,9 +65,9 @@ public class StreamingService { public static final int REASON_NONE = 0; /** - * State changed due to a call to {@link #stopStreaming()} or + * State changed due to a call to {@link #close()} or * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo, - * StreamingServiceCallback, android.os.Handler)} + * java.util.concurrent.Executor, StreamingServiceCallback)} */ public static final int REASON_BY_USER_REQUEST = 1; @@ -161,7 +162,8 @@ public class StreamingService { * * May throw an {@link IllegalArgumentException} or an {@link IllegalStateException} */ - public void stopStreaming() { + @Override + public void close() { if (mService == null) { throw new IllegalStateException("No streaming service attached"); } diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index fe37531c0611..a4eb424ab66e 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -187,6 +187,57 @@ interface ISms { in PendingIntent deliveryIntent, in boolean persistMessage); /** + * Send an SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destAddr the address to send the message to + * @param scAddr the SMSC to send the message through, or NULL for the + * default SMSC + * @param text the body of the message to send + * @param sentIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is sucessfully sent, or failed. + * The result code will be <code>Activity.RESULT_OK<code> for success, + * or one of these errors:<br> + * <code>RESULT_ERROR_GENERIC_FAILURE</code><br> + * <code>RESULT_ERROR_RADIO_OFF</code><br> + * <code>RESULT_ERROR_NULL_PDU</code><br> + * For <code>RESULT_ERROR_GENERIC_FAILURE</code> the sentIntent may include + * the extra "errorCode" containing a radio technology specific value, + * generally only useful for troubleshooting.<br> + * The per-application based SMS control checks sentIntent. If sentIntent + * is NULL the caller will be checked against all unknown applications, + * which cause smaller number of SMS to be sent in checking period. + * @param deliveryIntent if not NULL this <code>PendingIntent</code> is + * broadcast when the message is delivered to the recipient. The + * raw pdu of the status report is in the extended data ("pdu"). + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendTextForSubscriberWithOptions(in int subId, String callingPkg, in String destAddr, + in String scAddr, in String text, in PendingIntent sentIntent, + in PendingIntent deliveryIntent, in boolean persistMessageForNonDefaultSmsApp, + in int priority, in boolean expectMore, in int validityPeriod); + + /** * Inject an SMS PDU into the android platform. * * @param subId the subId on which the SMS has to be injected. @@ -234,6 +285,56 @@ interface ISms { in List<PendingIntent> deliveryIntents, in boolean persistMessageForNonDefaultSmsApp); /** + * Send a multi-part text based SMS with options using Subscription Id. + * + * @param subId the subId on which the SMS has to be sent. + * @param destinationAddress the address to send the message to + * @param scAddress is the service center address or null to use + * the current default SMSC + * @param parts an <code>ArrayList</code> of strings that, in order, + * comprise the original message + * @param sentIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been sent. + * The result code will be <code>Activity.RESULT_OK<code> for success, + * or one of these errors: + * <code>RESULT_ERROR_GENERIC_FAILURE</code> + * <code>RESULT_ERROR_RADIO_OFF</code> + * <code>RESULT_ERROR_NULL_PDU</code>. + * @param deliveryIntents if not null, an <code>ArrayList</code> of + * <code>PendingIntent</code>s (one for each message part) that is + * broadcast when the corresponding message part has been delivered + * to the recipient. The raw pdu of the status report is in the + * extended data ("pdu"). + * @param persistMessageForNonDefaultSmsApp whether the sent message should + * be automatically persisted in the SMS db. It only affects messages sent + * by a non-default SMS app. Currently only the carrier app can set this + * parameter to false to skip auto message persistence. + * @param priority Priority level of the message + * Refer specification See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1 + * --------------------------------- + * PRIORITY | Level of Priority + * --------------------------------- + * '00' | Normal + * '01' | Interactive + * '10' | Urgent + * '11' | Emergency + * ---------------------------------- + * Any Other values included Negative considered as Invalid Priority Indicator of the message. + * @param expectMore is a boolean to indicate the sending message is multi segmented or not. + * @param validityPeriod Validity Period of the message in mins. + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * Validity Period(Minimum) -> 5 mins + * Validity Period(Maximum) -> 635040 mins(i.e.63 weeks). + * Any Other values included Negative considered as Invalid Validity Period of the message. + */ + void sendMultipartTextForSubscriberWithOptions(in int subId, String callingPkg, + in String destinationAddress, in String scAddress, in List<String> parts, + in List<PendingIntent> sentIntents, in List<PendingIntent> deliveryIntents, + in boolean persistMessageForNonDefaultSmsApp, in int priority, in boolean expectMore, + in int validityPeriod); + + /** * Enable reception of cell broadcast (SMS-CB) messages with the given * message identifier and RAN type. The RAN type specify this message ID * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 02cc82cf56b0..9e2b519e3dd6 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -952,6 +952,11 @@ interface ITelephony { int getCarrierPrivilegeStatus(int subId); /** + * Similar to above, but check for the given uid. + */ + int getCarrierPrivilegeStatusForUid(int subId, int uid); + + /** * Similar to above, but check for the package whose name is pkgName. */ int checkCarrierPrivilegesForPackage(String pkgName); diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java new file mode 100644 index 000000000000..da8471fa19ed --- /dev/null +++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java @@ -0,0 +1,209 @@ +/* + * 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 com.android.internal.telephony; + +import android.app.AppOpsManager; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Binder; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.telephony.Rlog; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.telephony.ITelephony; + +/** Utility class for Telephony permission enforcement. */ +public final class TelephonyPermissions { + private static final String LOG_TAG = "TelephonyPermissions"; + + private static final boolean DBG = false; + + private TelephonyPermissions() {} + + /** + * Check whether the caller (or self, if not processing an IPC) can read phone state. + * + * <p>This method behaves in one of the following ways: + * <ul> + * <li>return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the + * READ_PHONE_STATE runtime permission. + * <li>throw SecurityException: if the caller didn't declare any of these permissions, or, for + * apps which support runtime permissions, if the caller does not currently have any of + * these permissions. + * <li>return false: if the caller lacks all of these permissions and doesn't support runtime + * permissions. This implies that the user revoked the ability to read phone state + * manually (via AppOps). In this case we can't throw as it would break app compatibility, + * so we return false to indicate that the calling function should return dummy data. + * </ul> + */ + public static boolean checkCallingOrSelfReadPhoneState( + Context context, String callingPackage, String message) { + return checkReadPhoneState(context, Binder.getCallingPid(), Binder.getCallingUid(), + callingPackage, message); + } + + /** + * Check whether the app with the given pid/uid can read phone state. + * + * <p>This method behaves in one of the following ways: + * <ul> + * <li>return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the + * READ_PHONE_STATE runtime permission. + * <li>throw SecurityException: if the caller didn't declare any of these permissions, or, for + * apps which support runtime permissions, if the caller does not currently have any of + * these permissions. + * <li>return false: if the caller lacks all of these permissions and doesn't support runtime + * permissions. This implies that the user revoked the ability to read phone state + * manually (via AppOps). In this case we can't throw as it would break app compatibility, + * so we return false to indicate that the calling function should return dummy data. + * </ul> + */ + public static boolean checkReadPhoneState( + Context context, int pid, int uid, String callingPackage, String message) { + try { + context.enforcePermission( + android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, uid, message); + + // SKIP checking for run-time permission since caller has PRIVILEGED permission + return true; + } catch (SecurityException privilegedPhoneStateException) { + context.enforcePermission( + android.Manifest.permission.READ_PHONE_STATE, pid, uid, message); + } + + // We have READ_PHONE_STATE permission, so return true as long as the AppOps bit hasn't been + // revoked. + AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + return appOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, uid, callingPackage) == + AppOpsManager.MODE_ALLOWED; + } + + /** + * Returns whether the caller can read phone numbers. + * + * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}, the + * default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS can also read phone numbers. + */ + public static boolean checkCallingOrSelfReadPhoneNumber( + Context context, String callingPackage, String message) { + return checkReadPhoneNumber( + context, Binder.getCallingPid(), Binder.getCallingUid(), callingPackage, message); + } + + @VisibleForTesting + public static boolean checkReadPhoneNumber( + Context context, int pid, int uid, String callingPackage, String message) { + // Default SMS app can always read it. + AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); + if (appOps.noteOp(AppOpsManager.OP_WRITE_SMS, uid, callingPackage) == + AppOpsManager.MODE_ALLOWED) { + return true; + } + + // NOTE(b/73308711): If an app has one of the following AppOps bits explicitly revoked, they + // will be denied access, even if they have another permission and AppOps bit if needed. + + // First, check if we can read the phone state. + try { + return checkReadPhoneState(context, pid, uid, callingPackage, message); + } catch (SecurityException readPhoneStateSecurityException) { + } + // Can be read with READ_SMS too. + try { + context.enforcePermission(android.Manifest.permission.READ_SMS, pid, uid, message); + int opCode = AppOpsManager.permissionToOpCode(android.Manifest.permission.READ_SMS); + if (opCode != AppOpsManager.OP_NONE) { + return appOps.noteOp(opCode, uid, callingPackage) == AppOpsManager.MODE_ALLOWED; + } else { + return true; + } + } catch (SecurityException readSmsSecurityException) { + } + // Can be read with READ_PHONE_NUMBERS too. + try { + context.enforcePermission(android.Manifest.permission.READ_PHONE_NUMBERS, pid, uid, + message); + int opCode = AppOpsManager.permissionToOpCode( + android.Manifest.permission.READ_PHONE_NUMBERS); + if (opCode != AppOpsManager.OP_NONE) { + return appOps.noteOp(opCode, uid, callingPackage) == AppOpsManager.MODE_ALLOWED; + } else { + return true; + } + } catch (SecurityException readPhoneNumberSecurityException) { + } + + throw new SecurityException(message + ": Neither user " + uid + + " nor current process has " + android.Manifest.permission.READ_PHONE_STATE + + ", " + android.Manifest.permission.READ_SMS + ", or " + + android.Manifest.permission.READ_PHONE_NUMBERS); + } + + /** + * Ensure the caller (or self, if not processing an IPC) has MODIFY_PHONE_STATE (and is thus a + * privileged app) or carrier privileges. + * + * @throws SecurityException if the caller does not have the required permission/privileges + */ + public static void enforceCallingOrSelfModifyPermissionOrCarrierPrivilege( + Context context, int subId, String message) { + if (context.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) == + PackageManager.PERMISSION_GRANTED) { + return; + } + + if (DBG) Rlog.d(LOG_TAG, "No modify permission, check carrier privilege next."); + enforceCallingOrSelfCarrierPrivilege(subId, message); + } + + /** + * Make sure the caller (or self, if not processing an IPC) has carrier privileges. + * + * @throws SecurityException if the caller does not have the required privileges + */ + public static void enforceCallingOrSelfCarrierPrivilege(int subId, String message) { + // NOTE: It's critical that we explicitly pass the calling UID here rather than call + // TelephonyManager#hasCarrierPrivileges directly, as the latter only works when called from + // the phone process. When called from another process, it will check whether that process + // has carrier privileges instead. + enforceCarrierPrivilege(subId, Binder.getCallingUid(), message); + } + + private static void enforceCarrierPrivilege(int subId, int uid, String message) { + if (getCarrierPrivilegeStatus(subId, uid) != + TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { + if (DBG) Rlog.e(LOG_TAG, "No Carrier Privilege."); + throw new SecurityException(message); + } + } + + private static int getCarrierPrivilegeStatus(int subId, int uid) { + ITelephony telephony = + ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE)); + try { + if (telephony != null) { + return telephony.getCarrierPrivilegeStatusForUid(subId, uid); + } + } catch (RemoteException e) { + // Fallback below. + } + Rlog.e(LOG_TAG, "Phone process is down, cannot check carrier privileges"); + return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS; + } +} diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index 7a53ef63e2a8..14c5f4bebebb 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -99,6 +99,15 @@ public class SmsMessage extends SmsMessageBase { private static final int RETURN_NO_ACK = 0; private static final int RETURN_ACK = 1; + /** + * Supported priority modes for CDMA SMS messages + * (See 3GPP2 C.S0015-B, v2.0, table 4.5.9-1) + */ + private static final int PRIORITY_NORMAL = 0x0; + private static final int PRIORITY_INTERACTIVE = 0x1; + private static final int PRIORITY_URGENT = 0x2; + private static final int PRIORITY_EMERGENCY = 0x3; + private SmsEnvelope mEnvelope; private BearerData mBearerData; @@ -211,6 +220,26 @@ public class SmsMessage extends SmsMessageBase { */ public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, boolean statusReportRequested, SmsHeader smsHeader) { + return getSubmitPdu(scAddr, destAddr, message, statusReportRequested, smsHeader, -1); + } + + /** + * Get an SMS-SUBMIT PDU for a destination address and a message + * + * @param scAddr Service Centre address. Null means use default. + * @param destAddr Address of the recipient. + * @param message String representation of the message payload. + * @param statusReportRequested Indicates whether a report is requested for this message. + * @param smsHeader Array containing the data for the User Data Header, preceded + * by the Element Identifiers. + * @param priority Priority level of the message + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + * @hide + */ + public static SubmitPdu getSubmitPdu(String scAddr, String destAddr, String message, + boolean statusReportRequested, SmsHeader smsHeader, int priority) { /** * TODO(cleanup): Do we really want silent failure like this? @@ -224,7 +253,7 @@ public class SmsMessage extends SmsMessageBase { UserData uData = new UserData(); uData.payloadStr = message; uData.userDataHeader = smsHeader; - return privateGetSubmitPdu(destAddr, statusReportRequested, uData); + return privateGetSubmitPdu(destAddr, statusReportRequested, uData, priority); } /** @@ -282,6 +311,22 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get an SMS-SUBMIT PDU for a data message to a destination address & port + * + * @param destAddr the address of the destination for the message + * @param userData the data for the message + * @param statusReportRequested Indicates whether a report is requested for this message. + * @param priority Priority level of the message + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + */ + public static SubmitPdu getSubmitPdu(String destAddr, UserData userData, + boolean statusReportRequested, int priority) { + return privateGetSubmitPdu(destAddr, statusReportRequested, userData, priority); + } + + /** * Note: This function is a GSM specific functionality which is not supported in CDMA mode. */ @Override @@ -764,6 +809,15 @@ public class SmsMessage extends SmsMessageBase { */ private static SubmitPdu privateGetSubmitPdu(String destAddrStr, boolean statusReportRequested, UserData userData) { + return privateGetSubmitPdu(destAddrStr, statusReportRequested, userData, -1); + } + + /** + * Creates BearerData and Envelope from parameters for a Submit SMS. + * @return byte stream for SubmitPdu. + */ + private static SubmitPdu privateGetSubmitPdu(String destAddrStr, boolean statusReportRequested, + UserData userData, int priority) { /** * TODO(cleanup): give this function a more meaningful name. @@ -792,6 +846,10 @@ public class SmsMessage extends SmsMessageBase { bearerData.userAckReq = false; bearerData.readAckReq = false; bearerData.reportReq = false; + if (priority >= PRIORITY_NORMAL && priority <= PRIORITY_EMERGENCY) { + bearerData.priorityIndicatorSet = true; + bearerData.priority = priority; + } bearerData.userData = userData; diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index 1ca19e01d6c8..4f5bfa919135 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -89,6 +89,18 @@ public class SmsMessage extends SmsMessageBase { private int mVoiceMailCount = 0; + private static final int VALIDITY_PERIOD_FORMAT_NONE = 0x00; + private static final int VALIDITY_PERIOD_FORMAT_ENHANCED = 0x01; + private static final int VALIDITY_PERIOD_FORMAT_RELATIVE = 0x02; + private static final int VALIDITY_PERIOD_FORMAT_ABSOLUTE = 0x03; + + //Validity Period min - 5 mins + private static final int VALIDITY_PERIOD_MIN = 5; + //Validity Period max - 63 weeks + private static final int VALIDITY_PERIOD_MAX = 635040; + + private static final int INVALID_VALIDITY_PERIOD = -1; + public static class SubmitPdu extends SubmitPduBase { } @@ -202,6 +214,45 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get Encoded Relative Validty Period Value from Validity period in mins. + * + * @param validityPeriod Validity period in mins. + * + * Refer specification 3GPP TS 23.040 V6.8.1 section 9.2.3.12.1. + * ||relValidityPeriod (TP-VP) || || validityPeriod || + * + * 0 to 143 ---> (TP-VP + 1) x 5 minutes + * + * 144 to 167 ---> 12 hours + ((TP-VP -143) x 30 minutes) + * + * 168 to 196 ---> (TP-VP - 166) x 1 day + * + * 197 to 255 ---> (TP-VP - 192) x 1 week + * + * @return relValidityPeriod Encoded Relative Validity Period Value. + * @hide + */ + public static int getRelativeValidityPeriod(int validityPeriod) { + int relValidityPeriod = INVALID_VALIDITY_PERIOD; + + if (validityPeriod < VALIDITY_PERIOD_MIN || validityPeriod > VALIDITY_PERIOD_MAX) { + Rlog.e(LOG_TAG,"Invalid Validity Period" + validityPeriod); + return relValidityPeriod; + } + + if (validityPeriod <= 720) { + relValidityPeriod = (validityPeriod / 5) - 1; + } else if (validityPeriod <= 1440) { + relValidityPeriod = ((validityPeriod - 720) / 30) + 143; + } else if (validityPeriod <= 43200) { + relValidityPeriod = (validityPeriod / 1440) + 166; + } else if (validityPeriod <= 635040) { + relValidityPeriod = (validityPeriod / 10080) + 192; + } + return relValidityPeriod; + } + + /** * Get an SMS-SUBMIT PDU for a destination address and a message * * @param scAddress Service Centre address. Null means use default. @@ -236,6 +287,29 @@ public class SmsMessage extends SmsMessageBase { String destinationAddress, String message, boolean statusReportRequested, byte[] header, int encoding, int languageTable, int languageShiftTable) { + return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, + header, encoding, languageTable, languageShiftTable, -1); + } + + /** + * Get an SMS-SUBMIT PDU for a destination address and a message using the + * specified encoding. + * + * @param scAddress Service Centre address. Null means use default. + * @param encoding Encoding defined by constants in + * com.android.internal.telephony.SmsConstants.ENCODING_* + * @param languageTable + * @param languageShiftTable + * @param validityPeriod Validity Period of the message in Minutes. + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + * @hide + */ + public static SubmitPdu getSubmitPdu(String scAddress, + String destinationAddress, String message, + boolean statusReportRequested, byte[] header, int encoding, + int languageTable, int languageShiftTable, int validityPeriod) { // Perform null parameter checks. if (message == null || destinationAddress == null) { @@ -272,8 +346,19 @@ public class SmsMessage extends SmsMessageBase { } SubmitPdu ret = new SubmitPdu(); - // MTI = SMS-SUBMIT, UDHI = header != null - byte mtiByte = (byte)(0x01 | (header != null ? 0x40 : 0x00)); + + int validityPeriodFormat = VALIDITY_PERIOD_FORMAT_NONE; + int relativeValidityPeriod = INVALID_VALIDITY_PERIOD; + + // TP-Validity-Period-Format (TP-VPF) in 3GPP TS 23.040 V6.8.1 section 9.2.3.3 + //bit 4:3 = 10 - TP-VP field present - relative format + if((relativeValidityPeriod = getRelativeValidityPeriod(validityPeriod)) >= 0) { + validityPeriodFormat = VALIDITY_PERIOD_FORMAT_RELATIVE; + } + + byte mtiByte = (byte)(0x01 | (validityPeriodFormat << 0x03) | + (header != null ? 0x40 : 0x00)); + ByteArrayOutputStream bo = getSubmitPduHead( scAddress, destinationAddress, mtiByte, statusReportRequested, ret); @@ -338,7 +423,11 @@ public class SmsMessage extends SmsMessageBase { bo.write(0x08); } - // (no TP-Validity-Period) + if (validityPeriodFormat == VALIDITY_PERIOD_FORMAT_RELATIVE) { + // ( TP-Validity-Period - relative format) + bo.write(relativeValidityPeriod); + } + bo.write(userData, 0, userData.length); ret.encodedMessage = bo.toByteArray(); return ret; @@ -388,6 +477,24 @@ public class SmsMessage extends SmsMessageBase { } /** + * Get an SMS-SUBMIT PDU for a destination address and a message + * + * @param scAddress Service Centre address. Null means use default. + * @param destinationAddress the address of the destination for the message + * @param statusReportRequested staus report of the message Requested + * @param validityPeriod Validity Period of the message in Minutes. + * @return a <code>SubmitPdu</code> containing the encoded SC + * address, if applicable, and the encoded message. + * Returns null on encode error. + */ + public static SubmitPdu getSubmitPdu(String scAddress, + String destinationAddress, String message, + boolean statusReportRequested, int validityPeriod) { + return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, + null, ENCODING_UNKNOWN, 0, 0, validityPeriod); + } + + /** * Get an SMS-SUBMIT PDU for a data message to a destination address & port * * @param scAddress Service Centre address. null == use default diff --git a/test-runner/Android.bp b/test-runner/Android.bp index a2edb047d9de..c69279b76e48 100644 --- a/test-runner/Android.bp +++ b/test-runner/Android.bp @@ -27,9 +27,8 @@ java_library { javacflags: ["-Xep:DepAnn:ERROR"], }, - no_framework_libs: true, + sdk_version: "current", libs: [ - "framework", "android.test.base", "android.test.mock", ], @@ -44,9 +43,8 @@ java_library { srcs: ["src/android/**/*.java"], - no_framework_libs: true, + sdk_version: "current", libs: [ - "framework", "android.test.base", "android.test.mock", "junit", @@ -58,6 +56,7 @@ java_library { java_library_static { name: "repackaged.android.test.runner", + sdk_version: "current", static_libs: ["android.test.runner"], jarjar_rules: "jarjar-rules.txt", diff --git a/tests/ActivityManagerPerfTests/README.txt b/tests/ActivityManagerPerfTests/README.txt index 26862906a7f2..15602623e7d5 100644 --- a/tests/ActivityManagerPerfTests/README.txt +++ b/tests/ActivityManagerPerfTests/README.txt @@ -49,5 +49,7 @@ Adding tests can be reported in an iteration * If the target package should be running before your test logic starts, add startTargetPackage(); at the beginning of the iteration + * Reporting - * Look at go/am-perf for how to add new tests to dashboards and receive notification on regression + * Look at internal documentation for how to add new tests to dashboards and receive notification + on regressions diff --git a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml index 23a151c0350a..32905a96ae14 100644 --- a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml +++ b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml @@ -19,7 +19,6 @@ android:minSdkVersion="21" android:targetSdkVersion="27" /> <application android:name=".TestApplication"> - <activity android:name=".TestActivity" android:exported="true"/> <provider android:authorities="com.android.frameworks.perftests.amteststestapp" android:name=".TestContentProvider" @@ -33,6 +32,9 @@ </intent-filter> </receiver> <service + android:name=".StartProcessService" + android:exported="true" /> + <service android:name=".TestService" android:exported="true" /> </application> diff --git a/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestActivity.java b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/StartProcessService.java index 4e7bb4cc101e..054097ec207a 100644 --- a/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestActivity.java +++ b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/StartProcessService.java @@ -16,19 +16,26 @@ package com.android.frameworks.perftests.amteststestapp; -import android.app.Activity; +import android.app.Service; +import android.content.Intent; +import android.os.Binder; +import android.os.IBinder; import android.os.Looper; +import android.util.Log; -import com.android.frameworks.perftests.am.util.Constants; import com.android.frameworks.perftests.am.util.Utils; -public class TestActivity extends Activity { +/** + * Service used to start up the target package and make sure it's running. + * Should be bound to, then wait for it to call the ILooperIdleCallback. + */ +public class StartProcessService extends Service { @Override - protected void onResume() { - super.onResume(); - Looper.myQueue().addIdleHandler(() -> { - Utils.sendTime(getIntent(), Constants.TYPE_TARGET_PACKAGE_START); + public IBinder onBind(Intent intent) { + Looper.getMainLooper().getQueue().addIdleHandler(() -> { + Utils.sendLooperIdle(intent); return false; }); + return new Binder(); } } diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java index cf175e00b217..58fb136ae9b3 100644 --- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java +++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java @@ -16,11 +16,9 @@ package com.android.frameworks.perftests.am.tests; -import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; -import android.os.IBinder; import android.perftests.utils.ManualBenchmarkState; import android.perftests.utils.PerfManualStatusReporter; import android.support.test.InstrumentationRegistry; @@ -28,20 +26,16 @@ import android.support.test.InstrumentationRegistry; import com.android.frameworks.perftests.am.util.TargetPackageUtils; import com.android.frameworks.perftests.am.util.TimeReceiver; -import org.junit.After; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; import java.util.function.LongSupplier; public class BasePerfTest { private static final String TAG = BasePerfTest.class.getSimpleName(); - private static final long AWAIT_SERVICE_CONNECT_MS = 2000; private TimeReceiver mTimeReceiver; + private ServiceConnection mAliveServiceConnection; @Rule public PerfManualStatusReporter mPerfManualStatusReporter = new PerfManualStatusReporter(); @@ -54,11 +48,6 @@ public class BasePerfTest { mTimeReceiver = new TimeReceiver(); } - @After - public void tearDown() { - TargetPackageUtils.killTargetPackage(mContext); - } - protected void addReceivedTimeNs(String type) { mTimeReceiver.addTimeForTypeToQueue(type, System.nanoTime()); } @@ -71,46 +60,6 @@ public class BasePerfTest { return intent; } - protected ServiceConnection bindAndWaitForConnectedService() { - return bindAndWaitForConnectedService(0); - } - - protected ServiceConnection bindAndWaitForConnectedService(int flags) { - CountDownLatch countDownLatch = new CountDownLatch(1); - final ServiceConnection serviceConnection = new ServiceConnection() { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - countDownLatch.countDown(); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - } - }; - - final Intent intent = createServiceIntent(); - final boolean success = mContext.bindService(intent, serviceConnection, - Context.BIND_AUTO_CREATE | flags); - Assert.assertTrue("Could not bind to service", success); - - try { - boolean connectedSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS, - TimeUnit.MILLISECONDS); - Assert.assertTrue("Timeout when waiting for ServiceConnection.onServiceConnected()", - connectedSuccess); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - - return serviceConnection; - } - - protected void unbindFromService(ServiceConnection serviceConnection) { - if (serviceConnection != null) { - mContext.unbindService(serviceConnection); - } - } - protected Intent createBroadcastIntent(String action) { final Intent intent = new Intent(action); intent.addFlags( @@ -125,11 +74,14 @@ public class BasePerfTest { private void setUpIteration() { mTimeReceiver.clear(); - TargetPackageUtils.killTargetPackage(mContext); + } + + private void tearDownIteration() { + TargetPackageUtils.killTargetPackage(mContext, mAliveServiceConnection); } protected void startTargetPackage() { - TargetPackageUtils.startTargetPackage(mContext, mTimeReceiver); + mAliveServiceConnection = TargetPackageUtils.startTargetPackage(mContext); } protected long getReceivedTimeNs(String type) { @@ -142,6 +94,7 @@ public class BasePerfTest { while (benchmarkState.keepRunning(elapsedTimeNs)) { setUpIteration(); elapsedTimeNs = func.getAsLong(); + tearDownIteration(); } } } diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java index 6d2935a148fd..e1263db61b8b 100644 --- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java +++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java @@ -25,6 +25,7 @@ import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import com.android.frameworks.perftests.am.util.Constants; +import com.android.frameworks.perftests.am.util.TargetPackageUtils; import org.junit.Assert; import org.junit.Test; @@ -75,7 +76,7 @@ public class ServiceBindPerfTest extends BasePerfTest { final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED); return endTimeNs - startTimeNs; } finally { - unbindFromService(serviceConnection); + TargetPackageUtils.unbindFromService(mContext, serviceConnection); } }); } @@ -97,7 +98,7 @@ public class ServiceBindPerfTest extends BasePerfTest { final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED); return endTimeNs - startTimeNs; } finally { - unbindFromService(serviceConnection); + TargetPackageUtils.unbindFromService(mContext, serviceConnection); } }); } @@ -112,7 +113,8 @@ public class ServiceBindPerfTest extends BasePerfTest { startTargetPackage(); final Intent intent = createServiceIntent(); - final ServiceConnection alreadyBoundServiceConnection = bindAndWaitForConnectedService(); + final ServiceConnection alreadyBoundServiceConnection = + TargetPackageUtils.bindAndWaitForConnectedService(mContext, intent); try { final ServiceConnection serviceConnection = createServiceConnectionReportTime(); @@ -123,10 +125,10 @@ public class ServiceBindPerfTest extends BasePerfTest { final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED); return endTimeNs - startTimeNs; } finally { - unbindFromService(serviceConnection); + TargetPackageUtils.unbindFromService(mContext, serviceConnection); } } finally { - unbindFromService(alreadyBoundServiceConnection); + TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection); } }); } @@ -139,8 +141,9 @@ public class ServiceBindPerfTest extends BasePerfTest { public void bindServiceAllowOomManagement() { runPerfFunction(() -> { final Intent intentNoOom = createServiceIntent(); - final ServiceConnection serviceConnectionOom = bindAndWaitForConnectedService( - Context.BIND_ALLOW_OOM_MANAGEMENT); + final ServiceConnection serviceConnectionOom = + TargetPackageUtils.bindAndWaitForConnectedService(mContext, intentNoOom, + Context.BIND_ALLOW_OOM_MANAGEMENT); try { final ServiceConnection serviceConnectionNoOom = @@ -152,10 +155,10 @@ public class ServiceBindPerfTest extends BasePerfTest { return endTimeNs - startTimeNs; } finally { - unbindFromService(serviceConnectionNoOom); + TargetPackageUtils.unbindFromService(mContext, serviceConnectionNoOom); } } finally { - unbindFromService(serviceConnectionOom); + TargetPackageUtils.unbindFromService(mContext, serviceConnectionOom); } }); } diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java index 626ee020542d..f05f32382e53 100644 --- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java +++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java @@ -23,6 +23,7 @@ import android.support.test.filters.LargeTest; import android.support.test.runner.AndroidJUnit4; import com.android.frameworks.perftests.am.util.Constants; +import com.android.frameworks.perftests.am.util.TargetPackageUtils; import org.junit.Assert; import org.junit.Test; @@ -86,7 +87,8 @@ public class ServiceStartPerfTest extends BasePerfTest { public void startServiceAlreadyBound() { runPerfFunction(() -> { final ServiceConnection alreadyBoundServiceConnection = - bindAndWaitForConnectedService(); + TargetPackageUtils.bindAndWaitForConnectedService(mContext, + createServiceIntent()); try { final Intent intent = createServiceIntent(); @@ -96,20 +98,21 @@ public class ServiceStartPerfTest extends BasePerfTest { return endTimeNs - startTimeNs; } finally { - unbindFromService(alreadyBoundServiceConnection); + TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection); } }); } /** * Benchmark time from Context.startService() with FLAG_GRANT_READ_URI_PERMISSION to - * Service.onStartCommand() when target process is running. + * Service.onStartCommand() when target service is already running. */ @Test public void startServiceProcessRunningReadUriPermission() { runPerfFunction(() -> { final ServiceConnection alreadyBoundServiceConnection = - bindAndWaitForConnectedService(); + TargetPackageUtils.bindAndWaitForConnectedService(mContext, + createServiceIntent()); try { final Intent intent = createServiceIntent(); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); @@ -120,7 +123,7 @@ public class ServiceStartPerfTest extends BasePerfTest { return endTimeNs - startTimeNs; } finally { - unbindFromService(alreadyBoundServiceConnection); + TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection); } }); } diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java index 3db8abce90da..046dd6bb7dce 100644 --- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java +++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java @@ -17,19 +17,33 @@ package com.android.frameworks.perftests.am.util; import android.app.ActivityManager; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.ServiceConnection; import android.content.pm.PackageManager; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.ResultReceiver; import android.os.SystemClock; +import org.junit.Assert; + +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + public class TargetPackageUtils { private static final String TAG = TargetPackageUtils.class.getSimpleName(); public static final String PACKAGE_NAME = "com.android.frameworks.perftests.amteststestapp"; public static final String ACTIVITY_NAME = PACKAGE_NAME + ".TestActivity"; public static final String SERVICE_NAME = PACKAGE_NAME + ".TestService"; + private static final String START_SERVICE_NAME = PACKAGE_NAME + ".StartProcessService"; private static final long WAIT_TIME_MS = 100L; + private static final long AWAIT_SERVICE_CONNECT_MS = 10000L; // Cache for test app's uid, so we only have to query it once. private static int sTestAppUid = -1; @@ -37,11 +51,13 @@ public class TargetPackageUtils { /** * Kills the test package synchronously. */ - public static void killTargetPackage(Context context) { - ActivityManager activityManager = context.getSystemService(ActivityManager.class); + public static void killTargetPackage(Context context, ServiceConnection serviceConnection) { + unbindFromService(context, serviceConnection); + + final ActivityManager activityManager = context.getSystemService(ActivityManager.class); activityManager.forceStopPackage(PACKAGE_NAME); while (targetPackageIsRunning(context)) { - sleep(); + SystemClock.sleep(WAIT_TIME_MS); } Utils.drainBroadcastQueue(); @@ -50,21 +66,24 @@ public class TargetPackageUtils { /** * Starts the test package synchronously. It does so by starting an Activity. */ - public static void startTargetPackage(Context context, TimeReceiver timeReceiver) { - // "am start-activity -W PACKAGE_NAME/ACTIVITY_CLASS_NAME" still requires a sleep even - // though it should be synchronous, so just use Intent instead + public static ServiceConnection startTargetPackage(Context context) { + final CountDownLatch countDownLatch = new CountDownLatch(1); final Intent intent = new Intent(); - intent.putExtras(timeReceiver.createReceiveTimeExtraBinder()); - intent.setClassName(PACKAGE_NAME, ACTIVITY_NAME); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent); + intent.putExtra(Intent.EXTRA_RESULT_RECEIVER, new CountDownResultReceiver(countDownLatch)); + intent.setClassName(PACKAGE_NAME, START_SERVICE_NAME); + final ServiceConnection serviceConnection = bindAndWaitForConnectedService(context, intent); - while (!targetPackageIsRunning(context)) { - sleep(); + try { + final boolean targetPackageIdleSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS, + TimeUnit.MILLISECONDS); + Assert.assertTrue("Timeout when waiting for ILooperIdleCallback.Stub.looperIdle()", + targetPackageIdleSuccess); + } catch (InterruptedException e) { + throw new RuntimeException(e); } - // make sure Application has run - timeReceiver.getReceivedTimeNs(Constants.TYPE_TARGET_PACKAGE_START); + Utils.drainBroadcastQueue(); + return serviceConnection; } private static boolean targetPackageIsRunning(Context context) { @@ -74,10 +93,6 @@ public class TargetPackageUtils { return !result.contains("(NONEXISTENT)"); } - private static void sleep() { - SystemClock.sleep(WAIT_TIME_MS); - } - private static int getTestAppUid(Context context) { if (sTestAppUid == -1) { final PackageManager pm = context.getPackageManager(); @@ -90,5 +105,45 @@ public class TargetPackageUtils { return sTestAppUid; } + public static ServiceConnection bindAndWaitForConnectedService(Context context, Intent intent) { + return bindAndWaitForConnectedService(context, intent, 0); + } + + public static ServiceConnection bindAndWaitForConnectedService(Context context, Intent intent, + int bindFlags) { + final CountDownLatch countDownLatch = new CountDownLatch(1); + final ServiceConnection serviceConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + countDownLatch.countDown(); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + } + }; + + final boolean success = context.bindService(intent, serviceConnection, + Context.BIND_AUTO_CREATE | bindFlags); + Assert.assertTrue("Could not bind to service", success); + + try { + final boolean connectedSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS, + TimeUnit.MILLISECONDS); + Assert.assertTrue("Timeout when waiting for ServiceConnection.onServiceConnected()", + connectedSuccess); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + return serviceConnection; + } + + public static void unbindFromService(Context context, ServiceConnection serviceConnection) { + if (serviceConnection != null) { + context.unbindService(serviceConnection); + } + } + } diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java index ffb3f84cee51..9b076c507ff8 100644 --- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java +++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java @@ -29,4 +29,5 @@ public class Constants { "com.android.frameworks.perftests.ACTION_BROADCAST_REGISTERED_RECEIVE"; public static final String EXTRA_RECEIVER_CALLBACK = "receiver_callback_binder"; + public static final String EXTRA_LOOPER_IDLE_CALLBACK = "looper_idle_callback_binder"; } diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java new file mode 100644 index 000000000000..6c032c45e751 --- /dev/null +++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java @@ -0,0 +1,36 @@ +/* + * 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 com.android.frameworks.perftests.am.util; + +import android.os.Bundle; +import android.os.ResultReceiver; + +import java.util.concurrent.CountDownLatch; + +public class CountDownResultReceiver extends ResultReceiver { + private CountDownLatch mCountDownLatch; + + public CountDownResultReceiver(CountDownLatch countDownLatch) { + super(null); + mCountDownLatch = countDownLatch; + } + + @Override + protected void onReceiveResult(int resultCode, Bundle resultData) { + mCountDownLatch.countDown(); + } +} diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java index 493d8cdd0803..67071d204eff 100644 --- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java +++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java @@ -18,6 +18,7 @@ package com.android.frameworks.perftests.am.util; import android.content.Intent; import android.os.RemoteException; +import android.os.ResultReceiver; import android.support.test.InstrumentationRegistry; import android.support.test.uiautomator.UiDevice; import android.util.Log; @@ -56,4 +57,12 @@ public class Utils { Log.e(TAG, e.getMessage()); } } + + /** + * Notify the listener that the main Looper queue is idle. + */ + public static void sendLooperIdle(Intent intent) { + ResultReceiver resultReceiver = intent.getParcelableExtra(Intent.EXTRA_RESULT_RECEIVER); + resultReceiver.send(0, null); + } } diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java index 2a13093b7ed0..494ee6594492 100644 --- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java +++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java @@ -83,6 +83,7 @@ public class AppLaunch extends InstrumentationTestCase { private static final String KEY_TRACE_BUFFERSIZE = "trace_bufferSize"; private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval"; private static final String KEY_COMPILER_FILTERS = "compiler_filters"; + private static final String KEY_FORCE_STOP_APP = "force_stop_app"; private static final String SIMPLEPERF_APP_CMD = "simpleperf --log fatal stat --csv -e cpu-cycles,major-faults --app %s & %s"; @@ -103,6 +104,7 @@ public class AppLaunch extends InstrumentationTestCase { private static final String DROP_CACHE_SCRIPT = "/data/local/tmp/dropCache.sh"; private static final String APP_LAUNCH_CMD = "am start -W -n"; private static final String SUCCESS_MESSAGE = "Status: ok"; + private static final String WARNING_MESSAGE = "Warning:"; private static final String COMPILE_SUCCESS = "Success"; private static final String THIS_TIME = "ThisTime:"; private static final String LAUNCH_ITERATION = "LAUNCH_ITERATION - %d"; @@ -125,6 +127,7 @@ public class AppLaunch extends InstrumentationTestCase { private String mLaunchOrder = null; private boolean mDropCache = false; private int mLaunchIterations = 10; + private boolean mForceStopApp = true; private int mTraceLaunchCount = 0; private String mTraceDirectoryStr = null; private Bundle mResult = new Bundle(); @@ -246,7 +249,7 @@ public class AppLaunch extends InstrumentationTestCase { // We only need to run a trial for the speed-profile filter, but we always // run one for "applaunch.txt" consistency. AppLaunchResult launchResult = - startApp(launch.getApp(), true, launch.getLaunchReason()); + startApp(launch.getApp(), launch.getLaunchReason()); if (launchResult.mLaunchTime < 0) { addLaunchResult(launch, new AppLaunchResult()); // simply pass the app if launch isn't successful @@ -274,7 +277,7 @@ public class AppLaunch extends InstrumentationTestCase { } // In the "applaunch.txt" file app launches are referenced using // "LAUNCH_ITERATION - ITERATION NUM" - launchResults = startApp(launch.getApp(), true, launch.getLaunchReason()); + launchResults = startApp(launch.getApp(), launch.getLaunchReason()); if (launchResults.mLaunchTime < 0) { addLaunchResult(launch, new AppLaunchResult()); // if it fails once, skip the rest of the launches @@ -295,14 +298,18 @@ public class AppLaunch extends InstrumentationTestCase { atraceLogger.atraceStart(traceCategoriesSet, traceBufferSize, traceDumpInterval, rootTraceSubDir, String.format("%s-%s", launch.getApp(), launch.getLaunchReason())); - startApp(launch.getApp(), true, launch.getLaunchReason()); + startApp(launch.getApp(), launch.getLaunchReason()); sleep(POST_LAUNCH_IDLE_TIMEOUT); } finally { // Stop the trace atraceLogger.atraceStop(); } } - closeApp(launch.getApp()); + if(mForceStopApp) { + closeApp(launch.getApp()); + } else { + startHomeIntent(); + } sleep(BETWEEN_LAUNCH_SLEEP_TIMEOUT); } } finally { @@ -425,6 +432,10 @@ public class AppLaunch extends InstrumentationTestCase { if (launchIterations != null) { mLaunchIterations = Integer.parseInt(launchIterations); } + String forceStopApp = args.getString(KEY_FORCE_STOP_APP); + if (forceStopApp != null) { + mForceStopApp = Boolean.parseBoolean(forceStopApp); + } String appList = args.getString(KEY_APPS); if (appList == null) return; @@ -522,8 +533,8 @@ public class AppLaunch extends InstrumentationTestCase { } } - private AppLaunchResult startApp(String appName, boolean forceStopBeforeLaunch, - String launchReason) throws NameNotFoundException, RemoteException { + private AppLaunchResult startApp(String appName, String launchReason) + throws NameNotFoundException, RemoteException { Log.i(TAG, "Starting " + appName); Intent startIntent = mNameToIntent.get(appName); @@ -532,8 +543,7 @@ public class AppLaunch extends InstrumentationTestCase { mResult.putString(mNameToResultKey.get(appName), "App does not exist"); return new AppLaunchResult(); } - AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, forceStopBeforeLaunch, - launchReason); + AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, launchReason); Thread t = new Thread(runnable); t.start(); try { @@ -682,13 +692,10 @@ public class AppLaunch extends InstrumentationTestCase { private class AppLaunchRunnable implements Runnable { private Intent mLaunchIntent; private AppLaunchResult mLaunchResult; - private boolean mForceStopBeforeLaunch; private String mLaunchReason; - public AppLaunchRunnable(Intent intent, boolean forceStopBeforeLaunch, - String launchReason) { + public AppLaunchRunnable(Intent intent, String launchReason) { mLaunchIntent = intent; - mForceStopBeforeLaunch = forceStopBeforeLaunch; mLaunchReason = launchReason; mLaunchResult = new AppLaunchResult(); } @@ -702,7 +709,7 @@ public class AppLaunch extends InstrumentationTestCase { try { String packageName = mLaunchIntent.getComponent().getPackageName(); String componentName = mLaunchIntent.getComponent().flattenToShortString(); - if (mForceStopBeforeLaunch) { + if (mForceStopApp) { mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT); } String launchCmd = String.format("%s %s", APP_LAUNCH_CMD, componentName); @@ -752,10 +759,11 @@ public class AppLaunch extends InstrumentationTestCase { String launchTime = "-1"; String cpuCycles = "-1"; String majorFaults = "-1"; - boolean launchSuccess = false; + boolean coldLaunchSuccess = false; + boolean hotLaunchSuccess = false; try { InputStream inputStream = new FileInputStream(parcelDesc.getFileDescriptor()); - /* SAMPLE OUTPUT : + /* SAMPLE OUTPUT : Cold launch Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator } Status: ok Activity: com.google.android.calculator/com.android.calculator2.Calculator @@ -763,6 +771,15 @@ public class AppLaunch extends InstrumentationTestCase { TotalTime: 357 WaitTime: 377 Complete*/ + /* SAMPLE OUTPUT : Hot launch + Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator } + Warning: Activity not started, its current task has been brought to the front + Status: ok + Activity: com.google.android.calculator/com.android.calculator2.CalculatorGoogle + ThisTime: 60 + TotalTime: 60 + WaitTime: 67 + Complete*/ /* WITH SIMPLEPERF : Performance counter statistics, 6595722690,cpu-cycles,4.511040,GHz,(100%), @@ -776,24 +793,33 @@ public class AppLaunch extends InstrumentationTestCase { mBufferedWriter.write(headerInfo); mBufferedWriter.newLine(); while ((line = bufferedReader.readLine()) != null) { - if (lineCount == 2 && line.contains(SUCCESS_MESSAGE)) { - launchSuccess = true; + if (lineCount == 2 && line.startsWith(SUCCESS_MESSAGE)) { + coldLaunchSuccess = true; + } + if (lineCount == 2 && line.startsWith(WARNING_MESSAGE)) { + hotLaunchSuccess = true; } // Parse TotalTime which is the launch time - if (launchSuccess && lineCount == 5) { + if (coldLaunchSuccess && lineCount == 5) { + String launchSplit[] = line.split(":"); + launchTime = launchSplit[1].trim(); + } + if (hotLaunchSuccess && lineCount == 6) { String launchSplit[] = line.split(":"); launchTime = launchSplit[1].trim(); } if (mSimplePerfAppOnly) { // Parse simpleperf output. - if (lineCount == 9) { + if ((lineCount == 9 && coldLaunchSuccess) + || (lineCount == 10 && hotLaunchSuccess)) { if (!line.contains("cpu-cycles")) { Log.e(TAG, "Error in simpleperf output"); } else { cpuCycles = line.split(",")[0].trim(); } - } else if (lineCount == 10) { + } else if ((lineCount == 10 && coldLaunchSuccess) + || (lineCount == 11 && hotLaunchSuccess)) { if (!line.contains("major-faults")) { Log.e(TAG, "Error in simpleperf output"); } else { diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk index 56d7918aa01e..04f6739a6ced 100644 --- a/tests/CoreTests/android/Android.mk +++ b/tests/CoreTests/android/Android.mk @@ -7,14 +7,14 @@ LOCAL_SRC_FILES := \ $(call all-subdir-java-files) LOCAL_JAVA_LIBRARIES := \ - android.test.runner \ - bouncycastle \ - conscrypt \ + android.test.runner.stubs \ org.apache.http.legacy \ - android.test.base \ + android.test.base.stubs \ + +LOCAL_SDK_VERSION := current LOCAL_STATIC_JAVA_LIBRARIES := junit -LOCAL_PACKAGE_NAME := CoreTests +LOCAL_PACKAGE_NAME := LegacyCoreTests include $(BUILD_PACKAGE) diff --git a/tests/CoreTests/android/core/JniLibTest.java b/tests/CoreTests/android/core/JniLibTest.java deleted file mode 100644 index d4760720f818..000000000000 --- a/tests/CoreTests/android/core/JniLibTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2006 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.core; - -import android.test.suitebuilder.annotation.Suppress; -import android.util.Log; -import junit.framework.TestCase; - - -@Suppress -public class JniLibTest extends TestCase { - - @Override - protected void setUp() throws Exception { - super.setUp(); - /* - * This causes the native shared library to be loaded when the - * class is first used. The library is only loaded once, even if - * multiple classes include this line. - * - * The library must be in java.library.path, which is derived from - * LD_LIBRARY_PATH. The actual library name searched for will be - * "libjni_lib_test.so" under Linux, but may be different on other - * platforms. - */ - try { - System.loadLibrary("jni_lib_test"); - } catch (UnsatisfiedLinkError ule) { - Log.e("JniLibTest", "WARNING: Could not load jni_lib_test natives"); - } - } - - private static native int nativeStaticThing(float f); - private native void nativeThing(int val); - - public void testNativeCall() { - Log.i("JniLibTest", "JNI search path is " - + System.getProperty("java.library.path")); - Log.i("JniLibTest", "'jni_lib_test' becomes '" - + System.mapLibraryName("jni_lib_test") + "'"); - - int result = nativeStaticThing(1234.5f); - nativeThing(result); - } -} diff --git a/tests/CoreTests/android/core/MiscRegressionTest.java b/tests/CoreTests/android/core/MiscRegressionTest.java deleted file mode 100644 index 32995b574e59..000000000000 --- a/tests/CoreTests/android/core/MiscRegressionTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 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.core; - -import android.test.suitebuilder.annotation.MediumTest; -import java.util.logging.Logger; -import junit.framework.TestCase; - -public class MiscRegressionTest extends TestCase { - - // Regression test for #951285: Suitable LogHandler should be chosen - // depending on the environment. - @MediumTest - public void testAndroidLogHandler() throws Exception { - Logger.global.severe("This has logging Level.SEVERE, should become ERROR"); - Logger.global.warning("This has logging Level.WARNING, should become WARN"); - Logger.global.info("This has logging Level.INFO, should become INFO"); - Logger.global.config("This has logging Level.CONFIG, should become DEBUG"); - Logger.global.fine("This has logging Level.FINE, should become VERBOSE"); - Logger.global.finer("This has logging Level.FINER, should become VERBOSE"); - Logger.global.finest("This has logging Level.FINEST, should become VERBOSE"); - } -} diff --git a/tests/CoreTests/android/core/RequestAPITest.java b/tests/CoreTests/android/core/RequestAPITest.java index 94eb23e1b5dc..206f228c3804 100644 --- a/tests/CoreTests/android/core/RequestAPITest.java +++ b/tests/CoreTests/android/core/RequestAPITest.java @@ -22,7 +22,6 @@ import android.test.AndroidTestCase; import android.test.suitebuilder.annotation.Suppress; import android.util.Log; import android.webkit.CookieSyncManager; -import com.google.android.collect.Maps; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -87,7 +86,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * header is attempted to be set */ Log.d(LOGTAG, "testRequestAddNullHeader start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put(null, null); verifyFailure(headers); Log.d(LOGTAG, "testRequestAddNullHeader - returning"); @@ -99,7 +98,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * value is attempted to be set */ Log.d(LOGTAG, "testRequestAddNullValue start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put("TestHeader", null); verifyFailure(headers); Log.d(LOGTAG, "testRequestAddNullValue - returning"); @@ -111,7 +110,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * header is attempted to be set */ Log.d(LOGTAG, "testRequestAddEmptyValue start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put("TestHeader", ""); verifyFailure(headers); Log.d(LOGTAG, "testRequestAddEmptyValue - returning"); @@ -131,7 +130,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * generating and exception */ Log.d(LOGTAG, "testRequestAddHeader start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put("TestHeader", "RequestAddHeader"); verifySuccess(headers); Log.d(LOGTAG, "testRequestAddHeader - returning"); @@ -143,7 +142,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * can be set without generating and exception */ Log.d(LOGTAG, "testRequestAddMultiHeader start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put("TestHeader", "RequestAddMultiHeader"); headers.put("TestHeader2", "RequestAddMultiHeader"); headers.put("TestHeader3", "RequestAddMultiHeader"); @@ -157,7 +156,7 @@ public class RequestAPITest extends AndroidTestCase implements HttpConstants { * and values can be set without generating and exception */ Log.d(LOGTAG, "testRequestAddSameHeader start "); - Map<String, String> headers = Maps.newHashMap(); + Map<String, String> headers = new HashMap<>(); headers.put("TestHeader", "RequestAddSameHeader"); headers.put("TestHeader", "RequestAddSameHeader"); headers.put("TestHeader", "RequestAddSameHeader"); diff --git a/tests/CoreTests/android/core/Sha1Test.java b/tests/CoreTests/android/core/Sha1Test.java deleted file mode 100644 index 8ed120542a44..000000000000 --- a/tests/CoreTests/android/core/Sha1Test.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2008 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.core; - -import android.test.suitebuilder.annotation.SmallTest; -import java.security.MessageDigest; -import junit.framework.TestCase; - -/** - * Tests SHA1 message digest algorithm. - */ -public class Sha1Test extends TestCase { - class TestData { - private String input; - private String result; - - public TestData(String i, String r) { - input = i; - result = r; - } - } - - TestData[] mTestData = new TestData[]{ - new TestData("abc", "a9993e364706816aba3e25717850c26c9cd0d89d"), - new TestData("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", - "84983e441c3bd26ebaae4aa1f95129e5e54670f1") - }; - - @SmallTest - public void testSha1() throws Exception { - MessageDigest digest = MessageDigest.getInstance("SHA-1"); - - int numTests = mTestData.length; - for (int i = 0; i < numTests; i++) { - digest.update(mTestData[i].input.getBytes()); - byte[] hash = digest.digest(); - String encodedHash = encodeHex(hash); - assertEquals(encodedHash, mTestData[i].result); - } - } - - private static String encodeHex(byte[] bytes) { - StringBuffer hex = new StringBuffer(bytes.length * 2); - - for (int i = 0; i < bytes.length; i++) { - if (((int) bytes[i] & 0xff) < 0x10) { - hex.append("0"); - } - hex.append(Integer.toString((int) bytes[i] & 0xff, 16)); - } - - return hex.toString(); - } -} - diff --git a/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java b/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java index 388f91a2c3fb..261ea2ec866d 100644 --- a/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java +++ b/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java @@ -66,9 +66,6 @@ public class SurfaceCompositionTest extends super(SurfaceCompositionMeasuringActivity.class); } - private void testRestoreContexts() { - } - @SmallTest public void testSurfaceCompositionPerformance() { Bundle status = new Bundle(); diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java index 040173792406..db4898492ac5 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java @@ -57,7 +57,9 @@ public class MainInteractionSession extends VoiceInteractionSession Button mCompleteButton; Button mAbortButton; + Bundle mAssistData; AssistStructure mAssistStructure; + AssistContent mAssistContent; static final int STATE_IDLE = 0; static final int STATE_LAUNCHING = 1; @@ -169,19 +171,15 @@ public class MainInteractionSession extends VoiceInteractionSession public void onHandleAssist(Bundle assistBundle) { } - @Override - public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) { - mAssistStructure = structure; - if (mAssistVisualizer != null) { - if (mAssistStructure != null) { - mAssistVisualizer.setAssistStructure(mAssistStructure); - } else { - mAssistVisualizer.clearAssistData(); - } - } + private void logAssistContentAndData(AssistContent content, Bundle data) { if (content != null) { Log.i(TAG, "Assist intent: " + content.getIntent()); + Log.i(TAG, "Assist intent from app: " + content.isAppProvidedIntent()); Log.i(TAG, "Assist clipdata: " + content.getClipData()); + Log.i(TAG, "Assist structured data: " + content.getStructuredData()); + Log.i(TAG, "Assist web uri: " + content.getWebUri()); + Log.i(TAG, "Assist web uri from app: " + content.isAppProvidedWebUri()); + Log.i(TAG, "Assist extras: " + content.getExtras()); } if (data != null) { Uri referrer = data.getParcelable(Intent.EXTRA_REFERRER); @@ -192,6 +190,21 @@ public class MainInteractionSession extends VoiceInteractionSession } @Override + public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) { + mAssistData = data; + mAssistStructure = structure; + mAssistContent = content; + if (mAssistVisualizer != null) { + if (mAssistStructure != null) { + mAssistVisualizer.setAssistStructure(mAssistStructure); + } else { + mAssistVisualizer.clearAssistData(); + } + } + logAssistContentAndData(content, data); + } + + @Override public void onHandleAssistSecondary(final Bundle data, final AssistStructure structure, final AssistContent content, int index, int count) { Log.i(TAG, "Got secondary activity assist data " + index + " of " + count); @@ -246,6 +259,7 @@ public class MainInteractionSession extends VoiceInteractionSession public void onClick(View v) { if (v == mTreeButton) { if (mAssistVisualizer != null) { + logAssistContentAndData(mAssistContent, mAssistData); mAssistVisualizer.logTree(); } } else if (v == mTextButton) { diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 28f81220027c..2aea1d7011d5 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -914,8 +914,10 @@ public class ConnectivityServiceTest { mock(INetworkPolicyManager.class), mock(IpConnectivityLog.class)); - mService.systemReady(); + // Create local CM before sending system ready so that we can answer + // getSystemService() correctly. mCm = new WrappedConnectivityManager(InstrumentationRegistry.getContext(), mService); + mService.systemReady(); mCm.bindProcessToNetwork(null); // Ensure that the default setting for Captive Portals is used for most tests @@ -3412,8 +3414,10 @@ public class ConnectivityServiceTest { @Test public void testNetworkCallbackMaximum() { - final int MAX_REQUESTS = 100; - final int CALLBACKS = 90; + // We can only have 99 callbacks, because MultipathPolicyTracker is + // already one of them. + final int MAX_REQUESTS = 99; + final int CALLBACKS = 89; final int INTENTS = 10; assertEquals(MAX_REQUESTS, CALLBACKS + INTENTS); diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java index b1b05e8b86ba..49b2643fa83e 100644 --- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java +++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java @@ -95,6 +95,7 @@ import android.telephony.TelephonyManager; import com.android.internal.net.VpnInfo; import com.android.internal.util.test.BroadcastInterceptingContext; +import com.android.server.LocalServices; import com.android.server.net.NetworkStatsService.NetworkStatsSettings; import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config; @@ -221,6 +222,9 @@ public class NetworkStatsServiceTest { @After public void tearDown() throws Exception { + // Registered by NetworkStatsService's constructor. + LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class); + IoUtils.deleteContents(mStatsDir); mServiceContext = null; diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index b5273dd39c54..50c4b5eed508 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -999,6 +999,7 @@ public class RttManager { // just in case legacy API needed some relatively real timestamp legacyResults[i].ts = SystemClock.elapsedRealtime() * 1000; } + i++; } listener.onSuccess(legacyResults); } diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java index b573adf60863..c5ad7de12d19 100644 --- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java +++ b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java @@ -263,6 +263,7 @@ public class CredentialTest { * * @throws Exception */ + @Test public void validateCertCredentialWithoutCaCert() throws Exception { Credential cred = createCredentialWithCertificateCredential(); cred.setCaCertificate(null); |