diff options
666 files changed, 13075 insertions, 17275 deletions
diff --git a/Android.mk b/Android.mk index b71f08c98dfb..27dedd9fd4ba 100644 --- a/Android.mk +++ b/Android.mk @@ -348,12 +348,6 @@ LOCAL_SRC_FILES += \ media/java/android/media/projection/IMediaProjectionCallback.aidl \ media/java/android/media/projection/IMediaProjectionManager.aidl \ media/java/android/media/projection/IMediaProjectionWatcherCallback.aidl \ - media/java/android/media/routing/IMediaRouteService.aidl \ - media/java/android/media/routing/IMediaRouteClientCallback.aidl \ - media/java/android/media/routing/IMediaRouter.aidl \ - media/java/android/media/routing/IMediaRouterDelegate.aidl \ - media/java/android/media/routing/IMediaRouterRoutingCallback.aidl \ - media/java/android/media/routing/IMediaRouterStateCallback.aidl \ media/java/android/media/session/IActiveSessionsListener.aidl \ media/java/android/media/session/ISessionController.aidl \ media/java/android/media/session/ISessionControllerCallback.aidl \ @@ -460,7 +454,6 @@ aidl_files := \ frameworks/base/location/java/android/location/Criteria.aidl \ frameworks/base/media/java/android/media/MediaMetadata.aidl \ frameworks/base/media/java/android/media/MediaDescription.aidl \ - frameworks/base/media/java/android/media/routing/MediaRouteSelector.aidl \ frameworks/base/media/java/android/media/Rating.aidl \ frameworks/base/media/java/android/media/AudioAttributes.aidl \ frameworks/base/media/java/android/media/AudioFocusInfo.aidl \ diff --git a/CleanSpec.mk b/CleanSpec.mk index c812b6a4ba24..667ed025d1a7 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -233,6 +233,7 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/libinputflingerhost.so $ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/symbols/system/lib/libinputflingerhost.so $(PRODUCT_OUT)/symbols/system/lib64/libinputflingerhost.so) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/lib/libinputflingerhost.so $(PRODUCT_OUT)/obj_arm/lib/libinputflingerhost.so) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libinputflingerhost_intermediates $(PRODUCT_OUT)/obj_arm/SHARED_LIBRARIES/libinputflingerhost_intermediates) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/target/common/obj/framework.aidl) # ****************************************************************** # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST ABOVE THIS BANNER diff --git a/api/current.txt b/api/current.txt index 99db3c538254..6d35ecd4da0d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28,7 +28,6 @@ package android { field public static final java.lang.String BIND_DREAM_SERVICE = "android.permission.BIND_DREAM_SERVICE"; field public static final java.lang.String BIND_INCALL_SERVICE = "android.permission.BIND_INCALL_SERVICE"; field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD"; - field public static final java.lang.String BIND_MEDIA_ROUTE_SERVICE = "android.permission.BIND_MEDIA_ROUTE_SERVICE"; field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE"; field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"; field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; @@ -218,6 +217,7 @@ package android { public static final class R.attr { ctor public R.attr(); + field public static final int __reserved0 = 16844020; // 0x10104f4 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -301,7 +301,6 @@ package android { field public static final int anyDensity = 16843372; // 0x101026c field public static final int apduServiceBanner = 16843757; // 0x10103ed field public static final int apiKey = 16843281; // 0x1010211 - field public static final int assistBlocked = 16844020; // 0x10104f4 field public static final int author = 16843444; // 0x10102b4 field public static final int authorities = 16842776; // 0x1010018 field public static final int autoAdvanceViewId = 16843535; // 0x101030f @@ -3988,48 +3987,6 @@ package android.app { field public java.lang.String serviceDetails; } - public final class AssistAction { - method public static void updateAssistData(android.os.Bundle, android.os.Bundle); - field public static final java.lang.String ASSIST_ACTION_KEY = "android:assist_action"; - field public static final java.lang.String KEY_ACTION_OBJECT = "object"; - field public static final java.lang.String KEY_ACTION_STATUS = "actionStatus"; - field public static final java.lang.String KEY_DESCRIPTION = "description"; - field public static final java.lang.String KEY_ID = "@id"; - field public static final java.lang.String KEY_NAME = "name"; - field public static final java.lang.String KEY_TYPE = "@type"; - field public static final java.lang.String KEY_URL = "url"; - field public static final java.lang.String STATUS_TYPE_ACTIVE = "ActiveActionStatus"; - field public static final java.lang.String STATUS_TYPE_COMPLETED = "CompletedActionStatus"; - field public static final java.lang.String TYPE_ADD_ACTION = "AddAction"; - field public static final java.lang.String TYPE_BOOKMARK_ACTION = "BookmarkAction"; - field public static final java.lang.String TYPE_LIKE_ACTION = "LikeAction"; - field public static final java.lang.String TYPE_LISTEN_ACTION = "ListenAction"; - field public static final java.lang.String TYPE_VIEW_ACTION = "ViewAction"; - field public static final java.lang.String TYPE_WANT_ACTION = "WantAction"; - field public static final java.lang.String TYPE_WATCH_ACTION = "WatchAction"; - } - - public static final class AssistAction.ActionBuilder { - ctor public AssistAction.ActionBuilder(); - method public android.os.Bundle build(); - method public android.app.AssistAction.ActionBuilder set(java.lang.String, java.lang.String); - method public android.app.AssistAction.ActionBuilder set(java.lang.String, android.os.Bundle); - method public android.app.AssistAction.ActionBuilder setObject(android.os.Bundle); - method public android.app.AssistAction.ActionBuilder setType(java.lang.String); - } - - public static final class AssistAction.ThingBuilder { - ctor public AssistAction.ThingBuilder(); - method public android.os.Bundle build(); - method public android.app.AssistAction.ThingBuilder set(java.lang.String, java.lang.String); - method public android.app.AssistAction.ThingBuilder set(java.lang.String, android.os.Bundle); - method public android.app.AssistAction.ThingBuilder setDescription(java.lang.String); - method public android.app.AssistAction.ThingBuilder setId(java.lang.String); - method public android.app.AssistAction.ThingBuilder setName(java.lang.String); - method public android.app.AssistAction.ThingBuilder setType(java.lang.String); - method public android.app.AssistAction.ThingBuilder setUrl(android.net.Uri); - } - public class AssistContent implements android.os.Parcelable { ctor public AssistContent(); method public int describeContents(); @@ -5148,17 +5105,31 @@ package android.app { method public void cancel(java.lang.String, int); method public void cancelAll(); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); - method public android.app.NotificationManager.Policy getNotificationPolicy(android.app.NotificationManager.Policy.Token); - method public boolean isNotificationPolicyTokenValid(android.app.NotificationManager.Policy.Token); + method public final int getCurrentInterruptionFilter(); + method public android.app.NotificationManager.Policy getNotificationPolicy(); + method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); method public void notify(java.lang.String, int, android.app.Notification); - method public void requestNotificationPolicyToken(android.app.NotificationManager.Policy.Token.RequestCallback, android.os.Handler); - method public void setNotificationPolicy(android.app.NotificationManager.Policy.Token, android.app.NotificationManager.Policy); + method public void requestPolicyAccess(android.app.NotificationManager.NotificationPolicyAccessRequestCallback, android.os.Handler); + method public final void setInterruptionFilter(int); + method public void setNotificationPolicy(android.app.NotificationManager.Policy); + field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; + field public static final int INTERRUPTION_FILTER_ALARMS = 4; // 0x4 + field public static final int INTERRUPTION_FILTER_ALL = 1; // 0x1 + field public static final int INTERRUPTION_FILTER_NONE = 3; // 0x3 + field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2 + field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0 + } + + public static abstract class NotificationManager.NotificationPolicyAccessRequestCallback { + ctor public NotificationManager.NotificationPolicyAccessRequestCallback(); + method public abstract void onAccessDenied(); + method public abstract void onAccessGranted(); } public static class NotificationManager.Policy implements android.os.Parcelable { - ctor public NotificationManager.Policy(int, int); + ctor public NotificationManager.Policy(int, int, int); method public int describeContents(); method public static java.lang.String priorityCategoriesToString(int); method public static java.lang.String prioritySendersToString(int); @@ -5172,20 +5143,9 @@ package android.app { field public static final int PRIORITY_SENDERS_ANY = 0; // 0x0 field public static final int PRIORITY_SENDERS_CONTACTS = 1; // 0x1 field public static final int PRIORITY_SENDERS_STARRED = 2; // 0x2 + field public final int priorityCallSenders; field public final int priorityCategories; - field public final int prioritySenders; - } - - public static class NotificationManager.Policy.Token implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy.Token> CREATOR; - } - - public static abstract class NotificationManager.Policy.Token.RequestCallback { - ctor public NotificationManager.Policy.Token.RequestCallback(); - method public abstract void onTokenDenied(); - method public abstract void onTokenGranted(android.app.NotificationManager.Policy.Token); + field public final int priorityMessageSenders; } public final class PendingIntent implements android.os.Parcelable { @@ -5698,9 +5658,6 @@ package android.app.admin { } public class DeviceInitializerStatus { - method public static boolean isCustomStatus(int); - method public static boolean isErrorStatus(int); - method public static boolean isHighPriority(int); field public static final int FLAG_STATUS_CUSTOM = 33554432; // 0x2000000 field public static final int FLAG_STATUS_ERROR = 16777216; // 0x1000000 field public static final int FLAG_STATUS_HIGH_PRIORITY = 134217728; // 0x8000000 @@ -5712,9 +5669,9 @@ package android.app.admin { field public static final int STATUS_ERROR_INSTALL_PACKAGE = 16777240; // 0x1000018 field public static final int STATUS_ERROR_RESET_PROTECTION_BLOCKING_PROVISIONING = 16777238; // 0x1000016 field public static final int STATUS_ERROR_SET_DEVICE_POLICY = 16777241; // 0x1000019 - field public static final int STATUS_STATE_CONNECT_BLUETOOTH_PROXY = 134217736; // 0x8000008 + field public static final int STATUS_STATE_CONNECTING_BLUETOOTH_PROXY = 134217736; // 0x8000008 field public static final int STATUS_STATE_DEVICE_PROVISIONED = 134217738; // 0x800000a - field public static final int STATUS_STATE_DISCONNECT_BLUETOOTH_PROXY = 134217737; // 0x8000009 + field public static final int STATUS_STATE_DISCONNECTING_BLUETOOTH_PROXY = 134217737; // 0x8000009 } public class DevicePolicyManager { @@ -5838,7 +5795,6 @@ package android.app.admin { field public static final java.lang.String ACTION_SET_NEW_PASSWORD = "android.app.action.SET_NEW_PASSWORD"; field public static final java.lang.String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION"; field public static final java.lang.String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED"; - field public static final int DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2 field public static final int ENCRYPTION_STATUS_ACTIVATING = 2; // 0x2 field public static final int ENCRYPTION_STATUS_ACTIVE = 3; // 0x3 field public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4; // 0x4 @@ -5903,6 +5859,7 @@ package android.app.admin { field public static final int PERMISSION_POLICY_AUTO_DENY = 2; // 0x2 field public static final int PERMISSION_POLICY_AUTO_GRANT = 1; // 0x1 field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0 + field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2 field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1 field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1 field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2 @@ -6164,7 +6121,7 @@ package android.app.usage { } public final class UsageStatsManager { - method public boolean isAppIdle(java.lang.String); + method public boolean isAppInactive(java.lang.String); method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long); method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long); method public android.app.usage.UsageEvents queryEvents(long, long); @@ -7766,7 +7723,6 @@ package android.content { field public static final java.lang.String ALARM_SERVICE = "alarm"; field public static final java.lang.String APPWIDGET_SERVICE = "appwidget"; field public static final java.lang.String APP_OPS_SERVICE = "appops"; - field public static final java.lang.String AUDIO_DEVICES_SERVICE = "audio_devices_manager"; field public static final java.lang.String AUDIO_SERVICE = "audio"; field public static final java.lang.String BATTERY_SERVICE = "batterymanager"; field public static final int BIND_ABOVE_CLIENT = 8; // 0x8 @@ -8297,7 +8253,6 @@ package android.content { field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list"; field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list"; field public static final java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER"; - field public static final java.lang.String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS"; field public static final java.lang.String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT"; field public static final java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER"; field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED"; @@ -9344,6 +9299,7 @@ package android.content.pm { field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets"; field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency"; field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; + field public static final java.lang.String FEATURE_AUDIO_PRO = "android.hardware.audio.pro"; field public static final java.lang.String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive"; field public static final java.lang.String FEATURE_BACKUP = "android.software.backup"; field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth"; @@ -14730,12 +14686,12 @@ package android.media { method public android.media.AudioAttributes.Builder setUsage(int); } - public class AudioDeviceInfo { - method public java.lang.String getAddress(); + public final class AudioDeviceInfo { method public int[] getChannelCounts(); method public int[] getChannelMasks(); method public int[] getFormats(); - method public java.lang.String getName(); + method public int getId(); + method public java.lang.CharSequence getName(); method public int[] getSampleRates(); method public int getType(); method public boolean isSink(); @@ -14762,15 +14718,6 @@ package android.media { field public static final int TYPE_WIRED_HEADSET = 3; // 0x3 } - public class AudioDevicesManager { - method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler); - method public android.media.AudioDeviceInfo[] listDevices(int); - method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener); - field public static final int LIST_DEVICES_ALL = 3; // 0x3 - field public static final int LIST_DEVICES_INPUTS = 1; // 0x1 - field public static final int LIST_DEVICES_OUTPUTS = 2; // 0x2 - } - public class AudioFormat { method public int getChannelCount(); method public int getChannelIndexMask(); @@ -14841,11 +14788,13 @@ package android.media { public class AudioManager { method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener); + method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler); method public void adjustStreamVolume(int, int, int); method public void adjustSuggestedStreamVolume(int, int, int); method public void adjustVolume(int, int); method public void dispatchMediaKeyEvent(android.view.KeyEvent); method public int generateAudioSessionId(); + method public android.media.AudioDeviceInfo[] getDevices(int); method public int getMode(); method public java.lang.String getParameters(java.lang.String); method public java.lang.String getProperty(java.lang.String); @@ -14870,6 +14819,7 @@ package android.media { method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent); method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient); method public deprecated boolean registerRemoteController(android.media.RemoteController); + method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener); method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int); method public deprecated void setBluetoothA2dpOn(boolean); method public void setBluetoothScoOn(boolean); @@ -14938,6 +14888,9 @@ package android.media { field public static final int FX_KEYPRESS_SPACEBAR = 6; // 0x6 field public static final int FX_KEYPRESS_STANDARD = 5; // 0x5 field public static final int FX_KEY_CLICK = 0; // 0x0 + field public static final int GET_DEVICES_ALL = 3; // 0x3 + field public static final int GET_DEVICES_INPUTS = 1; // 0x1 + field public static final int GET_DEVICES_OUTPUTS = 2; // 0x2 field public static final int MODE_CURRENT = -1; // 0xffffffff field public static final int MODE_INVALID = -2; // 0xfffffffe field public static final int MODE_IN_CALL = 2; // 0x2 @@ -14986,7 +14939,7 @@ package android.media { public class AudioRecord { ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException; - method public void addOnAudioRecordRoutingListener(android.media.OnAudioRecordRoutingListener, android.os.Handler); + method public void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler); method public int getAudioFormat(); method public int getAudioSessionId(); method public int getAudioSource(); @@ -14997,7 +14950,7 @@ package android.media { method public int getNativeFrameCount() throws java.lang.IllegalStateException; method public int getNotificationMarkerPosition(); method public int getPositionNotificationPeriod(); - method public android.media.AudioDeviceInfo getPreferredInputDevice(); + method public android.media.AudioDeviceInfo getPreferredDevice(); method public int getRecordingState(); method public android.media.AudioDeviceInfo getRoutedDevice(); method public int getSampleRate(); @@ -15010,10 +14963,10 @@ package android.media { method public int read(java.nio.ByteBuffer, int); method public int read(java.nio.ByteBuffer, int, int); method public void release(); - method public void removeOnAudioRecordRoutingListener(android.media.OnAudioRecordRoutingListener); + method public void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener); method public int setNotificationMarkerPosition(int); method public int setPositionNotificationPeriod(int); - method public boolean setPreferredInputDevice(android.media.AudioDeviceInfo); + method public boolean setPreferredDevice(android.media.AudioDeviceInfo); method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener); method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener, android.os.Handler); method public void startRecording() throws java.lang.IllegalStateException; @@ -15035,8 +14988,8 @@ package android.media { ctor public AudioRecord.Builder(); method public android.media.AudioRecord build() throws java.lang.UnsupportedOperationException; method public android.media.AudioRecord.Builder setAudioFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException; + method public android.media.AudioRecord.Builder setAudioSource(int) throws java.lang.IllegalArgumentException; method public android.media.AudioRecord.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException; - method public android.media.AudioRecord.Builder setCapturePreset(int) throws java.lang.IllegalArgumentException; } public static abstract interface AudioRecord.OnRecordPositionUpdateListener { @@ -15044,6 +14997,10 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioRecord); } + public static abstract interface AudioRecord.OnRoutingChangedListener { + method public abstract void onRoutingChanged(android.media.AudioRecord); + } + public final class AudioTimestamp { ctor public AudioTimestamp(); field public long framePosition; @@ -15054,7 +15011,7 @@ package android.media { ctor public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException; - method public void addOnAudioTrackRoutingListener(android.media.OnAudioTrackRoutingListener, android.os.Handler); + method public void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler); method public int attachAuxEffect(int); method public void flush(); method public int getAudioFormat(); @@ -15070,10 +15027,10 @@ package android.media { method public int getNotificationMarkerPosition(); method public int getPlayState(); method public int getPlaybackHeadPosition(); + method public android.media.PlaybackParams getPlaybackParams(); method public int getPlaybackRate(); - method public android.media.PlaybackSettings getPlaybackSettings(); method public int getPositionNotificationPeriod(); - method public android.media.AudioDeviceInfo getPreferredOutputDevice(); + method public android.media.AudioDeviceInfo getPreferredDevice(); method public android.media.AudioDeviceInfo getRoutedDevice(); method public int getSampleRate(); method public int getState(); @@ -15083,17 +15040,17 @@ package android.media { method public void play() throws java.lang.IllegalStateException; method public void release(); method public int reloadStaticData(); - method public void removeOnAudioTrackRoutingListener(android.media.OnAudioTrackRoutingListener); + method public void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener); method public int setAuxEffectSendLevel(float); method public int setLoopPoints(int, int, int); method public int setNotificationMarkerPosition(int); method public int setPlaybackHeadPosition(int); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener); method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler); method public int setPlaybackRate(int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public int setPositionNotificationPeriod(int); - method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo); + method public boolean setPreferredDevice(android.media.AudioDeviceInfo); method protected deprecated void setState(int); method public deprecated int setStereoVolume(float, float); method public int setVolume(float); @@ -15136,6 +15093,10 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioTrack); } + public static abstract interface AudioTrack.OnRoutingChangedListener { + method public abstract void onRoutingChanged(android.media.AudioTrack); + } + public class CamcorderProfile { method public static android.media.CamcorderProfile get(int); method public static android.media.CamcorderProfile get(int, int); @@ -15417,11 +15378,11 @@ package android.media { public static final class MediaCodec.CodecException extends java.lang.IllegalStateException { method public java.lang.String getDiagnosticInfo(); - method public int getReason(); + method public int getErrorCode(); method public boolean isRecoverable(); method public boolean isTransient(); - field public static final int REASON_HARDWARE = 0; // 0x0 - field public static final int REASON_RECLAIMED = 1; // 0x1 + field public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; // 0x44c + field public static final int ERROR_RECLAIMED = 1101; // 0x44d } public static final class MediaCodec.CryptoException extends java.lang.RuntimeException { @@ -16091,9 +16052,9 @@ package android.media { method public int getAudioSessionId(); method public int getCurrentPosition(); method public int getDuration(); - method public android.media.PlaybackSettings getPlaybackSettings(); + method public android.media.PlaybackParams getPlaybackParams(); method public int getSelectedTrack(int) throws java.lang.IllegalStateException; - method public android.media.SyncSettings getSyncSettings(); + method public android.media.SyncParams getSyncParams(); method public android.media.MediaTimestamp getTimestamp(); method public android.media.MediaPlayer.TrackInfo[] getTrackInfo() throws java.lang.IllegalStateException; method public int getVideoHeight(); @@ -16129,11 +16090,11 @@ package android.media { method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener); method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener); method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackRate(float, int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public void setScreenOnWhilePlaying(boolean); method public void setSurface(android.view.Surface); - method public void setSyncSettings(android.media.SyncSettings); + method public void setSyncParams(android.media.SyncParams); method public void setVideoScalingMode(int); method public void setVolume(float, float); method public void setWakeMode(android.content.Context, int); @@ -16452,18 +16413,18 @@ package android.media { ctor public MediaSync(); method public final android.view.Surface createInputSurface(); method public void flush(); - method public android.media.PlaybackSettings getPlaybackSettings(); - method public android.media.SyncSettings getSyncSettings(); + method public android.media.PlaybackParams getPlaybackParams(); + method public android.media.SyncParams getSyncParams(); method public android.media.MediaTimestamp getTimestamp(); - method public void queueAudio(java.nio.ByteBuffer, int, int, long); + method public void queueAudio(java.nio.ByteBuffer, int, long); method public final void release(); method public void setAudioTrack(android.media.AudioTrack); method public void setCallback(android.media.MediaSync.Callback, android.os.Handler); method public void setOnErrorListener(android.media.MediaSync.OnErrorListener, android.os.Handler); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackRate(float, int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public void setSurface(android.view.Surface); - method public void setSyncSettings(android.media.SyncSettings); + method public void setSyncParams(android.media.SyncParams); field public static final int MEDIASYNC_ERROR_AUDIOTRACK_FAIL = 1; // 0x1 field public static final int MEDIASYNC_ERROR_SURFACE_FAIL = 2; // 0x2 field public static final int PLAYBACK_RATE_AUDIO_MODE_DEFAULT = 0; // 0x0 @@ -16503,23 +16464,15 @@ package android.media { method public abstract void onAudioDeviceConnection(); } - public abstract interface OnAudioRecordRoutingListener { - method public abstract void onAudioRecordRouting(android.media.AudioRecord); - } - - public abstract interface OnAudioTrackRoutingListener { - method public abstract void onAudioTrackRouting(android.media.AudioTrack); - } - - public final class PlaybackSettings { - ctor public PlaybackSettings(); - method public android.media.PlaybackSettings allowDefaults(); + public final class PlaybackParams { + ctor public PlaybackParams(); + method public android.media.PlaybackParams allowDefaults(); method public int getAudioFallbackMode(); method public float getPitch(); method public float getSpeed(); - method public android.media.PlaybackSettings setAudioFallbackMode(int); - method public android.media.PlaybackSettings setPitch(float); - method public android.media.PlaybackSettings setSpeed(float); + method public android.media.PlaybackParams setAudioFallbackMode(int); + method public android.media.PlaybackParams setPitch(float); + method public android.media.PlaybackParams setSpeed(float); field public static final int AUDIO_FALLBACK_MODE_DEFAULT = 0; // 0x0 field public static final int AUDIO_FALLBACK_MODE_FAIL = 2; // 0x2 field public static final int AUDIO_FALLBACK_MODE_MUTE = 1; // 0x1 @@ -16710,17 +16663,17 @@ package android.media { method public abstract void onLoadComplete(android.media.SoundPool, int, int); } - public final class SyncSettings { - ctor public SyncSettings(); - method public android.media.SyncSettings allowDefaults(); + public final class SyncParams { + ctor public SyncParams(); + method public android.media.SyncParams allowDefaults(); method public int getAudioAdjustMode(); method public float getFrameRate(); method public int getSyncSource(); method public float getTolerance(); - method public android.media.SyncSettings setAudioAdjustMode(int); - method public android.media.SyncSettings setFrameRate(float); - method public android.media.SyncSettings setSyncSource(int); - method public android.media.SyncSettings setTolerance(float); + method public android.media.SyncParams setAudioAdjustMode(int); + method public android.media.SyncParams setFrameRate(float); + method public android.media.SyncParams setSyncSource(int); + method public android.media.SyncParams setTolerance(float); field public static final int AUDIO_ADJUST_MODE_DEFAULT = 0; // 0x0 field public static final int AUDIO_ADJUST_MODE_RESAMPLE = 2; // 0x2 field public static final int AUDIO_ADJUST_MODE_STRETCH = 1; // 0x1 @@ -17429,248 +17382,11 @@ package android.media.projection { } -package android.media.routing { - - public final class MediaRouteSelector implements android.os.Parcelable { - method public boolean containsProtocol(java.lang.Class<?>); - method public boolean containsProtocol(java.lang.String); - method public int describeContents(); - method public android.os.Bundle getExtras(); - method public int getOptionalFeatures(); - method public java.util.List<java.lang.String> getOptionalProtocols(); - method public int getRequiredFeatures(); - method public java.util.List<java.lang.String> getRequiredProtocols(); - method public java.lang.String getServicePackageName(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.media.routing.MediaRouteSelector> CREATOR; - } - - public static final class MediaRouteSelector.Builder { - ctor public MediaRouteSelector.Builder(); - method public android.media.routing.MediaRouteSelector.Builder addOptionalProtocol(java.lang.Class<?>); - method public android.media.routing.MediaRouteSelector.Builder addOptionalProtocol(java.lang.String); - method public android.media.routing.MediaRouteSelector.Builder addRequiredProtocol(java.lang.Class<?>); - method public android.media.routing.MediaRouteSelector.Builder addRequiredProtocol(java.lang.String); - method public android.media.routing.MediaRouteSelector build(); - method public android.media.routing.MediaRouteSelector.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouteSelector.Builder setOptionalFeatures(int); - method public android.media.routing.MediaRouteSelector.Builder setRequiredFeatures(int); - method public android.media.routing.MediaRouteSelector.Builder setServicePackageName(java.lang.String); - } - - public abstract class MediaRouteService extends android.app.Service { - ctor public MediaRouteService(); - method public android.media.routing.MediaRouter.ServiceMetadata getServiceMetadata(); - method public android.os.IBinder onBind(android.content.Intent); - method public abstract android.media.routing.MediaRouteService.ClientSession onCreateClientSession(android.media.routing.MediaRouteService.ClientInfo); - field public static final java.lang.String SERVICE_INTERFACE = "android.media.routing.MediaRouteService"; - } - - public static final class MediaRouteService.ClientInfo { - method public java.lang.String getPackageName(); - method public int getUid(); - } - - public static abstract class MediaRouteService.ClientSession { - ctor public MediaRouteService.ClientSession(); - method public abstract boolean onConnect(android.media.routing.MediaRouter.ConnectionRequest, android.media.routing.MediaRouteService.ConnectionCallback); - method public abstract void onDisconnect(); - method public void onPauseStream(); - method public void onRelease(); - method public void onResumeStream(); - method public abstract boolean onStartDiscovery(android.media.routing.MediaRouter.DiscoveryRequest, android.media.routing.MediaRouteService.DiscoveryCallback); - method public abstract void onStopDiscovery(); - } - - public final class MediaRouteService.ConnectionCallback { - method public void onConnected(android.media.routing.MediaRouter.ConnectionInfo); - method public void onConnectionFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onDisconnected(); - } - - public final class MediaRouteService.DiscoveryCallback { - method public void onDestinationFound(android.media.routing.MediaRouter.DestinationInfo, java.util.List<android.media.routing.MediaRouter.RouteInfo>); - method public void onDestinationLost(android.media.routing.MediaRouter.DestinationInfo); - method public void onDiscoveryFailed(int, java.lang.CharSequence, android.os.Bundle); - } - - public final class MediaRouter { - ctor public MediaRouter(android.content.Context); - method public void addSelector(android.media.routing.MediaRouteSelector); - method public void clearSelectors(); - method public android.media.routing.MediaRouter.Delegate createDelegate(); - method public android.media.routing.MediaRouter.ConnectionInfo getConnection(); - method public int getConnectionState(); - method public java.util.List<android.media.routing.MediaRouter.DestinationInfo> getDiscoveredDestinations(); - method public java.util.List<android.media.routing.MediaRouter.RouteInfo> getDiscoveredRoutes(android.media.routing.MediaRouter.DestinationInfo); - method public int getDiscoveryState(); - method public android.media.AudioAttributes getPreferredAudioAttributes(); - method public android.view.Display getPreferredPresentationDisplay(); - method public android.media.VolumeProvider getPreferredVolumeProvider(); - method public android.media.routing.MediaRouter.DestinationInfo getSelectedDestination(); - method public android.media.routing.MediaRouter.RouteInfo getSelectedRoute(); - method public java.util.List<android.media.routing.MediaRouteSelector> getSelectors(); - method public boolean isReleased(); - method public void pauseStream(); - method public void release(); - method public void removeSelector(android.media.routing.MediaRouteSelector); - method public void resumeStream(); - method public void setRoutingCallback(android.media.routing.MediaRouter.RoutingCallback, android.os.Handler); - field public static final int CONNECTION_ERROR_ABORTED = 1; // 0x1 - field public static final int CONNECTION_ERROR_BARGED = 7; // 0x7 - field public static final int CONNECTION_ERROR_BROKEN = 6; // 0x6 - field public static final int CONNECTION_ERROR_BUSY = 4; // 0x4 - field public static final int CONNECTION_ERROR_TIMEOUT = 5; // 0x5 - field public static final int CONNECTION_ERROR_UNAUTHORIZED = 2; // 0x2 - field public static final int CONNECTION_ERROR_UNKNOWN = 0; // 0x0 - field public static final int CONNECTION_ERROR_UNREACHABLE = 3; // 0x3 - field public static final int CONNECTION_FLAG_BARGE = 1; // 0x1 - field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2 - field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1 - field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0 - field public static final int DISCONNECTION_REASON_APPLICATION_REQUEST = 0; // 0x0 - field public static final int DISCONNECTION_REASON_ERROR = 2; // 0x2 - field public static final int DISCONNECTION_REASON_USER_REQUEST = 1; // 0x1 - field public static final int DISCOVERY_ERROR_ABORTED = 1; // 0x1 - field public static final int DISCOVERY_ERROR_NO_CONNECTIVITY = 2; // 0x2 - field public static final int DISCOVERY_ERROR_UNKNOWN = 0; // 0x0 - field public static final int DISCOVERY_FLAG_BACKGROUND = 1; // 0x1 - field public static final int DISCOVERY_STATE_STARTED = 1; // 0x1 - field public static final int DISCOVERY_STATE_STOPPED = 0; // 0x0 - field public static final int ROUTE_FEATURE_LIVE_AUDIO = 1; // 0x1 - field public static final int ROUTE_FEATURE_LIVE_VIDEO = 2; // 0x2 - } - - public static final class MediaRouter.ConnectionInfo { - method public android.media.AudioAttributes getAudioAttributes(); - method public android.os.Bundle getExtras(); - method public int getFeatures(); - method public android.view.Display getPresentationDisplay(); - method public android.os.IBinder getProtocolBinder(java.lang.String); - method public android.os.IBinder getProtocolBinder(int); - method public T getProtocolObject(java.lang.Class<T>); - method public java.util.List<java.lang.String> getProtocols(); - method public android.media.routing.MediaRouter.RouteInfo getRoute(); - method public android.media.VolumeProvider getVolumeProvider(); - } - - public static final class MediaRouter.ConnectionInfo.Builder { - ctor public MediaRouter.ConnectionInfo.Builder(android.media.routing.MediaRouter.RouteInfo); - method public android.media.routing.MediaRouter.ConnectionInfo build(); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setAudioAttributes(android.media.AudioAttributes); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setPresentationDisplay(android.view.Display); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setProtocolBinder(java.lang.String, android.os.IBinder); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setProtocolStub(java.lang.Class<?>, android.os.IInterface); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setVolumeProvider(android.media.VolumeProvider); - } - - public static final class MediaRouter.ConnectionRequest { - method public android.os.Bundle getExtras(); - method public int getFlags(); - method public android.media.routing.MediaRouter.RouteInfo getRoute(); - method public void setExtras(android.os.Bundle); - method public void setFlags(int); - method public void setRoute(android.media.routing.MediaRouter.RouteInfo); - } - - public static final class MediaRouter.Delegate { - ctor public MediaRouter.Delegate(); - method public void addStateCallback(android.media.routing.MediaRouter.StateCallback, android.os.Handler); - method public void connect(android.media.routing.MediaRouter.DestinationInfo, int); - method public void disconnect(int); - method public int getConnectionState(); - method public java.util.List<android.media.routing.MediaRouter.DestinationInfo> getDiscoveredDestinations(); - method public int getDiscoveryState(); - method public android.media.routing.MediaRouter.DestinationInfo getSelectedDestination(); - method public boolean isReleased(); - method public void removeStateCallback(android.media.routing.MediaRouter.StateCallback); - method public void startDiscovery(int); - method public void stopDiscovery(); - } - - public static final class MediaRouter.DestinationInfo { - method public java.lang.CharSequence getDescription(); - method public android.os.Bundle getExtras(); - method public int getIconResourceId(); - method public java.lang.String getId(); - method public java.lang.CharSequence getName(); - method public android.media.routing.MediaRouter.ServiceMetadata getServiceMetadata(); - method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); - } - - public static final class MediaRouter.DestinationInfo.Builder { - ctor public MediaRouter.DestinationInfo.Builder(java.lang.String, android.media.routing.MediaRouter.ServiceMetadata, java.lang.CharSequence); - method public android.media.routing.MediaRouter.DestinationInfo build(); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setDescription(java.lang.CharSequence); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setIconResourceId(int); - } - - public static final class MediaRouter.DiscoveryRequest { - method public int getFlags(); - method public java.util.List<android.media.routing.MediaRouteSelector> getSelectors(); - method public void setFlags(int); - method public void setSelectors(java.util.List<android.media.routing.MediaRouteSelector>); - } - - public static final class MediaRouter.RouteInfo { - method public android.media.routing.MediaRouter.DestinationInfo getDestination(); - method public android.os.Bundle getExtras(); - method public int getFeatures(); - method public java.lang.String getId(); - method public java.util.List<java.lang.String> getProtocols(); - method public android.media.routing.MediaRouteSelector getSelector(); - } - - public static final class MediaRouter.RouteInfo.Builder { - ctor public MediaRouter.RouteInfo.Builder(java.lang.String, android.media.routing.MediaRouter.DestinationInfo, android.media.routing.MediaRouteSelector); - method public android.media.routing.MediaRouter.RouteInfo.Builder addProtocol(java.lang.Class<T>); - method public android.media.routing.MediaRouter.RouteInfo.Builder addProtocol(java.lang.String); - method public android.media.routing.MediaRouter.RouteInfo build(); - method public android.media.routing.MediaRouter.RouteInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.RouteInfo.Builder setFeatures(int); - } - - public static abstract class MediaRouter.RoutingCallback extends android.media.routing.MediaRouter.StateCallback { - ctor public MediaRouter.RoutingCallback(); - method public boolean onPrepareConnectionRequest(android.media.routing.MediaRouter.ConnectionRequest, android.media.routing.MediaRouter.DestinationInfo, java.util.List<android.media.routing.MediaRouter.RouteInfo>); - method public boolean onPrepareDiscoveryRequest(android.media.routing.MediaRouter.DiscoveryRequest, java.util.List<android.media.routing.MediaRouteSelector>); - } - - public static final class MediaRouter.ServiceMetadata { - method public android.content.ComponentName getComponentName(); - method public android.graphics.drawable.Drawable getIcon(android.content.pm.PackageManager); - method public java.lang.CharSequence getLabel(android.content.pm.PackageManager); - method public java.lang.String getPackageName(); - method public android.content.pm.ServiceInfo getService(); - } - - public static abstract class MediaRouter.StateCallback { - ctor public MediaRouter.StateCallback(); - method public void onConnected(); - method public void onConnecting(); - method public void onConnectionFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onConnectionStateChanged(int); - method public void onDestinationFound(android.media.routing.MediaRouter.DestinationInfo); - method public void onDestinationLost(android.media.routing.MediaRouter.DestinationInfo); - method public void onDisconnected(); - method public void onDiscoveryFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onDiscoveryStarted(); - method public void onDiscoveryStateChanged(int); - method public void onDiscoveryStopped(); - method public void onReleased(); - method public void onSelectedDestinationChanged(android.media.routing.MediaRouter.DestinationInfo); - } - -} - package android.media.session { public final class MediaController { ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token); method public void adjustVolume(int, int); - method public android.media.routing.MediaRouter.Delegate createMediaRouterDelegate(); method public boolean dispatchMediaButtonEvent(android.view.KeyEvent); method public android.os.Bundle getExtras(); method public long getFlags(); @@ -17744,7 +17460,6 @@ package android.media.session { method public void setExtras(android.os.Bundle); method public void setFlags(int); method public void setMediaButtonReceiver(android.app.PendingIntent); - method public void setMediaRouter(android.media.routing.MediaRouter); method public void setMetadata(android.media.MediaMetadata); method public void setPlaybackState(android.media.session.PlaybackState); method public void setPlaybackToLocal(android.media.AudioAttributes); @@ -22908,6 +22623,7 @@ package android.os { ctor public Build.VERSION(); field public static final java.lang.String CODENAME; field public static final java.lang.String INCREMENTAL; + field public static final int PREVIEW_SDK_INT; field public static final java.lang.String RELEASE; field public static final deprecated java.lang.String SDK; field public static final int SDK_INT; @@ -23872,7 +23588,7 @@ package android.os { method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); - method public boolean setRestrictionsChallenge(java.lang.String); + method public deprecated boolean setRestrictionsChallenge(java.lang.String); method public deprecated void setUserRestriction(java.lang.String, boolean); method public deprecated void setUserRestrictions(android.os.Bundle); method public deprecated void setUserRestrictions(android.os.Bundle, android.os.UserHandle); @@ -26785,6 +26501,7 @@ package android.provider { field public static final java.lang.String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS"; field public static final java.lang.String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS"; field public static final java.lang.String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS"; + field public static final java.lang.String ACTION_ZEN_ACCESS_SETTINGS = "android.settings.ZEN_ACCESS_SETTINGS"; field public static final java.lang.String AUTHORITY = "settings"; field public static final java.lang.String EXTRA_ACCOUNT_TYPES = "account_types"; field public static final java.lang.String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled"; @@ -27515,7 +27232,6 @@ package android.renderscript { method public void copyTo(short[]); method public void copyTo(int[]); method public void copyTo(float[]); - method public void copyToFieldPacker(int, int, int, int, android.renderscript.FieldPacker); method public static android.renderscript.Allocation createCubemapFromBitmap(android.renderscript.RenderScript, android.graphics.Bitmap, android.renderscript.Allocation.MipmapControl, int); method public static android.renderscript.Allocation createCubemapFromBitmap(android.renderscript.RenderScript, android.graphics.Bitmap); method public static android.renderscript.Allocation createCubemapFromCubeFaces(android.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.renderscript.Allocation.MipmapControl, int); @@ -28670,7 +28386,7 @@ package android.security { method public android.security.KeyGeneratorSpec.Builder setAlias(java.lang.String); method public android.security.KeyGeneratorSpec.Builder setBlockModes(java.lang.String...); method public android.security.KeyGeneratorSpec.Builder setEncryptionPaddings(java.lang.String...); - method public android.security.KeyGeneratorSpec.Builder setEncryptionRequired(boolean); + method public android.security.KeyGeneratorSpec.Builder setEncryptionRequired(); method public android.security.KeyGeneratorSpec.Builder setKeySize(int); method public android.security.KeyGeneratorSpec.Builder setKeyValidityEnd(java.util.Date); method public android.security.KeyGeneratorSpec.Builder setKeyValidityForConsumptionEnd(java.util.Date); @@ -28747,6 +28463,53 @@ package android.security { public abstract class KeyStoreKeyProperties { } + public static abstract class KeyStoreKeyProperties.Algorithm { + field public static final java.lang.String AES = "AES"; + field public static final java.lang.String EC = "EC"; + field public static final java.lang.String HMAC_SHA1 = "HmacSHA1"; + field public static final java.lang.String HMAC_SHA224 = "HmacSHA224"; + field public static final java.lang.String HMAC_SHA256 = "HmacSHA256"; + field public static final java.lang.String HMAC_SHA384 = "HmacSHA384"; + field public static final java.lang.String HMAC_SHA512 = "HmacSHA512"; + field public static final java.lang.String RSA = "RSA"; + } + + public static abstract class KeyStoreKeyProperties.AlgorithmEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.BlockMode { + field public static final java.lang.String CBC = "CBC"; + field public static final java.lang.String CTR = "CTR"; + field public static final java.lang.String ECB = "ECB"; + field public static final java.lang.String GCM = "GCM"; + } + + public static abstract class KeyStoreKeyProperties.BlockModeEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.Digest { + field public static final java.lang.String MD5 = "MD5"; + field public static final java.lang.String NONE = "NONE"; + field public static final java.lang.String SHA1 = "SHA-1"; + field public static final java.lang.String SHA224 = "SHA-224"; + field public static final java.lang.String SHA256 = "SHA-256"; + field public static final java.lang.String SHA384 = "SHA-384"; + field public static final java.lang.String SHA512 = "SHA-512"; + } + + public static abstract class KeyStoreKeyProperties.DigestEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.EncryptionPadding { + field public static final java.lang.String NONE = "NoPadding"; + field public static final java.lang.String PKCS7 = "PKCS7Padding"; + field public static final java.lang.String RSA_OAEP = "OAEPPadding"; + field public static final java.lang.String RSA_PKCS1 = "PKCS1Padding"; + } + + public static abstract class KeyStoreKeyProperties.EncryptionPaddingEnum implements java.lang.annotation.Annotation { + } + public static abstract class KeyStoreKeyProperties.Origin { field public static final int GENERATED = 1; // 0x1 field public static final int IMPORTED = 2; // 0x2 @@ -28766,6 +28529,14 @@ package android.security { public static abstract class KeyStoreKeyProperties.PurposeEnum implements java.lang.annotation.Annotation { } + public static abstract class KeyStoreKeyProperties.SignaturePadding { + field public static final java.lang.String RSA_PKCS1 = "PKCS1"; + field public static final java.lang.String RSA_PSS = "PSS"; + } + + public static abstract class KeyStoreKeyProperties.SignaturePaddingEnum implements java.lang.annotation.Annotation { + } + public class KeyStoreKeySpec implements java.security.spec.KeySpec { method public java.lang.String[] getBlockModes(); method public java.lang.String[] getDigests(); @@ -28779,9 +28550,9 @@ package android.security { method public int getPurposes(); method public java.lang.String[] getSignaturePaddings(); method public int getUserAuthenticationValidityDurationSeconds(); - method public boolean isTeeBacked(); + method public boolean isInsideSecureHardware(); method public boolean isUserAuthenticationRequired(); - method public boolean isUserAuthenticationRequirementTeeEnforced(); + method public boolean isUserAuthenticationRequirementEnforcedBySecureHardware(); } public final class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter { @@ -28913,10 +28684,8 @@ package android.service.chooser { public final class ChooserTarget implements android.os.Parcelable { ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.app.PendingIntent); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.IntentSender); - ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.Intent); method public int describeContents(); method public android.graphics.Bitmap getIcon(); - method public android.content.Intent getIntent(); method public android.content.IntentSender getIntentSender(); method public float getScore(); method public java.lang.CharSequence getTitle(); @@ -29029,7 +28798,6 @@ package android.service.notification { method public final int getCurrentInterruptionFilter(); method public final int getCurrentListenerHints(); method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking(); - method public final android.app.NotificationManager.Policy.Token getNotificationPolicyToken(); method public android.os.IBinder onBind(android.content.Intent); method public void onInterruptionFilterChanged(int); method public void onListenerConnected(); @@ -30349,6 +30117,8 @@ package android.telecom { method public android.telecom.Connection getPrimaryConnection(); method public final int getState(); method public final android.telecom.StatusHints getStatusHints(); + method public android.telecom.Connection.VideoProvider getVideoProvider(); + method public int getVideoState(); method public void onAudioStateChanged(android.telecom.AudioState); method public void onConnectionAdded(android.telecom.Connection); method public void onDisconnect(); @@ -30368,6 +30138,8 @@ package android.telecom { method public final void setDisconnected(android.telecom.DisconnectCause); method public final void setOnHold(); method public final void setStatusHints(android.telecom.StatusHints); + method public final void setVideoProvider(android.telecom.Connection, android.telecom.Connection.VideoProvider); + method public final void setVideoState(android.telecom.Connection, int); field public static final long CONNECT_TIME_NOT_SPECIFIED = 0L; // 0x0L } @@ -30395,6 +30167,7 @@ package android.telecom { method public final android.telecom.Connection.VideoProvider getVideoProvider(); method public final boolean isRingbackRequested(); method public void onAbort(); + method public void onAnswer(int); method public void onAnswer(); method public void onAudioStateChanged(android.telecom.AudioState); method public void onDisconnect(); @@ -30424,7 +30197,11 @@ package android.telecom { method public final void setRingbackRequested(boolean); method public final void setRinging(); method public final void setStatusHints(android.telecom.StatusHints); + method public final void setVideoProvider(android.telecom.Connection.VideoProvider); + method public final void setVideoState(int); method public static java.lang.String stateToString(int); + field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 @@ -30432,6 +30209,12 @@ package android.telecom { field public static final int CAPABILITY_MUTE = 64; // 0x40 field public static final int CAPABILITY_RESPOND_VIA_TEXT = 32; // 0x20 field public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 4096; // 0x1000 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL = 768; // 0x300 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_RX = 256; // 0x100 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_TX = 512; // 0x200 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL = 3072; // 0xc00 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_RX = 1024; // 0x400 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 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 STATE_ACTIVE = 4; // 0x4 @@ -30477,10 +30260,12 @@ package android.telecom { public final class ConnectionRequest implements android.os.Parcelable { ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle); + ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle, int); method public int describeContents(); method public android.telecom.PhoneAccountHandle getAccountHandle(); method public android.net.Uri getAddress(); method public android.os.Bundle getExtras(); + method public int getVideoState(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.telecom.ConnectionRequest> CREATOR; } @@ -34192,14 +33977,6 @@ package android.util { } public deprecated class FloatMath { - method public static float ceil(float); - method public static float cos(float); - method public static float exp(float); - method public static float floor(float); - method public static float hypot(float, float); - method public static float pow(float, float); - method public static float sin(float); - method public static float sqrt(float); } public final class JsonReader implements java.io.Closeable { @@ -36077,7 +35854,7 @@ package android.view { method public boolean dispatchNestedPreScroll(int, int, int[], int[]); method public boolean dispatchNestedScroll(int, int, int, int, int[]); method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); - method public void dispatchProvideAssistStructure(android.view.ViewAssistStructure); + method public void dispatchProvideStructure(android.view.ViewStructure); method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>); method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>); method protected void dispatchSetActivated(boolean); @@ -36257,7 +36034,6 @@ package android.view { method public void invalidateOutline(); method public boolean isAccessibilityFocused(); method public boolean isActivated(); - method public boolean isAssistBlocked(); method public boolean isAttachedToWindow(); method public boolean isClickable(); method public boolean isDirty(); @@ -36339,8 +36115,8 @@ package android.view { method protected void onMeasure(int, int); method protected void onOverScrolled(int, int, boolean, boolean); method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); - method public void onProvideAssistStructure(android.view.ViewAssistStructure); - method public void onProvideVirtualAssistStructure(android.view.ViewAssistStructure); + method public void onProvideStructure(android.view.ViewStructure); + method public void onProvideVirtualStructure(android.view.ViewStructure); method protected void onRestoreInstanceState(android.os.Parcelable); method public void onRtlPropertiesChanged(int); method protected android.os.Parcelable onSaveInstanceState(); @@ -36403,7 +36179,6 @@ package android.view { method public void setActivated(boolean); method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); - method public void setAssistBlocked(boolean); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable); @@ -36766,40 +36541,8 @@ package android.view { method public static android.animation.Animator createCircularReveal(android.view.View, int, int, float, float); } - public abstract class ViewAssistStructure { + public abstract deprecated class ViewAssistStructure extends android.view.ViewStructure { ctor public ViewAssistStructure(); - method public abstract void asyncCommit(); - method public abstract android.view.ViewAssistStructure asyncNewChild(int); - method public abstract void clearExtras(); - method public abstract android.os.Bundle editExtras(); - method public abstract int getChildCount(); - method public abstract java.lang.CharSequence getHint(); - method public abstract java.lang.CharSequence getText(); - method public abstract int getTextSelectionEnd(); - method public abstract int getTextSelectionStart(); - method public abstract android.view.ViewAssistStructure newChild(int); - method public abstract void setAccessibilityFocused(boolean); - method public abstract void setActivated(boolean); - method public abstract void setAssistBlocked(boolean); - method public abstract void setCheckable(boolean); - method public abstract void setChecked(boolean); - method public abstract void setChildCount(int); - method public abstract void setClassName(java.lang.String); - method public abstract void setClickable(boolean); - method public abstract void setContentDescription(java.lang.CharSequence); - method public abstract void setDimens(int, int, int, int, int, int); - method public abstract void setEnabled(boolean); - method public abstract void setFocusable(boolean); - method public abstract void setFocused(boolean); - method public abstract void setHint(java.lang.CharSequence); - method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String); - method public abstract void setLongClickable(boolean); - method public abstract void setSelected(boolean); - method public abstract void setStylusButtonPressable(boolean); - method public abstract void setText(java.lang.CharSequence); - method public abstract void setText(java.lang.CharSequence, int, int); - method public abstract void setTextPaint(android.text.TextPaint); - method public abstract void setVisibility(int); } public class ViewConfiguration { @@ -37176,6 +36919,41 @@ package android.view { method public android.view.ViewPropertyAnimator zBy(float); } + public abstract class ViewStructure { + ctor public ViewStructure(); + method public abstract void asyncCommit(); + method public abstract android.view.ViewAssistStructure asyncNewChild(int); + method public abstract int getChildCount(); + method public abstract android.os.Bundle getExtras(); + method public abstract java.lang.CharSequence getHint(); + method public abstract java.lang.CharSequence getText(); + method public abstract int getTextSelectionEnd(); + method public abstract int getTextSelectionStart(); + method public abstract boolean hasExtras(); + method public abstract android.view.ViewAssistStructure newChild(int); + method public abstract void setAccessibilityFocused(boolean); + method public abstract void setActivated(boolean); + method public abstract void setCheckable(boolean); + method public abstract void setChecked(boolean); + method public abstract void setChildCount(int); + method public abstract void setClassName(java.lang.String); + method public abstract void setClickable(boolean); + method public abstract void setContentDescription(java.lang.CharSequence); + method public abstract void setDimens(int, int, int, int, int, int); + method public abstract void setEnabled(boolean); + method public abstract void setFocusable(boolean); + method public abstract void setFocused(boolean); + method public abstract void setHint(java.lang.CharSequence); + method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String); + method public abstract void setLongClickable(boolean); + method public abstract void setSelected(boolean); + method public abstract void setStylusButtonPressable(boolean); + method public abstract void setText(java.lang.CharSequence); + method public abstract void setText(java.lang.CharSequence, int, int); + method public abstract void setTextPaint(android.text.TextPaint); + method public abstract void setVisibility(int); + } + public final class ViewStub extends android.view.View { ctor public ViewStub(android.content.Context); ctor public ViewStub(android.content.Context, int); diff --git a/api/removed.txt b/api/removed.txt index 5e77e15e28eb..0046a700b72d 100644 --- a/api/removed.txt +++ b/api/removed.txt @@ -108,6 +108,21 @@ package android.text.format { } +package android.util { + + public deprecated class FloatMath { + method public static float ceil(float); + method public static float cos(float); + method public static float exp(float); + method public static float floor(float); + method public static float hypot(float, float); + method public static float pow(float, float); + method public static float sin(float); + method public static float sqrt(float); + } + +} + package android.view { public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback { diff --git a/api/system-current.txt b/api/system-current.txt index b4cc56e5e7f4..710b61a359d1 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -39,7 +39,6 @@ package android { field public static final java.lang.String BIND_INCALL_SERVICE = "android.permission.BIND_INCALL_SERVICE"; field public static final java.lang.String BIND_INPUT_METHOD = "android.permission.BIND_INPUT_METHOD"; field public static final java.lang.String BIND_KEYGUARD_APPWIDGET = "android.permission.BIND_KEYGUARD_APPWIDGET"; - field public static final java.lang.String BIND_MEDIA_ROUTE_SERVICE = "android.permission.BIND_MEDIA_ROUTE_SERVICE"; field public static final java.lang.String BIND_NFC_SERVICE = "android.permission.BIND_NFC_SERVICE"; field public static final java.lang.String BIND_NOTIFICATION_LISTENER_SERVICE = "android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"; field public static final java.lang.String BIND_PRINT_SERVICE = "android.permission.BIND_PRINT_SERVICE"; @@ -290,6 +289,7 @@ package android { public static final class R.attr { ctor public R.attr(); + field public static final int __reserved0 = 16844020; // 0x10104f4 field public static final int absListViewStyle = 16842858; // 0x101006a field public static final int accessibilityEventTypes = 16843648; // 0x1010380 field public static final int accessibilityFeedbackType = 16843650; // 0x1010382 @@ -373,7 +373,6 @@ package android { field public static final int anyDensity = 16843372; // 0x101026c field public static final int apduServiceBanner = 16843757; // 0x10103ed field public static final int apiKey = 16843281; // 0x1010211 - field public static final int assistBlocked = 16844020; // 0x10104f4 field public static final int author = 16843444; // 0x10102b4 field public static final int authorities = 16842776; // 0x1010018 field public static final int autoAdvanceViewId = 16843535; // 0x101030f @@ -4080,48 +4079,6 @@ package android.app { field public java.lang.String serviceDetails; } - public final class AssistAction { - method public static void updateAssistData(android.os.Bundle, android.os.Bundle); - field public static final java.lang.String ASSIST_ACTION_KEY = "android:assist_action"; - field public static final java.lang.String KEY_ACTION_OBJECT = "object"; - field public static final java.lang.String KEY_ACTION_STATUS = "actionStatus"; - field public static final java.lang.String KEY_DESCRIPTION = "description"; - field public static final java.lang.String KEY_ID = "@id"; - field public static final java.lang.String KEY_NAME = "name"; - field public static final java.lang.String KEY_TYPE = "@type"; - field public static final java.lang.String KEY_URL = "url"; - field public static final java.lang.String STATUS_TYPE_ACTIVE = "ActiveActionStatus"; - field public static final java.lang.String STATUS_TYPE_COMPLETED = "CompletedActionStatus"; - field public static final java.lang.String TYPE_ADD_ACTION = "AddAction"; - field public static final java.lang.String TYPE_BOOKMARK_ACTION = "BookmarkAction"; - field public static final java.lang.String TYPE_LIKE_ACTION = "LikeAction"; - field public static final java.lang.String TYPE_LISTEN_ACTION = "ListenAction"; - field public static final java.lang.String TYPE_VIEW_ACTION = "ViewAction"; - field public static final java.lang.String TYPE_WANT_ACTION = "WantAction"; - field public static final java.lang.String TYPE_WATCH_ACTION = "WatchAction"; - } - - public static final class AssistAction.ActionBuilder { - ctor public AssistAction.ActionBuilder(); - method public android.os.Bundle build(); - method public android.app.AssistAction.ActionBuilder set(java.lang.String, java.lang.String); - method public android.app.AssistAction.ActionBuilder set(java.lang.String, android.os.Bundle); - method public android.app.AssistAction.ActionBuilder setObject(android.os.Bundle); - method public android.app.AssistAction.ActionBuilder setType(java.lang.String); - } - - public static final class AssistAction.ThingBuilder { - ctor public AssistAction.ThingBuilder(); - method public android.os.Bundle build(); - method public android.app.AssistAction.ThingBuilder set(java.lang.String, java.lang.String); - method public android.app.AssistAction.ThingBuilder set(java.lang.String, android.os.Bundle); - method public android.app.AssistAction.ThingBuilder setDescription(java.lang.String); - method public android.app.AssistAction.ThingBuilder setId(java.lang.String); - method public android.app.AssistAction.ThingBuilder setName(java.lang.String); - method public android.app.AssistAction.ThingBuilder setType(java.lang.String); - method public android.app.AssistAction.ThingBuilder setUrl(android.net.Uri); - } - public class AssistContent implements android.os.Parcelable { ctor public AssistContent(); method public int describeContents(); @@ -5240,17 +5197,31 @@ package android.app { method public void cancel(java.lang.String, int); method public void cancelAll(); method public android.service.notification.StatusBarNotification[] getActiveNotifications(); - method public android.app.NotificationManager.Policy getNotificationPolicy(android.app.NotificationManager.Policy.Token); - method public boolean isNotificationPolicyTokenValid(android.app.NotificationManager.Policy.Token); + method public final int getCurrentInterruptionFilter(); + method public android.app.NotificationManager.Policy getNotificationPolicy(); + method public boolean isNotificationPolicyAccessGranted(); method public void notify(int, android.app.Notification); method public void notify(java.lang.String, int, android.app.Notification); - method public void requestNotificationPolicyToken(android.app.NotificationManager.Policy.Token.RequestCallback, android.os.Handler); - method public void setNotificationPolicy(android.app.NotificationManager.Policy.Token, android.app.NotificationManager.Policy); + method public void requestPolicyAccess(android.app.NotificationManager.NotificationPolicyAccessRequestCallback, android.os.Handler); + method public final void setInterruptionFilter(int); + method public void setNotificationPolicy(android.app.NotificationManager.Policy); + field public static final java.lang.String ACTION_INTERRUPTION_FILTER_CHANGED = "android.app.action.INTERRUPTION_FILTER_CHANGED"; field public static final java.lang.String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; + field public static final int INTERRUPTION_FILTER_ALARMS = 4; // 0x4 + field public static final int INTERRUPTION_FILTER_ALL = 1; // 0x1 + field public static final int INTERRUPTION_FILTER_NONE = 3; // 0x3 + field public static final int INTERRUPTION_FILTER_PRIORITY = 2; // 0x2 + field public static final int INTERRUPTION_FILTER_UNKNOWN = 0; // 0x0 + } + + public static abstract class NotificationManager.NotificationPolicyAccessRequestCallback { + ctor public NotificationManager.NotificationPolicyAccessRequestCallback(); + method public abstract void onAccessDenied(); + method public abstract void onAccessGranted(); } public static class NotificationManager.Policy implements android.os.Parcelable { - ctor public NotificationManager.Policy(int, int); + ctor public NotificationManager.Policy(int, int, int); method public int describeContents(); method public static java.lang.String priorityCategoriesToString(int); method public static java.lang.String prioritySendersToString(int); @@ -5264,20 +5235,9 @@ package android.app { field public static final int PRIORITY_SENDERS_ANY = 0; // 0x0 field public static final int PRIORITY_SENDERS_CONTACTS = 1; // 0x1 field public static final int PRIORITY_SENDERS_STARRED = 2; // 0x2 + field public final int priorityCallSenders; field public final int priorityCategories; - field public final int prioritySenders; - } - - public static class NotificationManager.Policy.Token implements android.os.Parcelable { - method public int describeContents(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.app.NotificationManager.Policy.Token> CREATOR; - } - - public static abstract class NotificationManager.Policy.Token.RequestCallback { - ctor public NotificationManager.Policy.Token.RequestCallback(); - method public abstract void onTokenDenied(); - method public abstract void onTokenGranted(android.app.NotificationManager.Policy.Token); + field public final int priorityMessageSenders; } public final class PendingIntent implements android.os.Parcelable { @@ -5794,9 +5754,6 @@ package android.app.admin { } public class DeviceInitializerStatus { - method public static boolean isCustomStatus(int); - method public static boolean isErrorStatus(int); - method public static boolean isHighPriority(int); field public static final int FLAG_STATUS_CUSTOM = 33554432; // 0x2000000 field public static final int FLAG_STATUS_ERROR = 16777216; // 0x1000000 field public static final int FLAG_STATUS_HIGH_PRIORITY = 134217728; // 0x8000000 @@ -5808,9 +5765,9 @@ package android.app.admin { field public static final int STATUS_ERROR_INSTALL_PACKAGE = 16777240; // 0x1000018 field public static final int STATUS_ERROR_RESET_PROTECTION_BLOCKING_PROVISIONING = 16777238; // 0x1000016 field public static final int STATUS_ERROR_SET_DEVICE_POLICY = 16777241; // 0x1000019 - field public static final int STATUS_STATE_CONNECT_BLUETOOTH_PROXY = 134217736; // 0x8000008 + field public static final int STATUS_STATE_CONNECTING_BLUETOOTH_PROXY = 134217736; // 0x8000008 field public static final int STATUS_STATE_DEVICE_PROVISIONED = 134217738; // 0x800000a - field public static final int STATUS_STATE_DISCONNECT_BLUETOOTH_PROXY = 134217737; // 0x8000009 + field public static final int STATUS_STATE_DISCONNECTING_BLUETOOTH_PROXY = 134217737; // 0x8000009 } public class DevicePolicyManager { @@ -5946,7 +5903,6 @@ package android.app.admin { field public static final java.lang.String ACTION_SET_PROFILE_OWNER = "android.app.action.SET_PROFILE_OWNER"; field public static final java.lang.String ACTION_START_ENCRYPTION = "android.app.action.START_ENCRYPTION"; field public static final java.lang.String ACTION_SYSTEM_UPDATE_POLICY_CHANGED = "android.app.action.SYSTEM_UPDATE_POLICY_CHANGED"; - field public static final int DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2 field public static final int ENCRYPTION_STATUS_ACTIVATING = 2; // 0x2 field public static final int ENCRYPTION_STATUS_ACTIVE = 3; // 0x3 field public static final int ENCRYPTION_STATUS_ACTIVE_DEFAULT_KEY = 4; // 0x4 @@ -6014,6 +5970,7 @@ package android.app.admin { field public static final int PERMISSION_POLICY_AUTO_DENY = 2; // 0x2 field public static final int PERMISSION_POLICY_AUTO_GRANT = 1; // 0x1 field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0 + field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2 field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1 field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1 field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2 @@ -6353,7 +6310,7 @@ package android.app.usage { } public final class UsageStatsManager { - method public boolean isAppIdle(java.lang.String); + method public boolean isAppInactive(java.lang.String); method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long); method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long); method public android.app.usage.UsageEvents queryEvents(long, long); @@ -7981,7 +7938,6 @@ package android.content { field public static final java.lang.String ALARM_SERVICE = "alarm"; field public static final java.lang.String APPWIDGET_SERVICE = "appwidget"; field public static final java.lang.String APP_OPS_SERVICE = "appops"; - field public static final java.lang.String AUDIO_DEVICES_SERVICE = "audio_devices_manager"; field public static final java.lang.String AUDIO_SERVICE = "audio"; field public static final java.lang.String BACKUP_SERVICE = "backup"; field public static final java.lang.String BATTERY_SERVICE = "batterymanager"; @@ -8523,7 +8479,6 @@ package android.content { field public static final java.lang.String EXTRA_CHANGED_PACKAGE_LIST = "android.intent.extra.changed_package_list"; field public static final java.lang.String EXTRA_CHANGED_UID_LIST = "android.intent.extra.changed_uid_list"; field public static final java.lang.String EXTRA_CHOOSER_REFINEMENT_INTENT_SENDER = "android.intent.extra.CHOOSER_REFINEMENT_INTENT_SENDER"; - field public static final java.lang.String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS"; field public static final java.lang.String EXTRA_CHOSEN_COMPONENT = "android.intent.extra.CHOSEN_COMPONENT"; field public static final java.lang.String EXTRA_CHOSEN_COMPONENT_INTENT_SENDER = "android.intent.extra.CHOSEN_COMPONENT_INTENT_SENDER"; field public static final java.lang.String EXTRA_DATA_REMOVED = "android.intent.extra.DATA_REMOVED"; @@ -9603,6 +9558,7 @@ package android.content.pm { field public static final java.lang.String FEATURE_APP_WIDGETS = "android.software.app_widgets"; field public static final java.lang.String FEATURE_AUDIO_LOW_LATENCY = "android.hardware.audio.low_latency"; field public static final java.lang.String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; + field public static final java.lang.String FEATURE_AUDIO_PRO = "android.hardware.audio.pro"; field public static final java.lang.String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive"; field public static final java.lang.String FEATURE_BACKUP = "android.software.backup"; field public static final java.lang.String FEATURE_BLUETOOTH = "android.hardware.bluetooth"; @@ -15928,12 +15884,12 @@ package android.media { method public android.media.AudioAttributes.Builder setUsage(int); } - public class AudioDeviceInfo { - method public java.lang.String getAddress(); + public final class AudioDeviceInfo { method public int[] getChannelCounts(); method public int[] getChannelMasks(); method public int[] getFormats(); - method public java.lang.String getName(); + method public int getId(); + method public java.lang.CharSequence getName(); method public int[] getSampleRates(); method public int getType(); method public boolean isSink(); @@ -15960,15 +15916,6 @@ package android.media { field public static final int TYPE_WIRED_HEADSET = 3; // 0x3 } - public class AudioDevicesManager { - method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler); - method public android.media.AudioDeviceInfo[] listDevices(int); - method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener); - field public static final int LIST_DEVICES_ALL = 3; // 0x3 - field public static final int LIST_DEVICES_INPUTS = 1; // 0x1 - field public static final int LIST_DEVICES_OUTPUTS = 2; // 0x2 - } - public final class AudioFocusInfo implements android.os.Parcelable { method public int describeContents(); method public android.media.AudioAttributes getAttributes(); @@ -16052,11 +15999,13 @@ package android.media { public class AudioManager { method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener); method public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes); + method public void addOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener, android.os.Handler); method public void adjustStreamVolume(int, int, int); method public void adjustSuggestedStreamVolume(int, int, int); method public void adjustVolume(int, int); method public void dispatchMediaKeyEvent(android.view.KeyEvent); method public int generateAudioSessionId(); + method public android.media.AudioDeviceInfo[] getDevices(int); method public int getMode(); method public java.lang.String getParameters(java.lang.String); method public java.lang.String getProperty(java.lang.String); @@ -16083,6 +16032,7 @@ package android.media { method public deprecated void registerMediaButtonEventReceiver(android.app.PendingIntent); method public deprecated void registerRemoteControlClient(android.media.RemoteControlClient); method public deprecated boolean registerRemoteController(android.media.RemoteController); + method public void removeOnAudioDeviceConnectionListener(android.media.OnAudioDeviceConnectionListener); method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int); method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException; method public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException; @@ -16157,6 +16107,9 @@ package android.media { field public static final int FX_KEYPRESS_SPACEBAR = 6; // 0x6 field public static final int FX_KEYPRESS_STANDARD = 5; // 0x5 field public static final int FX_KEY_CLICK = 0; // 0x0 + field public static final int GET_DEVICES_ALL = 3; // 0x3 + field public static final int GET_DEVICES_INPUTS = 1; // 0x1 + field public static final int GET_DEVICES_OUTPUTS = 2; // 0x2 field public static final int MODE_CURRENT = -1; // 0xffffffff field public static final int MODE_INVALID = -2; // 0xfffffffe field public static final int MODE_IN_CALL = 2; // 0x2 @@ -16206,7 +16159,7 @@ package android.media { public class AudioRecord { ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioRecord(android.media.AudioAttributes, android.media.AudioFormat, int, int) throws java.lang.IllegalArgumentException; - method public void addOnAudioRecordRoutingListener(android.media.OnAudioRecordRoutingListener, android.os.Handler); + method public void addOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener, android.os.Handler); method public int getAudioFormat(); method public int getAudioSessionId(); method public int getAudioSource(); @@ -16217,7 +16170,7 @@ package android.media { method public int getNativeFrameCount() throws java.lang.IllegalStateException; method public int getNotificationMarkerPosition(); method public int getPositionNotificationPeriod(); - method public android.media.AudioDeviceInfo getPreferredInputDevice(); + method public android.media.AudioDeviceInfo getPreferredDevice(); method public int getRecordingState(); method public android.media.AudioDeviceInfo getRoutedDevice(); method public int getSampleRate(); @@ -16230,10 +16183,10 @@ package android.media { method public int read(java.nio.ByteBuffer, int); method public int read(java.nio.ByteBuffer, int, int); method public void release(); - method public void removeOnAudioRecordRoutingListener(android.media.OnAudioRecordRoutingListener); + method public void removeOnRoutingChangedListener(android.media.AudioRecord.OnRoutingChangedListener); method public int setNotificationMarkerPosition(int); method public int setPositionNotificationPeriod(int); - method public boolean setPreferredInputDevice(android.media.AudioDeviceInfo); + method public boolean setPreferredDevice(android.media.AudioDeviceInfo); method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener); method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener, android.os.Handler); method public void startRecording() throws java.lang.IllegalStateException; @@ -16256,8 +16209,8 @@ package android.media { method public android.media.AudioRecord build() throws java.lang.UnsupportedOperationException; method public android.media.AudioRecord.Builder setAudioAttributes(android.media.AudioAttributes) throws java.lang.IllegalArgumentException; method public android.media.AudioRecord.Builder setAudioFormat(android.media.AudioFormat) throws java.lang.IllegalArgumentException; + method public android.media.AudioRecord.Builder setAudioSource(int) throws java.lang.IllegalArgumentException; method public android.media.AudioRecord.Builder setBufferSizeInBytes(int) throws java.lang.IllegalArgumentException; - method public android.media.AudioRecord.Builder setCapturePreset(int) throws java.lang.IllegalArgumentException; method public android.media.AudioRecord.Builder setSessionId(int) throws java.lang.IllegalArgumentException; } @@ -16266,6 +16219,10 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioRecord); } + public static abstract interface AudioRecord.OnRoutingChangedListener { + method public abstract void onRoutingChanged(android.media.AudioRecord); + } + public final class AudioTimestamp { ctor public AudioTimestamp(); field public long framePosition; @@ -16276,7 +16233,7 @@ package android.media { ctor public AudioTrack(int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(int, int, int, int, int, int, int) throws java.lang.IllegalArgumentException; ctor public AudioTrack(android.media.AudioAttributes, android.media.AudioFormat, int, int, int) throws java.lang.IllegalArgumentException; - method public void addOnAudioTrackRoutingListener(android.media.OnAudioTrackRoutingListener, android.os.Handler); + method public void addOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener, android.os.Handler); method public int attachAuxEffect(int); method public void flush(); method public int getAudioFormat(); @@ -16292,10 +16249,10 @@ package android.media { method public int getNotificationMarkerPosition(); method public int getPlayState(); method public int getPlaybackHeadPosition(); + method public android.media.PlaybackParams getPlaybackParams(); method public int getPlaybackRate(); - method public android.media.PlaybackSettings getPlaybackSettings(); method public int getPositionNotificationPeriod(); - method public android.media.AudioDeviceInfo getPreferredOutputDevice(); + method public android.media.AudioDeviceInfo getPreferredDevice(); method public android.media.AudioDeviceInfo getRoutedDevice(); method public int getSampleRate(); method public int getState(); @@ -16305,17 +16262,17 @@ package android.media { method public void play() throws java.lang.IllegalStateException; method public void release(); method public int reloadStaticData(); - method public void removeOnAudioTrackRoutingListener(android.media.OnAudioTrackRoutingListener); + method public void removeOnRoutingChangedListener(android.media.AudioTrack.OnRoutingChangedListener); method public int setAuxEffectSendLevel(float); method public int setLoopPoints(int, int, int); method public int setNotificationMarkerPosition(int); method public int setPlaybackHeadPosition(int); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener); method public void setPlaybackPositionUpdateListener(android.media.AudioTrack.OnPlaybackPositionUpdateListener, android.os.Handler); method public int setPlaybackRate(int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public int setPositionNotificationPeriod(int); - method public boolean setPreferredOutputDevice(android.media.AudioDeviceInfo); + method public boolean setPreferredDevice(android.media.AudioDeviceInfo); method protected deprecated void setState(int); method public deprecated int setStereoVolume(float, float); method public int setVolume(float); @@ -16358,6 +16315,10 @@ package android.media { method public abstract void onPeriodicNotification(android.media.AudioTrack); } + public static abstract interface AudioTrack.OnRoutingChangedListener { + method public abstract void onRoutingChanged(android.media.AudioTrack); + } + public class CamcorderProfile { method public static android.media.CamcorderProfile get(int); method public static android.media.CamcorderProfile get(int, int); @@ -16639,11 +16600,11 @@ package android.media { public static final class MediaCodec.CodecException extends java.lang.IllegalStateException { method public java.lang.String getDiagnosticInfo(); - method public int getReason(); + method public int getErrorCode(); method public boolean isRecoverable(); method public boolean isTransient(); - field public static final int REASON_HARDWARE = 0; // 0x0 - field public static final int REASON_RECLAIMED = 1; // 0x1 + field public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; // 0x44c + field public static final int ERROR_RECLAIMED = 1101; // 0x44d } public static final class MediaCodec.CryptoException extends java.lang.RuntimeException { @@ -17314,9 +17275,9 @@ package android.media { method public int getAudioSessionId(); method public int getCurrentPosition(); method public int getDuration(); - method public android.media.PlaybackSettings getPlaybackSettings(); + method public android.media.PlaybackParams getPlaybackParams(); method public int getSelectedTrack(int) throws java.lang.IllegalStateException; - method public android.media.SyncSettings getSyncSettings(); + method public android.media.SyncParams getSyncParams(); method public android.media.MediaTimestamp getTimestamp(); method public android.media.MediaPlayer.TrackInfo[] getTrackInfo() throws java.lang.IllegalStateException; method public int getVideoHeight(); @@ -17352,11 +17313,11 @@ package android.media { method public void setOnTimedMetaDataListener(android.media.MediaPlayer.OnTimedMetaDataListener); method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener); method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackRate(float, int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public void setScreenOnWhilePlaying(boolean); method public void setSurface(android.view.Surface); - method public void setSyncSettings(android.media.SyncSettings); + method public void setSyncParams(android.media.SyncParams); method public void setVideoScalingMode(int); method public void setVolume(float, float); method public void setWakeMode(android.content.Context, int); @@ -17677,18 +17638,18 @@ package android.media { ctor public MediaSync(); method public final android.view.Surface createInputSurface(); method public void flush(); - method public android.media.PlaybackSettings getPlaybackSettings(); - method public android.media.SyncSettings getSyncSettings(); + method public android.media.PlaybackParams getPlaybackParams(); + method public android.media.SyncParams getSyncParams(); method public android.media.MediaTimestamp getTimestamp(); - method public void queueAudio(java.nio.ByteBuffer, int, int, long); + method public void queueAudio(java.nio.ByteBuffer, int, long); method public final void release(); method public void setAudioTrack(android.media.AudioTrack); method public void setCallback(android.media.MediaSync.Callback, android.os.Handler); method public void setOnErrorListener(android.media.MediaSync.OnErrorListener, android.os.Handler); + method public void setPlaybackParams(android.media.PlaybackParams); method public void setPlaybackRate(float, int); - method public void setPlaybackSettings(android.media.PlaybackSettings); method public void setSurface(android.view.Surface); - method public void setSyncSettings(android.media.SyncSettings); + method public void setSyncParams(android.media.SyncParams); field public static final int MEDIASYNC_ERROR_AUDIOTRACK_FAIL = 1; // 0x1 field public static final int MEDIASYNC_ERROR_SURFACE_FAIL = 2; // 0x2 field public static final int PLAYBACK_RATE_AUDIO_MODE_DEFAULT = 0; // 0x0 @@ -17728,23 +17689,15 @@ package android.media { method public abstract void onAudioDeviceConnection(); } - public abstract interface OnAudioRecordRoutingListener { - method public abstract void onAudioRecordRouting(android.media.AudioRecord); - } - - public abstract interface OnAudioTrackRoutingListener { - method public abstract void onAudioTrackRouting(android.media.AudioTrack); - } - - public final class PlaybackSettings { - ctor public PlaybackSettings(); - method public android.media.PlaybackSettings allowDefaults(); + public final class PlaybackParams { + ctor public PlaybackParams(); + method public android.media.PlaybackParams allowDefaults(); method public int getAudioFallbackMode(); method public float getPitch(); method public float getSpeed(); - method public android.media.PlaybackSettings setAudioFallbackMode(int); - method public android.media.PlaybackSettings setPitch(float); - method public android.media.PlaybackSettings setSpeed(float); + method public android.media.PlaybackParams setAudioFallbackMode(int); + method public android.media.PlaybackParams setPitch(float); + method public android.media.PlaybackParams setSpeed(float); field public static final int AUDIO_FALLBACK_MODE_DEFAULT = 0; // 0x0 field public static final int AUDIO_FALLBACK_MODE_FAIL = 2; // 0x2 field public static final int AUDIO_FALLBACK_MODE_MUTE = 1; // 0x1 @@ -17935,17 +17888,17 @@ package android.media { method public abstract void onLoadComplete(android.media.SoundPool, int, int); } - public final class SyncSettings { - ctor public SyncSettings(); - method public android.media.SyncSettings allowDefaults(); + public final class SyncParams { + ctor public SyncParams(); + method public android.media.SyncParams allowDefaults(); method public int getAudioAdjustMode(); method public float getFrameRate(); method public int getSyncSource(); method public float getTolerance(); - method public android.media.SyncSettings setAudioAdjustMode(int); - method public android.media.SyncSettings setFrameRate(float); - method public android.media.SyncSettings setSyncSource(int); - method public android.media.SyncSettings setTolerance(float); + method public android.media.SyncParams setAudioAdjustMode(int); + method public android.media.SyncParams setFrameRate(float); + method public android.media.SyncParams setSyncSource(int); + method public android.media.SyncParams setTolerance(float); field public static final int AUDIO_ADJUST_MODE_DEFAULT = 0; // 0x0 field public static final int AUDIO_ADJUST_MODE_RESAMPLE = 2; // 0x2 field public static final int AUDIO_ADJUST_MODE_STRETCH = 1; // 0x1 @@ -18722,248 +18675,11 @@ package android.media.projection { } -package android.media.routing { - - public final class MediaRouteSelector implements android.os.Parcelable { - method public boolean containsProtocol(java.lang.Class<?>); - method public boolean containsProtocol(java.lang.String); - method public int describeContents(); - method public android.os.Bundle getExtras(); - method public int getOptionalFeatures(); - method public java.util.List<java.lang.String> getOptionalProtocols(); - method public int getRequiredFeatures(); - method public java.util.List<java.lang.String> getRequiredProtocols(); - method public java.lang.String getServicePackageName(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.media.routing.MediaRouteSelector> CREATOR; - } - - public static final class MediaRouteSelector.Builder { - ctor public MediaRouteSelector.Builder(); - method public android.media.routing.MediaRouteSelector.Builder addOptionalProtocol(java.lang.Class<?>); - method public android.media.routing.MediaRouteSelector.Builder addOptionalProtocol(java.lang.String); - method public android.media.routing.MediaRouteSelector.Builder addRequiredProtocol(java.lang.Class<?>); - method public android.media.routing.MediaRouteSelector.Builder addRequiredProtocol(java.lang.String); - method public android.media.routing.MediaRouteSelector build(); - method public android.media.routing.MediaRouteSelector.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouteSelector.Builder setOptionalFeatures(int); - method public android.media.routing.MediaRouteSelector.Builder setRequiredFeatures(int); - method public android.media.routing.MediaRouteSelector.Builder setServicePackageName(java.lang.String); - } - - public abstract class MediaRouteService extends android.app.Service { - ctor public MediaRouteService(); - method public android.media.routing.MediaRouter.ServiceMetadata getServiceMetadata(); - method public android.os.IBinder onBind(android.content.Intent); - method public abstract android.media.routing.MediaRouteService.ClientSession onCreateClientSession(android.media.routing.MediaRouteService.ClientInfo); - field public static final java.lang.String SERVICE_INTERFACE = "android.media.routing.MediaRouteService"; - } - - public static final class MediaRouteService.ClientInfo { - method public java.lang.String getPackageName(); - method public int getUid(); - } - - public static abstract class MediaRouteService.ClientSession { - ctor public MediaRouteService.ClientSession(); - method public abstract boolean onConnect(android.media.routing.MediaRouter.ConnectionRequest, android.media.routing.MediaRouteService.ConnectionCallback); - method public abstract void onDisconnect(); - method public void onPauseStream(); - method public void onRelease(); - method public void onResumeStream(); - method public abstract boolean onStartDiscovery(android.media.routing.MediaRouter.DiscoveryRequest, android.media.routing.MediaRouteService.DiscoveryCallback); - method public abstract void onStopDiscovery(); - } - - public final class MediaRouteService.ConnectionCallback { - method public void onConnected(android.media.routing.MediaRouter.ConnectionInfo); - method public void onConnectionFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onDisconnected(); - } - - public final class MediaRouteService.DiscoveryCallback { - method public void onDestinationFound(android.media.routing.MediaRouter.DestinationInfo, java.util.List<android.media.routing.MediaRouter.RouteInfo>); - method public void onDestinationLost(android.media.routing.MediaRouter.DestinationInfo); - method public void onDiscoveryFailed(int, java.lang.CharSequence, android.os.Bundle); - } - - public final class MediaRouter { - ctor public MediaRouter(android.content.Context); - method public void addSelector(android.media.routing.MediaRouteSelector); - method public void clearSelectors(); - method public android.media.routing.MediaRouter.Delegate createDelegate(); - method public android.media.routing.MediaRouter.ConnectionInfo getConnection(); - method public int getConnectionState(); - method public java.util.List<android.media.routing.MediaRouter.DestinationInfo> getDiscoveredDestinations(); - method public java.util.List<android.media.routing.MediaRouter.RouteInfo> getDiscoveredRoutes(android.media.routing.MediaRouter.DestinationInfo); - method public int getDiscoveryState(); - method public android.media.AudioAttributes getPreferredAudioAttributes(); - method public android.view.Display getPreferredPresentationDisplay(); - method public android.media.VolumeProvider getPreferredVolumeProvider(); - method public android.media.routing.MediaRouter.DestinationInfo getSelectedDestination(); - method public android.media.routing.MediaRouter.RouteInfo getSelectedRoute(); - method public java.util.List<android.media.routing.MediaRouteSelector> getSelectors(); - method public boolean isReleased(); - method public void pauseStream(); - method public void release(); - method public void removeSelector(android.media.routing.MediaRouteSelector); - method public void resumeStream(); - method public void setRoutingCallback(android.media.routing.MediaRouter.RoutingCallback, android.os.Handler); - field public static final int CONNECTION_ERROR_ABORTED = 1; // 0x1 - field public static final int CONNECTION_ERROR_BARGED = 7; // 0x7 - field public static final int CONNECTION_ERROR_BROKEN = 6; // 0x6 - field public static final int CONNECTION_ERROR_BUSY = 4; // 0x4 - field public static final int CONNECTION_ERROR_TIMEOUT = 5; // 0x5 - field public static final int CONNECTION_ERROR_UNAUTHORIZED = 2; // 0x2 - field public static final int CONNECTION_ERROR_UNKNOWN = 0; // 0x0 - field public static final int CONNECTION_ERROR_UNREACHABLE = 3; // 0x3 - field public static final int CONNECTION_FLAG_BARGE = 1; // 0x1 - field public static final int CONNECTION_STATE_CONNECTED = 2; // 0x2 - field public static final int CONNECTION_STATE_CONNECTING = 1; // 0x1 - field public static final int CONNECTION_STATE_DISCONNECTED = 0; // 0x0 - field public static final int DISCONNECTION_REASON_APPLICATION_REQUEST = 0; // 0x0 - field public static final int DISCONNECTION_REASON_ERROR = 2; // 0x2 - field public static final int DISCONNECTION_REASON_USER_REQUEST = 1; // 0x1 - field public static final int DISCOVERY_ERROR_ABORTED = 1; // 0x1 - field public static final int DISCOVERY_ERROR_NO_CONNECTIVITY = 2; // 0x2 - field public static final int DISCOVERY_ERROR_UNKNOWN = 0; // 0x0 - field public static final int DISCOVERY_FLAG_BACKGROUND = 1; // 0x1 - field public static final int DISCOVERY_STATE_STARTED = 1; // 0x1 - field public static final int DISCOVERY_STATE_STOPPED = 0; // 0x0 - field public static final int ROUTE_FEATURE_LIVE_AUDIO = 1; // 0x1 - field public static final int ROUTE_FEATURE_LIVE_VIDEO = 2; // 0x2 - } - - public static final class MediaRouter.ConnectionInfo { - method public android.media.AudioAttributes getAudioAttributes(); - method public android.os.Bundle getExtras(); - method public int getFeatures(); - method public android.view.Display getPresentationDisplay(); - method public android.os.IBinder getProtocolBinder(java.lang.String); - method public android.os.IBinder getProtocolBinder(int); - method public T getProtocolObject(java.lang.Class<T>); - method public java.util.List<java.lang.String> getProtocols(); - method public android.media.routing.MediaRouter.RouteInfo getRoute(); - method public android.media.VolumeProvider getVolumeProvider(); - } - - public static final class MediaRouter.ConnectionInfo.Builder { - ctor public MediaRouter.ConnectionInfo.Builder(android.media.routing.MediaRouter.RouteInfo); - method public android.media.routing.MediaRouter.ConnectionInfo build(); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setAudioAttributes(android.media.AudioAttributes); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setPresentationDisplay(android.view.Display); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setProtocolBinder(java.lang.String, android.os.IBinder); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setProtocolStub(java.lang.Class<?>, android.os.IInterface); - method public android.media.routing.MediaRouter.ConnectionInfo.Builder setVolumeProvider(android.media.VolumeProvider); - } - - public static final class MediaRouter.ConnectionRequest { - method public android.os.Bundle getExtras(); - method public int getFlags(); - method public android.media.routing.MediaRouter.RouteInfo getRoute(); - method public void setExtras(android.os.Bundle); - method public void setFlags(int); - method public void setRoute(android.media.routing.MediaRouter.RouteInfo); - } - - public static final class MediaRouter.Delegate { - ctor public MediaRouter.Delegate(); - method public void addStateCallback(android.media.routing.MediaRouter.StateCallback, android.os.Handler); - method public void connect(android.media.routing.MediaRouter.DestinationInfo, int); - method public void disconnect(int); - method public int getConnectionState(); - method public java.util.List<android.media.routing.MediaRouter.DestinationInfo> getDiscoveredDestinations(); - method public int getDiscoveryState(); - method public android.media.routing.MediaRouter.DestinationInfo getSelectedDestination(); - method public boolean isReleased(); - method public void removeStateCallback(android.media.routing.MediaRouter.StateCallback); - method public void startDiscovery(int); - method public void stopDiscovery(); - } - - public static final class MediaRouter.DestinationInfo { - method public java.lang.CharSequence getDescription(); - method public android.os.Bundle getExtras(); - method public int getIconResourceId(); - method public java.lang.String getId(); - method public java.lang.CharSequence getName(); - method public android.media.routing.MediaRouter.ServiceMetadata getServiceMetadata(); - method public android.graphics.drawable.Drawable loadIcon(android.content.pm.PackageManager); - } - - public static final class MediaRouter.DestinationInfo.Builder { - ctor public MediaRouter.DestinationInfo.Builder(java.lang.String, android.media.routing.MediaRouter.ServiceMetadata, java.lang.CharSequence); - method public android.media.routing.MediaRouter.DestinationInfo build(); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setDescription(java.lang.CharSequence); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.DestinationInfo.Builder setIconResourceId(int); - } - - public static final class MediaRouter.DiscoveryRequest { - method public int getFlags(); - method public java.util.List<android.media.routing.MediaRouteSelector> getSelectors(); - method public void setFlags(int); - method public void setSelectors(java.util.List<android.media.routing.MediaRouteSelector>); - } - - public static final class MediaRouter.RouteInfo { - method public android.media.routing.MediaRouter.DestinationInfo getDestination(); - method public android.os.Bundle getExtras(); - method public int getFeatures(); - method public java.lang.String getId(); - method public java.util.List<java.lang.String> getProtocols(); - method public android.media.routing.MediaRouteSelector getSelector(); - } - - public static final class MediaRouter.RouteInfo.Builder { - ctor public MediaRouter.RouteInfo.Builder(java.lang.String, android.media.routing.MediaRouter.DestinationInfo, android.media.routing.MediaRouteSelector); - method public android.media.routing.MediaRouter.RouteInfo.Builder addProtocol(java.lang.Class<T>); - method public android.media.routing.MediaRouter.RouteInfo.Builder addProtocol(java.lang.String); - method public android.media.routing.MediaRouter.RouteInfo build(); - method public android.media.routing.MediaRouter.RouteInfo.Builder setExtras(android.os.Bundle); - method public android.media.routing.MediaRouter.RouteInfo.Builder setFeatures(int); - } - - public static abstract class MediaRouter.RoutingCallback extends android.media.routing.MediaRouter.StateCallback { - ctor public MediaRouter.RoutingCallback(); - method public boolean onPrepareConnectionRequest(android.media.routing.MediaRouter.ConnectionRequest, android.media.routing.MediaRouter.DestinationInfo, java.util.List<android.media.routing.MediaRouter.RouteInfo>); - method public boolean onPrepareDiscoveryRequest(android.media.routing.MediaRouter.DiscoveryRequest, java.util.List<android.media.routing.MediaRouteSelector>); - } - - public static final class MediaRouter.ServiceMetadata { - method public android.content.ComponentName getComponentName(); - method public android.graphics.drawable.Drawable getIcon(android.content.pm.PackageManager); - method public java.lang.CharSequence getLabel(android.content.pm.PackageManager); - method public java.lang.String getPackageName(); - method public android.content.pm.ServiceInfo getService(); - } - - public static abstract class MediaRouter.StateCallback { - ctor public MediaRouter.StateCallback(); - method public void onConnected(); - method public void onConnecting(); - method public void onConnectionFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onConnectionStateChanged(int); - method public void onDestinationFound(android.media.routing.MediaRouter.DestinationInfo); - method public void onDestinationLost(android.media.routing.MediaRouter.DestinationInfo); - method public void onDisconnected(); - method public void onDiscoveryFailed(int, java.lang.CharSequence, android.os.Bundle); - method public void onDiscoveryStarted(); - method public void onDiscoveryStateChanged(int); - method public void onDiscoveryStopped(); - method public void onReleased(); - method public void onSelectedDestinationChanged(android.media.routing.MediaRouter.DestinationInfo); - } - -} - package android.media.session { public final class MediaController { ctor public MediaController(android.content.Context, android.media.session.MediaSession.Token); method public void adjustVolume(int, int); - method public android.media.routing.MediaRouter.Delegate createMediaRouterDelegate(); method public boolean dispatchMediaButtonEvent(android.view.KeyEvent); method public android.os.Bundle getExtras(); method public long getFlags(); @@ -19037,7 +18753,6 @@ package android.media.session { method public void setExtras(android.os.Bundle); method public void setFlags(int); method public void setMediaButtonReceiver(android.app.PendingIntent); - method public void setMediaRouter(android.media.routing.MediaRouter); method public void setMetadata(android.media.MediaMetadata); method public void setPlaybackState(android.media.session.PlaybackState); method public void setPlaybackToLocal(android.media.AudioAttributes); @@ -24807,6 +24522,7 @@ package android.os { ctor public Build.VERSION(); field public static final java.lang.String CODENAME; field public static final java.lang.String INCREMENTAL; + field public static final int PREVIEW_SDK_INT; field public static final java.lang.String RELEASE; field public static final deprecated java.lang.String SDK; field public static final int SDK_INT; @@ -25783,7 +25499,7 @@ package android.os { method public boolean isUserAGoat(); method public boolean isUserRunning(android.os.UserHandle); method public boolean isUserRunningOrStopping(android.os.UserHandle); - method public boolean setRestrictionsChallenge(java.lang.String); + method public deprecated boolean setRestrictionsChallenge(java.lang.String); method public deprecated void setUserRestriction(java.lang.String, boolean); method public deprecated void setUserRestrictions(android.os.Bundle); method public deprecated void setUserRestrictions(android.os.Bundle, android.os.UserHandle); @@ -28798,6 +28514,7 @@ package android.provider { field public static final java.lang.String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS"; field public static final java.lang.String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS"; field public static final java.lang.String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS"; + field public static final java.lang.String ACTION_ZEN_ACCESS_SETTINGS = "android.settings.ZEN_ACCESS_SETTINGS"; field public static final java.lang.String AUTHORITY = "settings"; field public static final java.lang.String EXTRA_ACCOUNT_TYPES = "account_types"; field public static final java.lang.String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled"; @@ -29529,7 +29246,6 @@ package android.renderscript { method public void copyTo(short[]); method public void copyTo(int[]); method public void copyTo(float[]); - method public void copyToFieldPacker(int, int, int, int, android.renderscript.FieldPacker); method public static android.renderscript.Allocation createCubemapFromBitmap(android.renderscript.RenderScript, android.graphics.Bitmap, android.renderscript.Allocation.MipmapControl, int); method public static android.renderscript.Allocation createCubemapFromBitmap(android.renderscript.RenderScript, android.graphics.Bitmap); method public static android.renderscript.Allocation createCubemapFromCubeFaces(android.renderscript.RenderScript, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.graphics.Bitmap, android.renderscript.Allocation.MipmapControl, int); @@ -30684,7 +30400,7 @@ package android.security { method public android.security.KeyGeneratorSpec.Builder setAlias(java.lang.String); method public android.security.KeyGeneratorSpec.Builder setBlockModes(java.lang.String...); method public android.security.KeyGeneratorSpec.Builder setEncryptionPaddings(java.lang.String...); - method public android.security.KeyGeneratorSpec.Builder setEncryptionRequired(boolean); + method public android.security.KeyGeneratorSpec.Builder setEncryptionRequired(); method public android.security.KeyGeneratorSpec.Builder setKeySize(int); method public android.security.KeyGeneratorSpec.Builder setKeyValidityEnd(java.util.Date); method public android.security.KeyGeneratorSpec.Builder setKeyValidityForConsumptionEnd(java.util.Date); @@ -30761,6 +30477,53 @@ package android.security { public abstract class KeyStoreKeyProperties { } + public static abstract class KeyStoreKeyProperties.Algorithm { + field public static final java.lang.String AES = "AES"; + field public static final java.lang.String EC = "EC"; + field public static final java.lang.String HMAC_SHA1 = "HmacSHA1"; + field public static final java.lang.String HMAC_SHA224 = "HmacSHA224"; + field public static final java.lang.String HMAC_SHA256 = "HmacSHA256"; + field public static final java.lang.String HMAC_SHA384 = "HmacSHA384"; + field public static final java.lang.String HMAC_SHA512 = "HmacSHA512"; + field public static final java.lang.String RSA = "RSA"; + } + + public static abstract class KeyStoreKeyProperties.AlgorithmEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.BlockMode { + field public static final java.lang.String CBC = "CBC"; + field public static final java.lang.String CTR = "CTR"; + field public static final java.lang.String ECB = "ECB"; + field public static final java.lang.String GCM = "GCM"; + } + + public static abstract class KeyStoreKeyProperties.BlockModeEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.Digest { + field public static final java.lang.String MD5 = "MD5"; + field public static final java.lang.String NONE = "NONE"; + field public static final java.lang.String SHA1 = "SHA-1"; + field public static final java.lang.String SHA224 = "SHA-224"; + field public static final java.lang.String SHA256 = "SHA-256"; + field public static final java.lang.String SHA384 = "SHA-384"; + field public static final java.lang.String SHA512 = "SHA-512"; + } + + public static abstract class KeyStoreKeyProperties.DigestEnum implements java.lang.annotation.Annotation { + } + + public static abstract class KeyStoreKeyProperties.EncryptionPadding { + field public static final java.lang.String NONE = "NoPadding"; + field public static final java.lang.String PKCS7 = "PKCS7Padding"; + field public static final java.lang.String RSA_OAEP = "OAEPPadding"; + field public static final java.lang.String RSA_PKCS1 = "PKCS1Padding"; + } + + public static abstract class KeyStoreKeyProperties.EncryptionPaddingEnum implements java.lang.annotation.Annotation { + } + public static abstract class KeyStoreKeyProperties.Origin { field public static final int GENERATED = 1; // 0x1 field public static final int IMPORTED = 2; // 0x2 @@ -30780,6 +30543,14 @@ package android.security { public static abstract class KeyStoreKeyProperties.PurposeEnum implements java.lang.annotation.Annotation { } + public static abstract class KeyStoreKeyProperties.SignaturePadding { + field public static final java.lang.String RSA_PKCS1 = "PKCS1"; + field public static final java.lang.String RSA_PSS = "PSS"; + } + + public static abstract class KeyStoreKeyProperties.SignaturePaddingEnum implements java.lang.annotation.Annotation { + } + public class KeyStoreKeySpec implements java.security.spec.KeySpec { method public java.lang.String[] getBlockModes(); method public java.lang.String[] getDigests(); @@ -30793,9 +30564,9 @@ package android.security { method public int getPurposes(); method public java.lang.String[] getSignaturePaddings(); method public int getUserAuthenticationValidityDurationSeconds(); - method public boolean isTeeBacked(); + method public boolean isInsideSecureHardware(); method public boolean isUserAuthenticationRequired(); - method public boolean isUserAuthenticationRequirementTeeEnforced(); + method public boolean isUserAuthenticationRequirementEnforcedBySecureHardware(); } public final class KeyStoreParameter implements java.security.KeyStore.ProtectionParameter { @@ -30927,10 +30698,8 @@ package android.service.chooser { public final class ChooserTarget implements android.os.Parcelable { ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.app.PendingIntent); ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.IntentSender); - ctor public ChooserTarget(java.lang.CharSequence, android.graphics.Bitmap, float, android.content.Intent); method public int describeContents(); method public android.graphics.Bitmap getIcon(); - method public android.content.Intent getIntent(); method public android.content.IntentSender getIntentSender(); method public float getScore(); method public java.lang.CharSequence getTitle(); @@ -31083,7 +30852,6 @@ package android.service.notification { method public final int getCurrentInterruptionFilter(); method public final int getCurrentListenerHints(); method public android.service.notification.NotificationListenerService.RankingMap getCurrentRanking(); - method public final android.app.NotificationManager.Policy.Token getNotificationPolicyToken(); method public android.os.IBinder onBind(android.content.Intent); method public void onInterruptionFilterChanged(int); method public void onListenerConnected(); @@ -32470,6 +32238,8 @@ package android.telecom { method public android.telecom.Connection getPrimaryConnection(); method public final int getState(); method public final android.telecom.StatusHints getStatusHints(); + method public android.telecom.Connection.VideoProvider getVideoProvider(); + method public int getVideoState(); method public void onAudioStateChanged(android.telecom.AudioState); method public void onConnectionAdded(android.telecom.Connection); method public void onDisconnect(); @@ -32489,6 +32259,8 @@ package android.telecom { method public final void setDisconnected(android.telecom.DisconnectCause); method public final void setOnHold(); method public final void setStatusHints(android.telecom.StatusHints); + method public final void setVideoProvider(android.telecom.Connection, android.telecom.Connection.VideoProvider); + method public final void setVideoState(android.telecom.Connection, int); field public static final long CONNECT_TIME_NOT_SPECIFIED = 0L; // 0x0L } @@ -32516,6 +32288,7 @@ package android.telecom { method public final android.telecom.Connection.VideoProvider getVideoProvider(); method public final boolean isRingbackRequested(); method public void onAbort(); + method public void onAnswer(int); method public void onAnswer(); method public void onAudioStateChanged(android.telecom.AudioState); method public void onDisconnect(); @@ -32545,7 +32318,11 @@ package android.telecom { method public final void setRingbackRequested(boolean); method public final void setRinging(); method public final void setStatusHints(android.telecom.StatusHints); + method public final void setVideoProvider(android.telecom.Connection.VideoProvider); + method public final void setVideoState(int); method public static java.lang.String stateToString(int); + field public static final int CAPABILITY_CAN_PAUSE_VIDEO = 1048576; // 0x100000 + field public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 524288; // 0x80000 field public static final int CAPABILITY_DISCONNECT_FROM_CONFERENCE = 8192; // 0x2000 field public static final int CAPABILITY_HOLD = 1; // 0x1 field public static final int CAPABILITY_MANAGE_CONFERENCE = 128; // 0x80 @@ -32553,6 +32330,12 @@ package android.telecom { field public static final int CAPABILITY_MUTE = 64; // 0x40 field public static final int CAPABILITY_RESPOND_VIA_TEXT = 32; // 0x20 field public static final int CAPABILITY_SEPARATE_FROM_CONFERENCE = 4096; // 0x1000 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL = 768; // 0x300 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_RX = 256; // 0x100 + field public static final int CAPABILITY_SUPPORTS_VT_LOCAL_TX = 512; // 0x200 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL = 3072; // 0xc00 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_RX = 1024; // 0x400 + field public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 2048; // 0x800 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 STATE_ACTIVE = 4; // 0x4 @@ -32598,10 +32381,12 @@ package android.telecom { public final class ConnectionRequest implements android.os.Parcelable { ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle); + ctor public ConnectionRequest(android.telecom.PhoneAccountHandle, android.net.Uri, android.os.Bundle, int); method public int describeContents(); method public android.telecom.PhoneAccountHandle getAccountHandle(); method public android.net.Uri getAddress(); method public android.os.Bundle getExtras(); + method public int getVideoState(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.telecom.ConnectionRequest> CREATOR; } @@ -36403,14 +36188,6 @@ package android.util { } public deprecated class FloatMath { - method public static float ceil(float); - method public static float cos(float); - method public static float exp(float); - method public static float floor(float); - method public static float hypot(float, float); - method public static float pow(float, float); - method public static float sin(float); - method public static float sqrt(float); } public final class JsonReader implements java.io.Closeable { @@ -38288,7 +38065,7 @@ package android.view { method public boolean dispatchNestedPreScroll(int, int, int[], int[]); method public boolean dispatchNestedScroll(int, int, int, int, int[]); method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); - method public void dispatchProvideAssistStructure(android.view.ViewAssistStructure); + method public void dispatchProvideStructure(android.view.ViewStructure); method protected void dispatchRestoreInstanceState(android.util.SparseArray<android.os.Parcelable>); method protected void dispatchSaveInstanceState(android.util.SparseArray<android.os.Parcelable>); method protected void dispatchSetActivated(boolean); @@ -38468,7 +38245,6 @@ package android.view { method public void invalidateOutline(); method public boolean isAccessibilityFocused(); method public boolean isActivated(); - method public boolean isAssistBlocked(); method public boolean isAttachedToWindow(); method public boolean isClickable(); method public boolean isDirty(); @@ -38550,8 +38326,8 @@ package android.view { method protected void onMeasure(int, int); method protected void onOverScrolled(int, int, boolean, boolean); method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent); - method public void onProvideAssistStructure(android.view.ViewAssistStructure); - method public void onProvideVirtualAssistStructure(android.view.ViewAssistStructure); + method public void onProvideStructure(android.view.ViewStructure); + method public void onProvideVirtualStructure(android.view.ViewStructure); method protected void onRestoreInstanceState(android.os.Parcelable); method public void onRtlPropertiesChanged(int); method protected android.os.Parcelable onSaveInstanceState(); @@ -38614,7 +38390,6 @@ package android.view { method public void setActivated(boolean); method public void setAlpha(float); method public void setAnimation(android.view.animation.Animation); - method public void setAssistBlocked(boolean); method public void setBackground(android.graphics.drawable.Drawable); method public void setBackgroundColor(int); method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable); @@ -38977,40 +38752,8 @@ package android.view { method public static android.animation.Animator createCircularReveal(android.view.View, int, int, float, float); } - public abstract class ViewAssistStructure { + public abstract deprecated class ViewAssistStructure extends android.view.ViewStructure { ctor public ViewAssistStructure(); - method public abstract void asyncCommit(); - method public abstract android.view.ViewAssistStructure asyncNewChild(int); - method public abstract void clearExtras(); - method public abstract android.os.Bundle editExtras(); - method public abstract int getChildCount(); - method public abstract java.lang.CharSequence getHint(); - method public abstract java.lang.CharSequence getText(); - method public abstract int getTextSelectionEnd(); - method public abstract int getTextSelectionStart(); - method public abstract android.view.ViewAssistStructure newChild(int); - method public abstract void setAccessibilityFocused(boolean); - method public abstract void setActivated(boolean); - method public abstract void setAssistBlocked(boolean); - method public abstract void setCheckable(boolean); - method public abstract void setChecked(boolean); - method public abstract void setChildCount(int); - method public abstract void setClassName(java.lang.String); - method public abstract void setClickable(boolean); - method public abstract void setContentDescription(java.lang.CharSequence); - method public abstract void setDimens(int, int, int, int, int, int); - method public abstract void setEnabled(boolean); - method public abstract void setFocusable(boolean); - method public abstract void setFocused(boolean); - method public abstract void setHint(java.lang.CharSequence); - method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String); - method public abstract void setLongClickable(boolean); - method public abstract void setSelected(boolean); - method public abstract void setStylusButtonPressable(boolean); - method public abstract void setText(java.lang.CharSequence); - method public abstract void setText(java.lang.CharSequence, int, int); - method public abstract void setTextPaint(android.text.TextPaint); - method public abstract void setVisibility(int); } public class ViewConfiguration { @@ -39387,6 +39130,41 @@ package android.view { method public android.view.ViewPropertyAnimator zBy(float); } + public abstract class ViewStructure { + ctor public ViewStructure(); + method public abstract void asyncCommit(); + method public abstract android.view.ViewAssistStructure asyncNewChild(int); + method public abstract int getChildCount(); + method public abstract android.os.Bundle getExtras(); + method public abstract java.lang.CharSequence getHint(); + method public abstract java.lang.CharSequence getText(); + method public abstract int getTextSelectionEnd(); + method public abstract int getTextSelectionStart(); + method public abstract boolean hasExtras(); + method public abstract android.view.ViewAssistStructure newChild(int); + method public abstract void setAccessibilityFocused(boolean); + method public abstract void setActivated(boolean); + method public abstract void setCheckable(boolean); + method public abstract void setChecked(boolean); + method public abstract void setChildCount(int); + method public abstract void setClassName(java.lang.String); + method public abstract void setClickable(boolean); + method public abstract void setContentDescription(java.lang.CharSequence); + method public abstract void setDimens(int, int, int, int, int, int); + method public abstract void setEnabled(boolean); + method public abstract void setFocusable(boolean); + method public abstract void setFocused(boolean); + method public abstract void setHint(java.lang.CharSequence); + method public abstract void setId(int, java.lang.String, java.lang.String, java.lang.String); + method public abstract void setLongClickable(boolean); + method public abstract void setSelected(boolean); + method public abstract void setStylusButtonPressable(boolean); + method public abstract void setText(java.lang.CharSequence); + method public abstract void setText(java.lang.CharSequence, int, int); + method public abstract void setTextPaint(android.text.TextPaint); + method public abstract void setVisibility(int); + } + public final class ViewStub extends android.view.View { ctor public ViewStub(android.content.Context); ctor public ViewStub(android.content.Context, int); @@ -41977,7 +41755,7 @@ package android.webkit { method public abstract boolean onKeyUp(int, android.view.KeyEvent); method public abstract void onMeasure(int, int); method public abstract void onOverScrolled(int, int, boolean, boolean); - method public abstract void onProvideVirtualAssistStructure(android.view.ViewAssistStructure); + method public abstract void onProvideVirtualAssistStructure(android.view.ViewStructure); method public abstract void onScrollChanged(int, int, int, int); method public abstract void onSizeChanged(int, int, int, int); method public abstract void onStartTemporaryDetach(); diff --git a/api/system-removed.txt b/api/system-removed.txt index 5e77e15e28eb..0046a700b72d 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -108,6 +108,21 @@ package android.text.format { } +package android.util { + + public deprecated class FloatMath { + method public static float ceil(float); + method public static float cos(float); + method public static float exp(float); + method public static float floor(float); + method public static float hypot(float, float); + method public static float pow(float, float); + method public static float sin(float); + method public static float sqrt(float); + } + +} + package android.view { public class View implements android.view.accessibility.AccessibilityEventSource android.graphics.drawable.Drawable.Callback android.view.KeyEvent.Callback { diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index 219d35bd50cb..808e124fc504 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -142,8 +142,8 @@ public class Am extends BaseCommand { " am task resizeable <TASK_ID> [true|false]\n" + " am task resize <TASK_ID> <LEFT,TOP,RIGHT,BOTTOM>\n" + " am get-config\n" + - " am set-idle [--user <USER_ID>] <PACKAGE> true|false\n" + - " am get-idle [--user <USER_ID>] <PACKAGE>\n" + + " am set-inactive [--user <USER_ID>] <PACKAGE> true|false\n" + + " am get-inactive [--user <USER_ID>] <PACKAGE>\n" + "\n" + "am start: start an Activity. Options are:\n" + " -D: enable debugging\n" + @@ -284,9 +284,9 @@ public class Am extends BaseCommand { "am get-config: retrieve the configuration and any recent configurations\n" + " of the device\n" + "\n" + - "am set-idle: sets the idle state of an app\n" + + "am set-inactive: sets the inactive state of an app\n" + "\n" + - "am get-idle: returns the idle state of an app\n" + + "am get-inactive: returns the inactive state of an app\n" + "\n" + "\n" + "<INTENT> specifications include these flags and arguments:\n" + @@ -395,10 +395,10 @@ public class Am extends BaseCommand { runTask(); } else if (op.equals("get-config")) { runGetConfig(); - } else if (op.equals("set-idle")) { - runSetIdle(); - } else if (op.equals("get-idle")) { - runGetIdle(); + } else if (op.equals("set-inactive")) { + runSetInactive(); + } else if (op.equals("get-inactive")) { + runGetInactive(); } else { showError("Error: unknown command '" + op + "'"); } @@ -2030,7 +2030,7 @@ public class Am extends BaseCommand { } } - private void runSetIdle() throws Exception { + private void runSetInactive() throws Exception { int userId = UserHandle.USER_OWNER; String opt; @@ -2047,10 +2047,10 @@ public class Am extends BaseCommand { IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); - usm.setAppIdle(packageName, Boolean.parseBoolean(value), userId); + usm.setAppInactive(packageName, Boolean.parseBoolean(value), userId); } - private void runGetIdle() throws Exception { + private void runGetInactive() throws Exception { int userId = UserHandle.USER_OWNER; String opt; @@ -2066,7 +2066,7 @@ public class Am extends BaseCommand { IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService( Context.USAGE_STATS_SERVICE)); - boolean isIdle = usm.isAppIdle(packageName, userId); + boolean isIdle = usm.isAppInactive(packageName, userId); System.out.println("Idle=" + isIdle); } diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index bb25ec6d12d3..21dc1e294ac7 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -630,7 +630,10 @@ bool BootAnimation::movie() } glDisable(GL_SCISSOR_TEST); } - glDrawTexiOES(xc, yc, 0, animation.width, animation.height); + // specify the y center as ceiling((mHeight - animation.height) / 2) + // which is equivalent to mHeight - (yc + animation.height) + glDrawTexiOES(xc, mHeight - (yc + animation.height), + 0, animation.width, animation.height); eglSwapBuffers(mDisplay, mSurface); nsecs_t now = systemTime(); diff --git a/core/java/android/animation/AnimatorInflater.java b/core/java/android/animation/AnimatorInflater.java index 427ecce6fec4..435d5ab96949 100644 --- a/core/java/android/animation/AnimatorInflater.java +++ b/core/java/android/animation/AnimatorInflater.java @@ -108,7 +108,7 @@ public class AnimatorInflater { float pathErrorScale) throws NotFoundException { final ConfigurationBoundResourceCache<Animator> animatorCache = resources .getAnimatorCache(); - Animator animator = animatorCache.get(id, theme); + Animator animator = animatorCache.getInstance(id, theme); if (animator != null) { if (DBG_ANIMATOR_INFLATER) { Log.d(TAG, "loaded animator from cache, " + resources.getResourceName(id)); @@ -157,7 +157,7 @@ public class AnimatorInflater { final ConfigurationBoundResourceCache<StateListAnimator> cache = resources .getStateListAnimatorCache(); final Theme theme = context.getTheme(); - StateListAnimator animator = cache.get(id, theme); + StateListAnimator animator = cache.getInstance(id, theme); if (animator != null) { return animator; } diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java index 6503d892c027..951fe49cbd9e 100644 --- a/core/java/android/animation/AnimatorSet.java +++ b/core/java/android/animation/AnimatorSet.java @@ -16,9 +16,10 @@ package android.animation; +import android.util.ArrayMap; + import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; /** @@ -68,7 +69,7 @@ public final class AnimatorSet extends Animator { * to a single node representing that Animator, not create a new Node * if one already exists. */ - private HashMap<Animator, Node> mNodeMap = new HashMap<Animator, Node>(); + private ArrayMap<Animator, Node> mNodeMap = new ArrayMap<Animator, Node>(); /** * Set of all nodes created for this AnimatorSet. This list is used upon @@ -646,7 +647,7 @@ public final class AnimatorSet extends Animator { anim.mTerminated = false; anim.mStarted = false; anim.mPlayingSet = new ArrayList<Animator>(); - anim.mNodeMap = new HashMap<Animator, Node>(); + anim.mNodeMap = new ArrayMap<Animator, Node>(); anim.mNodes = new ArrayList<Node>(nodeCount); anim.mSortedNodes = new ArrayList<Node>(nodeCount); anim.mReversible = mReversible; diff --git a/core/java/android/animation/LayoutTransition.java b/core/java/android/animation/LayoutTransition.java index 57906824caa1..cdd72be76805 100644 --- a/core/java/android/animation/LayoutTransition.java +++ b/core/java/android/animation/LayoutTransition.java @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * This class enables automatic animations on layout changes in ViewGroup objects. To enable @@ -757,7 +758,7 @@ public class LayoutTransition { // reset the inter-animation delay, in case we use it later staggerDelay = 0; - final ViewTreeObserver observer = parent.getViewTreeObserver(); // used for later cleanup + final ViewTreeObserver observer = parent.getViewTreeObserver(); if (!observer.isAlive()) { // If the observer's not in a good state, skip the transition return; @@ -790,21 +791,9 @@ public class LayoutTransition { // This is the cleanup step. When we get this rendering event, we know that all of // the appropriate animations have been set up and run. Now we can clear out the // layout listeners. - observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - public boolean onPreDraw() { - parent.getViewTreeObserver().removeOnPreDrawListener(this); - int count = layoutChangeListenerMap.size(); - if (count > 0) { - Collection<View> views = layoutChangeListenerMap.keySet(); - for (View view : views) { - View.OnLayoutChangeListener listener = layoutChangeListenerMap.get(view); - view.removeOnLayoutChangeListener(listener); - } - } - layoutChangeListenerMap.clear(); - return true; - } - }); + CleanupCallback callback = new CleanupCallback(layoutChangeListenerMap, parent); + observer.addOnPreDrawListener(callback); + parent.addOnAttachStateChangeListener(callback); } /** @@ -1499,4 +1488,50 @@ public class LayoutTransition { View view, int transitionType); } + /** + * Utility class to clean up listeners after animations are setup. Cleanup happens + * when either the OnPreDrawListener method is called or when the parent is detached, + * whichever comes first. + */ + private static final class CleanupCallback implements ViewTreeObserver.OnPreDrawListener, + View.OnAttachStateChangeListener { + + final Map<View, View.OnLayoutChangeListener> layoutChangeListenerMap; + final ViewGroup parent; + + CleanupCallback(Map<View, View.OnLayoutChangeListener> listenerMap, ViewGroup parent) { + this.layoutChangeListenerMap = listenerMap; + this.parent = parent; + } + + private void cleanup() { + parent.getViewTreeObserver().removeOnPreDrawListener(this); + parent.removeOnAttachStateChangeListener(this); + int count = layoutChangeListenerMap.size(); + if (count > 0) { + Collection<View> views = layoutChangeListenerMap.keySet(); + for (View view : views) { + View.OnLayoutChangeListener listener = layoutChangeListenerMap.get(view); + view.removeOnLayoutChangeListener(listener); + } + layoutChangeListenerMap.clear(); + } + } + + @Override + public void onViewAttachedToWindow(View v) { + } + + @Override + public void onViewDetachedFromWindow(View v) { + cleanup(); + } + + @Override + public boolean onPreDraw() { + cleanup(); + return true; + } + }; + } diff --git a/core/java/android/app/ActionBar.java b/core/java/android/app/ActionBar.java index 94e3b663492c..4d3434970ae7 100644 --- a/core/java/android/app/ActionBar.java +++ b/core/java/android/app/ActionBar.java @@ -33,6 +33,7 @@ import android.view.KeyEvent; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.Window; import android.widget.SpinnerAdapter; import java.lang.annotation.Retention; @@ -1373,5 +1374,13 @@ public abstract class ActionBar { * version of the SDK an app can end up statically linking to the new MarginLayoutParams * overload, causing a crash when running on older platform versions with no other changes. */ + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("gravity", gravity); + } } } diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 7260d1027660..49f509974fcd 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -89,7 +89,7 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; -import android.view.PhoneWindow; +import com.android.internal.policy.PhoneWindow; import android.view.SearchEvent; import android.view.View; import android.view.View.OnCreateContextMenuListener; @@ -3841,10 +3841,7 @@ public class Activity extends ContextThemeWrapper mStartedActivity = true; } - final View decor = mWindow != null ? mWindow.peekDecorView() : null; - if (decor != null) { - decor.cancelPendingInputEvents(); - } + cancelInputsAndStartExitTransition(options); // TODO Consider clearing/flushing other event sources and events for child windows. } else { if (options != null) { @@ -3855,6 +3852,18 @@ public class Activity extends ContextThemeWrapper mParent.startActivityFromChild(this, intent, requestCode); } } + } + + /** + * Cancels pending inputs and if an Activity Transition is to be run, starts the transition. + * + * @param options The ActivityOptions bundle used to start an Activity. + */ + private void cancelInputsAndStartExitTransition(Bundle options) { + final View decor = mWindow != null ? mWindow.peekDecorView() : null; + if (decor != null) { + decor.cancelPendingInputEvents(); + } if (options != null && !isTopOfTask()) { mActivityTransitionState.startExitOutTransition(this, options); } @@ -3872,9 +3881,6 @@ public class Activity extends ContextThemeWrapper */ public void startActivityForResultAsUser(Intent intent, int requestCode, @Nullable Bundle options, UserHandle user) { - if (options != null) { - mActivityTransitionState.startExitOutTransition(this, options); - } if (mParent != null) { throw new RuntimeException("Can't be called from a child"); } @@ -3896,10 +3902,7 @@ public class Activity extends ContextThemeWrapper mStartedActivity = true; } - final View decor = mWindow != null ? mWindow.peekDecorView() : null; - if (decor != null) { - decor.cancelPendingInputEvents(); - } + cancelInputsAndStartExitTransition(options); } /** @@ -3925,6 +3928,7 @@ public class Activity extends ContextThemeWrapper mToken, mEmbeddedID, -1, ar.getResultCode(), ar.getResultData()); } + cancelInputsAndStartExitTransition(options); } /** @@ -3948,6 +3952,7 @@ public class Activity extends ContextThemeWrapper mToken, mEmbeddedID, -1, ar.getResultCode(), ar.getResultData()); } + cancelInputsAndStartExitTransition(options); } /** @@ -4380,6 +4385,7 @@ public class Activity extends ContextThemeWrapper mToken, child.mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } + cancelInputsAndStartExitTransition(options); } /** @@ -4431,9 +4437,6 @@ public class Activity extends ContextThemeWrapper @Override public void startActivityForResult( String who, Intent intent, int requestCode, @Nullable Bundle options) { - if (options != null) { - mActivityTransitionState.startExitOutTransition(this, options); - } Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, who, @@ -4443,6 +4446,7 @@ public class Activity extends ContextThemeWrapper mToken, who, requestCode, ar.getResultCode(), ar.getResultData()); } + cancelInputsAndStartExitTransition(options); } /** diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index bde8f3978222..40eb799f26b9 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -17,6 +17,7 @@ package android.app; import android.annotation.NonNull; +import android.content.ComponentName; /** * Activity manager local system service interface. @@ -48,4 +49,10 @@ public abstract class ActivityManagerInternal { */ public abstract void release(); } + + /** + * Returns home activity for the specified user. + * @param userId ID of the user or {@link android.os.UserHandle#USER_ALL} + */ + public abstract ComponentName getHomeActivityForUser(int userId); } diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index da6d8c5599af..f506d59448bf 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -38,6 +38,7 @@ import android.content.res.AssetManager; import android.content.res.CompatibilityInfo; import android.content.res.Configuration; import android.content.res.Resources; +import android.content.res.Resources.Theme; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDebug; import android.database.sqlite.SQLiteDebug.DbStats; @@ -570,8 +571,6 @@ public final class ActivityThread { private native void dumpGraphicsInfo(FileDescriptor fd); private class ApplicationThread extends ApplicationThreadNative { - private static final String ONE_COUNT_COLUMN = "%21s %8d"; - private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d"; private static final String DB_INFO_FORMAT = " %8s %8s %14s %14s %s"; private int mLastProcessState = -1; @@ -971,18 +970,18 @@ public final class ActivityThread { @Override public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, - boolean dumpFullInfo, boolean dumpDalvik, String[] args) { + boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) { FileOutputStream fout = new FileOutputStream(fd); PrintWriter pw = new FastPrintWriter(fout); try { - dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik); + dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly); } finally { pw.flush(); } } private void dumpMemInfo(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin, - boolean dumpFullInfo, boolean dumpDalvik) { + boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly) { long nativeMax = Debug.getNativeHeapSize() / 1024; long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024; long nativeFree = Debug.getNativeHeapFreeSize() / 1024; @@ -1006,7 +1005,8 @@ public final class ActivityThread { long openSslSocketCount = Debug.countInstancesOfClass(OpenSSLSocketImpl.class); SQLiteDebug.PagerStats stats = SQLiteDebug.getDatabaseInfo(); - dumpMemInfoTable(pw, memInfo, checkin, dumpFullInfo, dumpDalvik, Process.myPid(), + dumpMemInfoTable(pw, memInfo, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly, + Process.myPid(), (mBoundApplication != null) ? mBoundApplication.processName : "unknown", nativeMax, nativeAllocated, nativeFree, dalvikMax, dalvikAllocated, dalvikFree); @@ -1934,6 +1934,9 @@ public final class ActivityThread { = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s"; private static final String HEAP_COLUMN = "%13s %8s %8s %8s %8s %8s %8s %8s"; + private static final String ONE_COUNT_COLUMN = "%21s %8d"; + private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d"; + private static final String ONE_COUNT_COLUMN_HEADER = "%21s %8s"; // Formatting for checkin service - update version if row format changes private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 3; @@ -1943,7 +1946,8 @@ public final class ActivityThread { } public static void dumpMemInfoTable(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin, - boolean dumpFullInfo, boolean dumpDalvik, int pid, String processName, + boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, + int pid, String processName, long nativeMax, long nativeAllocated, long nativeFree, long dalvikMax, long dalvikAllocated, long dalvikFree) { @@ -2024,106 +2028,50 @@ public final class ActivityThread { return; } - // otherwise, show human-readable format - if (dumpFullInfo) { - printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private", - "Shared", "Private", "Swapped", "Heap", "Heap", "Heap"); - printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty", - "Clean", "Clean", "Dirty", "Size", "Alloc", "Free"); - printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------", - "------", "------", "------", "------", "------", "------"); - printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss, - memInfo.nativeSwappablePss, memInfo.nativeSharedDirty, - memInfo.nativePrivateDirty, memInfo.nativeSharedClean, - memInfo.nativePrivateClean, memInfo.nativeSwappedOut, - nativeMax, nativeAllocated, nativeFree); - printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss, - memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty, - memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean, - memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut, - dalvikMax, dalvikAllocated, dalvikFree); - } else { - printRow(pw, HEAP_COLUMN, "", "Pss", "Private", - "Private", "Swapped", "Heap", "Heap", "Heap"); - printRow(pw, HEAP_COLUMN, "", "Total", "Dirty", - "Clean", "Dirty", "Size", "Alloc", "Free"); - printRow(pw, HEAP_COLUMN, "", "------", "------", "------", - "------", "------", "------", "------", "------"); - printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss, - memInfo.nativePrivateDirty, - memInfo.nativePrivateClean, memInfo.nativeSwappedOut, - nativeMax, nativeAllocated, nativeFree); - printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss, - memInfo.dalvikPrivateDirty, - memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut, - dalvikMax, dalvikAllocated, dalvikFree); - } - - int otherPss = memInfo.otherPss; - int otherSwappablePss = memInfo.otherSwappablePss; - int otherSharedDirty = memInfo.otherSharedDirty; - int otherPrivateDirty = memInfo.otherPrivateDirty; - int otherSharedClean = memInfo.otherSharedClean; - int otherPrivateClean = memInfo.otherPrivateClean; - int otherSwappedOut = memInfo.otherSwappedOut; - - for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) { - final int myPss = memInfo.getOtherPss(i); - final int mySwappablePss = memInfo.getOtherSwappablePss(i); - final int mySharedDirty = memInfo.getOtherSharedDirty(i); - final int myPrivateDirty = memInfo.getOtherPrivateDirty(i); - final int mySharedClean = memInfo.getOtherSharedClean(i); - final int myPrivateClean = memInfo.getOtherPrivateClean(i); - final int mySwappedOut = memInfo.getOtherSwappedOut(i); - if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0 - || mySharedClean != 0 || myPrivateClean != 0 || mySwappedOut != 0) { - if (dumpFullInfo) { - printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i), - myPss, mySwappablePss, mySharedDirty, myPrivateDirty, - mySharedClean, myPrivateClean, mySwappedOut, "", "", ""); - } else { - printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i), - myPss, myPrivateDirty, - myPrivateClean, mySwappedOut, "", "", ""); - } - otherPss -= myPss; - otherSwappablePss -= mySwappablePss; - otherSharedDirty -= mySharedDirty; - otherPrivateDirty -= myPrivateDirty; - otherSharedClean -= mySharedClean; - otherPrivateClean -= myPrivateClean; - otherSwappedOut -= mySwappedOut; - } - } - - if (dumpFullInfo) { - printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss, - otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean, - otherSwappedOut, "", "", ""); - printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(), - memInfo.getTotalSwappablePss(), - memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(), - memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(), - memInfo.getTotalSwappedOut(), nativeMax+dalvikMax, - nativeAllocated+dalvikAllocated, nativeFree+dalvikFree); - } else { - printRow(pw, HEAP_COLUMN, "Unknown", otherPss, - otherPrivateDirty, otherPrivateClean, otherSwappedOut, - "", "", ""); - printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(), - memInfo.getTotalPrivateDirty(), - memInfo.getTotalPrivateClean(), - memInfo.getTotalSwappedOut(), - nativeMax+dalvikMax, - nativeAllocated+dalvikAllocated, nativeFree+dalvikFree); - } - - if (dumpDalvik) { - pw.println(" "); - pw.println(" Dalvik Details"); + if (!dumpSummaryOnly) { + if (dumpFullInfo) { + printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private", + "Shared", "Private", "Swapped", "Heap", "Heap", "Heap"); + printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty", + "Clean", "Clean", "Dirty", "Size", "Alloc", "Free"); + printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------", + "------", "------", "------", "------", "------", "------"); + printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss, + memInfo.nativeSwappablePss, memInfo.nativeSharedDirty, + memInfo.nativePrivateDirty, memInfo.nativeSharedClean, + memInfo.nativePrivateClean, memInfo.nativeSwappedOut, + nativeMax, nativeAllocated, nativeFree); + printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss, + memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty, + memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean, + memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut, + dalvikMax, dalvikAllocated, dalvikFree); + } else { + printRow(pw, HEAP_COLUMN, "", "Pss", "Private", + "Private", "Swapped", "Heap", "Heap", "Heap"); + printRow(pw, HEAP_COLUMN, "", "Total", "Dirty", + "Clean", "Dirty", "Size", "Alloc", "Free"); + printRow(pw, HEAP_COLUMN, "", "------", "------", "------", + "------", "------", "------", "------", "------"); + printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss, + memInfo.nativePrivateDirty, + memInfo.nativePrivateClean, memInfo.nativeSwappedOut, + nativeMax, nativeAllocated, nativeFree); + printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss, + memInfo.dalvikPrivateDirty, + memInfo.dalvikPrivateClean, memInfo.dalvikSwappedOut, + dalvikMax, dalvikAllocated, dalvikFree); + } + + int otherPss = memInfo.otherPss; + int otherSwappablePss = memInfo.otherSwappablePss; + int otherSharedDirty = memInfo.otherSharedDirty; + int otherPrivateDirty = memInfo.otherPrivateDirty; + int otherSharedClean = memInfo.otherSharedClean; + int otherPrivateClean = memInfo.otherPrivateClean; + int otherSwappedOut = memInfo.otherSwappedOut; - for (int i=Debug.MemoryInfo.NUM_OTHER_STATS; - i<Debug.MemoryInfo.NUM_OTHER_STATS + Debug.MemoryInfo.NUM_DVK_STATS; i++) { + for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) { final int myPss = memInfo.getOtherPss(i); final int mySwappablePss = memInfo.getOtherSwappablePss(i); final int mySharedDirty = memInfo.getOtherSharedDirty(i); @@ -2132,7 +2080,7 @@ public final class ActivityThread { final int myPrivateClean = memInfo.getOtherPrivateClean(i); final int mySwappedOut = memInfo.getOtherSwappedOut(i); if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0 - || mySharedClean != 0 || myPrivateClean != 0) { + || mySharedClean != 0 || myPrivateClean != 0 || mySwappedOut != 0) { if (dumpFullInfo) { printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i), myPss, mySwappablePss, mySharedDirty, myPrivateDirty, @@ -2142,9 +2090,89 @@ public final class ActivityThread { myPss, myPrivateDirty, myPrivateClean, mySwappedOut, "", "", ""); } + otherPss -= myPss; + otherSwappablePss -= mySwappablePss; + otherSharedDirty -= mySharedDirty; + otherPrivateDirty -= myPrivateDirty; + otherSharedClean -= mySharedClean; + otherPrivateClean -= myPrivateClean; + otherSwappedOut -= mySwappedOut; + } + } + + if (dumpFullInfo) { + printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss, + otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean, + otherSwappedOut, "", "", ""); + printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(), + memInfo.getTotalSwappablePss(), + memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(), + memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(), + memInfo.getTotalSwappedOut(), nativeMax+dalvikMax, + nativeAllocated+dalvikAllocated, nativeFree+dalvikFree); + } else { + printRow(pw, HEAP_COLUMN, "Unknown", otherPss, + otherPrivateDirty, otherPrivateClean, otherSwappedOut, + "", "", ""); + printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(), + memInfo.getTotalPrivateDirty(), + memInfo.getTotalPrivateClean(), + memInfo.getTotalSwappedOut(), + nativeMax+dalvikMax, + nativeAllocated+dalvikAllocated, nativeFree+dalvikFree); + } + + if (dumpDalvik) { + pw.println(" "); + pw.println(" Dalvik Details"); + + for (int i=Debug.MemoryInfo.NUM_OTHER_STATS; + i<Debug.MemoryInfo.NUM_OTHER_STATS + Debug.MemoryInfo.NUM_DVK_STATS; i++) { + final int myPss = memInfo.getOtherPss(i); + final int mySwappablePss = memInfo.getOtherSwappablePss(i); + final int mySharedDirty = memInfo.getOtherSharedDirty(i); + final int myPrivateDirty = memInfo.getOtherPrivateDirty(i); + final int mySharedClean = memInfo.getOtherSharedClean(i); + final int myPrivateClean = memInfo.getOtherPrivateClean(i); + final int mySwappedOut = memInfo.getOtherSwappedOut(i); + if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0 + || mySharedClean != 0 || myPrivateClean != 0) { + if (dumpFullInfo) { + printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i), + myPss, mySwappablePss, mySharedDirty, myPrivateDirty, + mySharedClean, myPrivateClean, mySwappedOut, "", "", ""); + } else { + printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i), + myPss, myPrivateDirty, + myPrivateClean, mySwappedOut, "", "", ""); + } + } } } } + + pw.println(" "); + pw.println(" App Summary"); + printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "Pss(KB)"); + printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "------"); + printRow(pw, ONE_COUNT_COLUMN, + "Java Heap:", memInfo.getSummaryJavaHeap()); + printRow(pw, ONE_COUNT_COLUMN, + "Native Heap:", memInfo.getSummaryNativeHeap()); + printRow(pw, ONE_COUNT_COLUMN, + "Code:", memInfo.getSummaryCode()); + printRow(pw, ONE_COUNT_COLUMN, + "Stack:", memInfo.getSummaryStack()); + printRow(pw, ONE_COUNT_COLUMN, + "Graphics:", memInfo.getSummaryGraphics()); + printRow(pw, ONE_COUNT_COLUMN, + "Private Other:", memInfo.getSummaryPrivateOther()); + printRow(pw, ONE_COUNT_COLUMN, + "System:", memInfo.getSummarySystem()); + pw.println(" "); + printRow(pw, TWO_COUNT_COLUMNS, + "TOTAL:", memInfo.getSummaryTotalPss(), + "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap()); } public void registerOnActivityPausedListener(Activity activity, @@ -4186,9 +4214,14 @@ public final class ActivityThread { if (!mConfiguration.isOtherSeqNewer(config) && compat == null) { return; } - configDiff = mConfiguration.diff(config); - mConfiguration.updateFrom(config); + + configDiff = mConfiguration.updateFrom(config); config = applyCompatConfiguration(mCurDefaultDisplayDpi); + + final Theme systemTheme = getSystemContext().getTheme(); + if ((systemTheme.getChangingConfigurations() & configDiff) != 0) { + systemTheme.rebase(); + } } ArrayList<ComponentCallbacks2> callbacks = collectComponentCallbacks(false, config); diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java index 2939322766e2..fa8141204d42 100644 --- a/core/java/android/app/ActivityTransitionCoordinator.java +++ b/core/java/android/app/ActivityTransitionCoordinator.java @@ -31,6 +31,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewGroupOverlay; import android.view.ViewParent; +import android.view.ViewRootImpl; import android.view.ViewTreeObserver; import android.view.Window; import android.widget.ImageView; @@ -187,11 +188,6 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { */ public static final int MSG_SHARED_ELEMENT_DESTINATION = 107; - /** - * Send the shared element positions. - */ - public static final int MSG_SEND_SHARED_ELEMENT_DESTINATION = 108; - private Window mWindow; final protected ArrayList<String> mAllSharedElementNames; final protected ArrayList<View> mSharedElements = new ArrayList<View>(); @@ -207,6 +203,8 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { new ArrayList<GhostViewListeners>(); private ArrayMap<View, Float> mOriginalAlphas = new ArrayMap<View, Float>(); private ArrayList<Matrix> mSharedElementParentMatrices; + private boolean mSharedElementTransitionComplete; + private boolean mViewsTransitionComplete; public ActivityTransitionCoordinator(Window window, ArrayList<String> allSharedElementNames, @@ -219,6 +217,11 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { } protected void viewsReady(ArrayMap<String, View> sharedElements) { + final View decor = getDecor(); + final ViewRootImpl viewRoot = decor == null ? null : decor.getViewRootImpl(); + if (viewRoot != null) { + viewRoot.setPausedForTransition(true); + } sharedElements.retainAll(mAllSharedElementNames); if (mListener != null) { mListener.onMapSharedElements(mAllSharedElementNames, sharedElements); @@ -476,9 +479,8 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { tempRect.set(0, 0, width, height); view.getMatrix().mapRect(tempRect); - ViewGroup parent = (ViewGroup) view.getParent(); - left = leftInParent - tempRect.left + parent.getScrollX(); - top = topInParent - tempRect.top + parent.getScrollY(); + left = leftInParent - tempRect.left; + top = topInParent - tempRect.top; right = left + width; bottom = top + height; } @@ -506,7 +508,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { ViewGroup parent = (ViewGroup) view.getParent(); Matrix matrix = new Matrix(); parent.transformMatrixToLocal(matrix); - + matrix.postTranslate(parent.getScrollX(), parent.getScrollY()); mSharedElementParentMatrices.add(matrix); } } @@ -521,6 +523,7 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { // Find the location in the view's parent ViewGroup parent = (ViewGroup) viewParent; parent.transformMatrixToLocal(matrix); + matrix.postTranslate(parent.getScrollX(), parent.getScrollY()); } } else { // The indices of mSharedElementParentMatrices matches the @@ -878,6 +881,32 @@ abstract class ActivityTransitionCoordinator extends ResultReceiver { } } + protected boolean isViewsTransitionComplete() { + return mViewsTransitionComplete; + } + + protected void viewsTransitionComplete() { + mViewsTransitionComplete = true; + startInputWhenTransitionsComplete(); + } + + protected void sharedElementTransitionComplete() { + mSharedElementTransitionComplete = true; + startInputWhenTransitionsComplete(); + } + private void startInputWhenTransitionsComplete() { + if (mViewsTransitionComplete && mSharedElementTransitionComplete) { + final View decor = getDecor(); + if (decor != null) { + final ViewRootImpl viewRoot = decor.getViewRootImpl(); + viewRoot.setPausedForTransition(false); + } + onTransitionsComplete(); + } + } + + protected void onTransitionsComplete() {} + protected class ContinueTransitionListener extends Transition.TransitionListenerAdapter { @Override public void onTransitionStart(Transition transition) { diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 5aa399b3d186..7104185bcc50 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -606,7 +606,7 @@ public class AppOpsManager { UserManager.DISALLOW_CREATE_WINDOWS, //SYSTEM_ALERT_WINDOW null, //ACCESS_NOTIFICATIONS null, //CAMERA - null, //RECORD_AUDIO + UserManager.DISALLOW_RECORD_AUDIO, //RECORD_AUDIO null, //PLAY_AUDIO null, //READ_CLIPBOARD null, //WRITE_CLIPBOARD diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index 75e4babeb524..1174387d410f 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -18,6 +18,7 @@ package android.app; import java.util.ArrayList; +import android.annotation.CallSuper; import android.content.ComponentCallbacks; import android.content.ComponentCallbacks2; import android.content.Context; @@ -89,6 +90,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { * service, or receiver in a process. * If you override this method, be sure to call super.onCreate(). */ + @CallSuper public void onCreate() { } @@ -98,9 +100,11 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { * removed by simply killing them; no user code (including this callback) * is executed when doing so. */ + @CallSuper public void onTerminate() { } + @CallSuper public void onConfigurationChanged(Configuration newConfig) { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { @@ -110,6 +114,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } + @CallSuper public void onLowMemory() { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { @@ -119,6 +124,7 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } + @CallSuper public void onTrimMemory(int level) { Object[] callbacks = collectComponentCallbacks(); if (callbacks != null) { diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 90293a48949f..07eee12c7d38 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1571,9 +1571,15 @@ final class ApplicationPackageManager extends PackageManager { final VolumeInfo currentVol = getPrimaryStorageCurrentVolume(); final List<VolumeInfo> vols = storage.getVolumes(); final List<VolumeInfo> candidates = new ArrayList<>(); - for (VolumeInfo vol : vols) { - if (Objects.equals(vol, currentVol) || isPrimaryStorageCandidateVolume(vol)) { - candidates.add(vol); + if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, + storage.getPrimaryStorageUuid()) && currentVol != null) { + // TODO: support moving primary physical to emulated volume + candidates.add(currentVol); + } else { + for (VolumeInfo vol : vols) { + if (Objects.equals(vol, currentVol) || isPrimaryStorageCandidateVolume(vol)) { + candidates.add(vol); + } } } return candidates; @@ -1590,12 +1596,7 @@ final class ApplicationPackageManager extends PackageManager { return false; } - // We can move to public volumes on legacy devices - if ((vol.getType() == VolumeInfo.TYPE_PUBLIC) && vol.getDisk().isDefaultPrimary()) { - return true; - } - - // Otherwise we can move to any private volume + // We can move to any private volume return (vol.getType() == VolumeInfo.TYPE_PRIVATE); } diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java index b6989abfc578..146138007138 100644 --- a/core/java/android/app/ApplicationThreadNative.java +++ b/core/java/android/app/ApplicationThreadNative.java @@ -529,10 +529,12 @@ public abstract class ApplicationThreadNative extends Binder boolean checkin = data.readInt() != 0; boolean dumpInfo = data.readInt() != 0; boolean dumpDalvik = data.readInt() != 0; + boolean dumpSummaryOnly = data.readInt() != 0; String[] args = data.readStringArray(); if (fd != null) { try { - dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo, dumpDalvik, args); + dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo, + dumpDalvik, dumpSummaryOnly, args); } finally { try { fd.close(); @@ -1248,7 +1250,7 @@ class ApplicationThreadProxy implements IApplicationThread { } public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, - boolean dumpInfo, boolean dumpDalvik, String[] args) throws RemoteException { + boolean dumpInfo, boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IApplicationThread.descriptor); @@ -1257,6 +1259,7 @@ class ApplicationThreadProxy implements IApplicationThread { data.writeInt(checkin ? 1 : 0); data.writeInt(dumpInfo ? 1 : 0); data.writeInt(dumpDalvik ? 1 : 0); + data.writeInt(dumpSummaryOnly ? 1 : 0); data.writeStringArray(args); mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0); reply.readException(); diff --git a/core/java/android/app/AssistAction.java b/core/java/android/app/AssistAction.java deleted file mode 100644 index eb33542cdc46..000000000000 --- a/core/java/android/app/AssistAction.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.app; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.net.Uri; -import android.os.Bundle; -import android.text.TextUtils; - -import com.android.internal.util.Preconditions; - -/** - * Helper class for building a {@link Bundle} representing an action being performed by the user, - * to be included in the Bundle generated by {@link Activity#onProvideAssistData}. - * - * @see Activity#onProvideAssistData - */ -public final class AssistAction { - - /** - * Key name for the Bundle containing the schema.org representation of - * an action performed, and should be stored in the Bundle generated by - * {@link Activity#onProvideAssistData}. - */ - public static final String ASSIST_ACTION_KEY = "android:assist_action"; - - /** Bundle key to specify the schema.org ID of the content. */ - public static final String KEY_ID = "@id"; - - /** Bundle key to specify the schema.org type of the content. */ - public static final String KEY_TYPE = "@type"; - - /** Bundle key to specify the name of the content. */ - public static final String KEY_NAME = "name"; - - /** Bundle key to specify the description of the content. */ - public static final String KEY_DESCRIPTION = "description"; - - /** Bundle key to specify the URL of the content. */ - public static final String KEY_URL = "url"; - - /** Bundle key to specify the object of an action. */ - public static final String KEY_ACTION_OBJECT = "object"; - - /** Bundle key to specify the action's status. */ - public static final String KEY_ACTION_STATUS = "actionStatus"; - - /** The act of editing by adding an object to a collection. */ - public static final String TYPE_ADD_ACTION = "AddAction"; - - /** The act of bookmarking an object. */ - public static final String TYPE_BOOKMARK_ACTION = "BookmarkAction"; - - /** The act of liking an object. */ - public static final String TYPE_LIKE_ACTION = "LikeAction"; - - /** The act of consuming audio content. */ - public static final String TYPE_LISTEN_ACTION = "ListenAction"; - - /** The act of consuming static visual content. */ - public static final String TYPE_VIEW_ACTION = "ViewAction"; - - /** The act of expressing a desire about the object. */ - public static final String TYPE_WANT_ACTION = "WantAction"; - - /** The act of watching an object. */ - public static final String TYPE_WATCH_ACTION = "WatchAction"; - - /** The status of an active action. */ - public static final String STATUS_TYPE_ACTIVE = "ActiveActionStatus"; - - /** The status of a completed action. */ - public static final String STATUS_TYPE_COMPLETED = "CompletedActionStatus"; - - private AssistAction() { - } - - /** - * Update the Bundle passed into {@link Activity#onProvideAssistData} with the action Bundle, - * built with {@link ActionBuilder}. - * - * @param assistDataBundle The Bundle provided to {@link Activity#onProvideAssistData}. - * @param actionBundle The Bundle representing an schema.org action. - */ - public static void updateAssistData(Bundle assistDataBundle, Bundle actionBundle) { - Preconditions.checkNotNull(assistDataBundle); - Preconditions.checkNotNull(actionBundle); - - Preconditions.checkNotNull(actionBundle.getString(KEY_TYPE), - "The '@type' property is required in the provided actionBundle"); - assistDataBundle.putParcelable(ASSIST_ACTION_KEY, actionBundle); - } - - /** - * Builds a {@link Bundle} representing a schema.org entity. - */ - public static final class ThingBuilder { - private final Bundle mBundle; - - public ThingBuilder() { - mBundle = new Bundle(); - } - - /** - * Sets the name of the content. - * - * @param name The name of the content. - */ - public ThingBuilder setName(@Nullable String name) { - set(KEY_NAME, name); - return this; - } - - /** - * Sets the app URI of the content. - * - * @param uri The app URI of the content. - */ - public ThingBuilder setUrl(@Nullable Uri uri) { - if (uri != null) { - set(KEY_URL, uri.toString()); - } - return this; - } - - /** - * Sets the ID of the content. - * - * @param id Set the ID of the content. - */ - public ThingBuilder setId(@Nullable String id) { - set(KEY_ID, id); - return this; - } - - /** - * Sets the schema.org type of the content. - * - * @param type The schema.org type. - */ - public ThingBuilder setType(@Nullable String type) { - set(KEY_TYPE, type); - return this; - } - - /** - * Sets the optional description of the content. - * - * @param description The description of the content. - */ - public ThingBuilder setDescription(@Nullable String description) { - set(KEY_DESCRIPTION, description); - return this; - } - - /** - * Sets a property of the content. - * - * @param key The schema.org property. Must not be null. - * @param value The value of the schema.org property. - * If null, the value will be ignored. - */ - public ThingBuilder set(@NonNull String key, @Nullable String value) { - if (value != null) { - mBundle.putString(key, value); - } - return this; - } - - /** - * Sets a property of the content. - * - * @param key The schema.org property. Must not be null. - * @param value The value of the schema.org property represented as a bundle. - * If null, the value will be ignored. - */ - public ThingBuilder set(@NonNull String key, @Nullable Bundle value) { - if (value != null) { - mBundle.putParcelable(key, value); - } - return this; - } - - /** - * Build the {@link Bundle} object representing the schema.org entity. - */ - public Bundle build() { - return mBundle; - } - } - - /** - * Builds a {@link Bundle} representing a schema.org action. - */ - public static final class ActionBuilder { - private final Bundle mBundle; - - public ActionBuilder() { - mBundle = new Bundle(); - } - - /** - * Sets the schema.org type of the action. - * - * @param type The schema.org type. - */ - public ActionBuilder setType(@Nullable String type) { - set(KEY_TYPE, type); - return this; - } - - /** - * Sets the schema.org object of the action. - * - * @param object The schema.org object of the action. - */ - public ActionBuilder setObject(@Nullable Bundle object) { - set(KEY_ACTION_OBJECT, object); - return this; - } - - /** - * Sets a property of the action. - * - * @param key The schema.org property. Must not be null. - * @param value The value of the schema.org property. - * If null, the value will be ignored. - */ - public ActionBuilder set(@NonNull String key, @Nullable String value) { - if (value != null) { - mBundle.putString(key, value); - } - return this; - } - - /** - * Sets a property of the action. - * - * @param key The schema.org property. Must not be null. - * @param value The value of the schema.org property represented as a bundle. - * If null, the value will be ignored. - */ - public ActionBuilder set(@NonNull String key, @Nullable Bundle value) { - if (value != null) { - mBundle.putParcelable(key, value); - } - return this; - } - - /** - * Build the {@link Bundle} object representing the schema.org action. - */ - public Bundle build() { - if (TextUtils.isEmpty(mBundle.getString(KEY_TYPE, null))) { - // Defaults to the base action type http://schema.org/Action. - setType("Action"); - } - - return mBundle; - } - } -} diff --git a/core/java/android/app/AssistStructure.java b/core/java/android/app/AssistStructure.java index 3abbb5ba72e6..a06bc319e3f7 100644 --- a/core/java/android/app/AssistStructure.java +++ b/core/java/android/app/AssistStructure.java @@ -35,6 +35,7 @@ import android.util.Log; import android.view.View; import android.view.ViewAssistStructure; import android.view.ViewRootImpl; +import android.view.WindowManager; import android.view.WindowManagerGlobal; import java.util.ArrayList; @@ -140,7 +141,14 @@ final public class AssistStructure implements Parcelable { mTitle = root.getTitle(); mRoot = new ViewNode(); ViewNodeBuilder builder = new ViewNodeBuilder(assist, mRoot, false); - view.dispatchProvideAssistStructure(builder); + if ((root.getWindowFlags()&WindowManager.LayoutParams.FLAG_SECURE) != 0) { + // This is a secure window, so it doesn't want a screenshot, and that + // means we should also not copy out its view hierarchy. + view.onProvideStructure(builder); + builder.setAssistBlocked(true); + return; + } + view.dispatchProvideStructure(builder); } WindowNode(Parcel in, PooledStringReader preader) { @@ -652,7 +660,7 @@ final public class AssistStructure implements Parcelable { } @Override - public Bundle editExtras() { + public Bundle getExtras() { if (mNode.mExtras != null) { return mNode.mExtras; } @@ -661,8 +669,8 @@ final public class AssistStructure implements Parcelable { } @Override - public void clearExtras() { - mNode.mExtras = null; + public boolean hasExtras() { + return mNode.mExtras != null; } @Override diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 81a78f6cb256..cb20cb8681d6 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -237,8 +237,11 @@ class ContextImpl extends Context { } @Override - public void setTheme(int resid) { - mThemeResource = resid; + public void setTheme(int resId) { + if (mThemeResource != resId) { + mThemeResource = resId; + initializeTheme(); + } } @Override @@ -248,13 +251,22 @@ class ContextImpl extends Context { @Override public Resources.Theme getTheme() { + if (mTheme != null) { + return mTheme; + } + + mThemeResource = Resources.selectDefaultTheme(mThemeResource, + getOuterContext().getApplicationInfo().targetSdkVersion); + initializeTheme(); + + return mTheme; + } + + private void initializeTheme() { if (mTheme == null) { - mThemeResource = Resources.selectDefaultTheme(mThemeResource, - getOuterContext().getApplicationInfo().targetSdkVersion); mTheme = mResources.newTheme(); - mTheme.applyStyle(mThemeResource, true); } - return mTheme; + mTheme.applyStyle(mThemeResource, true); } @Override diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java index d04910417d65..f6e0e1e721b9 100644 --- a/core/java/android/app/Dialog.java +++ b/core/java/android/app/Dialog.java @@ -48,7 +48,7 @@ import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; -import android.view.PhoneWindow; +import com.android.internal.policy.PhoneWindow; import android.view.SearchEvent; import android.view.View; import android.view.View.OnCreateContextMenuListener; diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java index e84a8dabf3b7..4db4be0c53ac 100644 --- a/core/java/android/app/EnterTransitionCoordinator.java +++ b/core/java/android/app/EnterTransitionCoordinator.java @@ -55,8 +55,6 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { private boolean mWasOpaque; private boolean mAreViewsReady; private boolean mIsViewsTransitionStarted; - private boolean mIsViewsTransitionComplete; - private boolean mIsSharedElementTransitionComplete; private Transition mEnterViewsTransition; public EnterTransitionCoordinator(Activity activity, ResultReceiver resultReceiver, @@ -456,7 +454,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { } } if (viewsTransition == null) { - viewTransitionComplete(); + viewsTransitionComplete(); } else { viewsTransition.forceVisibility(View.INVISIBLE, true); final ArrayList<View> transitioningViews = mTransitioningViews; @@ -474,7 +472,7 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { public void onTransitionEnd(Transition transition) { mEnterViewsTransition = null; transition.removeListener(this); - viewTransitionComplete(); + viewsTransitionComplete(); super.onTransitionEnd(transition); } }); @@ -497,18 +495,9 @@ class EnterTransitionCoordinator extends ActivityTransitionCoordinator { return transition; } - private void viewTransitionComplete() { - mIsViewsTransitionComplete = true; - if (mIsSharedElementTransitionComplete) { - moveSharedElementsFromOverlay(); - } - } - - private void sharedElementTransitionComplete() { - mIsSharedElementTransitionComplete = true; - if (mIsViewsTransitionComplete) { - moveSharedElementsFromOverlay(); - } + @Override + protected void onTransitionsComplete() { + moveSharedElementsFromOverlay(); } private void sharedElementTransitionStarted() { diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java index 0f286fb99a77..9ddebb019283 100644 --- a/core/java/android/app/ExitTransitionCoordinator.java +++ b/core/java/android/app/ExitTransitionCoordinator.java @@ -46,8 +46,6 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { private static final String TAG = "ExitTransitionCoordinator"; private static final long MAX_WAIT_MS = 1000; - private boolean mExitComplete; - private Bundle mSharedElementBundle; private boolean mExitNotified; @@ -165,7 +163,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { @Override public void onTransitionEnd(Transition transition) { transition.removeListener(this); - if (mExitComplete) { + if (isViewsTransitionComplete()) { delayCancel(); } } @@ -310,14 +308,14 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { viewsTransition = configureTransition(getViewsTransition(), true); } if (viewsTransition == null) { - exitTransitionComplete(); + viewsTransitionComplete(); } else { final ArrayList<View> transitioningViews = mTransitioningViews; viewsTransition.addListener(new ContinueTransitionListener() { @Override public void onTransitionEnd(Transition transition) { transition.removeListener(this); - exitTransitionComplete(); + viewsTransitionComplete(); if (mIsHidden && transitioningViews != null) { showViews(transitioningViews, true); } @@ -373,19 +371,15 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { } } - private void exitTransitionComplete() { - mExitComplete = true; - notifyComplete(); - } - protected boolean isReadyToNotify() { return mSharedElementBundle != null && mResultReceiver != null && mIsBackgroundReady; } - private void sharedElementTransitionComplete() { + @Override + protected void sharedElementTransitionComplete() { mSharedElementBundle = mExitSharedElementBundle == null ? captureSharedElementState() : captureExitSharedElementsState(); - notifyComplete(); + super.sharedElementTransitionComplete(); } private Bundle captureExitSharedElementsState() { @@ -405,6 +399,11 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { return bundle; } + @Override + protected void onTransitionsComplete() { + notifyComplete(); + } + protected void notifyComplete() { if (isReadyToNotify()) { if (!mSharedElementNotified) { @@ -433,7 +432,7 @@ class ExitTransitionCoordinator extends ActivityTransitionCoordinator { } private void notifyExitComplete() { - if (!mExitNotified && mExitComplete) { + if (!mExitNotified && isViewsTransitionComplete()) { mExitNotified = true; mResultReceiver.send(MSG_EXIT_TRANSITION_COMPLETE, null); mResultReceiver = null; // done talking diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java index 3fb82f603e28..185578fa707c 100644 --- a/core/java/android/app/IApplicationThread.java +++ b/core/java/android/app/IApplicationThread.java @@ -131,7 +131,7 @@ public interface IApplicationThread extends IInterface { void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) throws RemoteException; void scheduleTrimMemory(int level) throws RemoteException; void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo, - boolean dumpDalvik, String[] args) throws RemoteException; + boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException; void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException; void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException; void unstableProviderDied(IBinder provider) throws RemoteException; diff --git a/core/java/android/app/INotificationManager.aidl b/core/java/android/app/INotificationManager.aidl index ac8d5d89de61..63ff005c1869 100644 --- a/core/java/android/app/INotificationManager.aidl +++ b/core/java/android/app/INotificationManager.aidl @@ -75,7 +75,7 @@ interface INotificationManager void requestInterruptionFilterFromListener(in INotificationListener token, int interruptionFilter); int getInterruptionFilterFromListener(in INotificationListener token); void setOnNotificationPostedTrimFromListener(in INotificationListener token, int trim); - NotificationManager.Policy.Token getPolicyTokenFromListener(in INotificationListener listener); + void setInterruptionFilter(String pkg, int interruptionFilter); ComponentName getEffectsSuppressor(); boolean matchesCallFilter(in Bundle extras); @@ -87,10 +87,13 @@ interface INotificationManager oneway void setZenMode(int mode, in Uri conditionId, String reason); oneway void notifyConditions(String pkg, in IConditionProvider provider, in Condition[] conditions); oneway void requestZenModeConditions(in IConditionListener callback, int relevance); - oneway void requestNotificationPolicyToken(String pkg, in INotificationManagerCallback callback); - boolean isNotificationPolicyTokenValid(String pkg, in NotificationManager.Policy.Token token); - NotificationManager.Policy getNotificationPolicy(in NotificationManager.Policy.Token token); - void setNotificationPolicy(in NotificationManager.Policy.Token token, in NotificationManager.Policy policy); + oneway void requestNotificationPolicyAccess(String pkg, in INotificationManagerCallback callback); + boolean isNotificationPolicyAccessGranted(String pkg); + NotificationManager.Policy getNotificationPolicy(String pkg); + void setNotificationPolicy(String pkg, in NotificationManager.Policy policy); + String[] getPackagesRequestingNotificationPolicyAccess(); + boolean isNotificationPolicyAccessGrantedForPackage(String pkg); + void setNotificationPolicyAccessGranted(String pkg, boolean granted); byte[] getBackupPayload(int user); void applyRestore(in byte[] payload, int user); diff --git a/core/java/android/app/INotificationManagerCallback.aidl b/core/java/android/app/INotificationManagerCallback.aidl index b9414caa4b6b..99297456ad7a 100644 --- a/core/java/android/app/INotificationManagerCallback.aidl +++ b/core/java/android/app/INotificationManagerCallback.aidl @@ -20,5 +20,5 @@ import android.app.NotificationManager; /** @hide */ oneway interface INotificationManagerCallback { - void onPolicyToken(in NotificationManager.Policy.Token token); + void onPolicyRequestResult(boolean granted); } diff --git a/core/java/android/app/NotificationManager.aidl b/core/java/android/app/NotificationManager.aidl index 8380b8df5e29..a5d5671c1bc8 100644 --- a/core/java/android/app/NotificationManager.aidl +++ b/core/java/android/app/NotificationManager.aidl @@ -17,4 +17,3 @@ package android.app; parcelable NotificationManager.Policy; -parcelable NotificationManager.Policy.Token;
\ No newline at end of file diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 0a5902658aa0..e4bbe2755570 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SdkConstant; import android.app.Notification.Builder; -import android.app.NotificationManager.Policy.Token; import android.content.ComponentName; import android.content.Context; import android.content.pm.ParceledListSlice; @@ -38,6 +37,7 @@ import android.provider.Settings.Global; import android.service.notification.IConditionListener; import android.service.notification.StatusBarNotification; import android.service.notification.ZenModeConfig; +import android.util.ArraySet; import android.util.Log; import java.util.Objects; @@ -107,6 +107,43 @@ public class NotificationManager public static final String ACTION_NOTIFICATION_POLICY_CHANGED = "android.app.action.NOTIFICATION_POLICY_CHANGED"; + /** + * Intent that is broadcast when the state of getCurrentInterruptionFilter() changes. + * This broadcast is only sent to registered receivers. + */ + @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION) + public static final String ACTION_INTERRUPTION_FILTER_CHANGED + = "android.app.action.INTERRUPTION_FILTER_CHANGED"; + + /** + * {@link #getCurrentInterruptionFilter() Interruption filter} constant - + * Normal interruption filter. + */ + public static final int INTERRUPTION_FILTER_ALL = 1; + + /** + * {@link #getCurrentInterruptionFilter() Interruption filter} constant - + * Priority interruption filter. + */ + public static final int INTERRUPTION_FILTER_PRIORITY = 2; + + /** + * {@link #getCurrentInterruptionFilter() Interruption filter} constant - + * No interruptions filter. + */ + public static final int INTERRUPTION_FILTER_NONE = 3; + + /** + * {@link #getCurrentInterruptionFilter() Interruption filter} constant - + * Alarms only interruption filter. + */ + public static final int INTERRUPTION_FILTER_ALARMS = 4; + + /** {@link #getCurrentInterruptionFilter() Interruption filter} constant - returned when + * the value is unavailable for any reason. + */ + public static final int INTERRUPTION_FILTER_UNKNOWN = 0; + private static INotificationManager sService; /** @hide */ @@ -357,29 +394,29 @@ public class NotificationManager } /** - * Requests a notification policy token for the calling package. + * Requests the ability to read/modify notification policy for the calling package. * - * @param callback required, used to receive the granted token or the deny signal. + * @param callback required, used to receive the granted or the denied signal. * @param handler The handler used when receiving the result. * If null, the current thread is used. */ - public void requestNotificationPolicyToken(@NonNull final Policy.Token.RequestCallback callback, + public void requestPolicyAccess(@NonNull final NotificationPolicyAccessRequestCallback callback, @Nullable Handler handler) { checkRequired("callback", callback); final Handler h = handler != null ? handler : new Handler(); INotificationManager service = getService(); try { - service.requestNotificationPolicyToken(mContext.getOpPackageName(), + service.requestNotificationPolicyAccess(mContext.getOpPackageName(), new INotificationManagerCallback.Stub() { @Override - public void onPolicyToken(final Token token) throws RemoteException { + public void onPolicyRequestResult(final boolean granted) throws RemoteException { h.post(new Runnable() { @Override public void run() { - if (token != null) { - callback.onTokenGranted(token); + if (granted) { + callback.onAccessGranted(); } else { - callback.onTokenDenied(); + callback.onAccessDenied(); } } }); @@ -389,16 +426,38 @@ public class NotificationManager } } + /** Callback for receiving the result of a policy access request. */ + public static abstract class NotificationPolicyAccessRequestCallback { + /** + * Received if the request was granted for this package. + */ + public abstract void onAccessGranted(); + + /** + * Received if the request was denied for this package. + */ + public abstract void onAccessDenied(); + } + /** - * Checks a given notification policy token. + * Checks the ability to read/modify notification policy for the calling package. * - * Returns true if the token is still valid for managing policy. + * Returns true if the calling package can read/modify notification policy. */ - public boolean isNotificationPolicyTokenValid(@NonNull Policy.Token token) { - if (token == null) return false; + public boolean isNotificationPolicyAccessGranted() { INotificationManager service = getService(); try { - return service.isNotificationPolicyTokenValid(mContext.getOpPackageName(), token); + return service.isNotificationPolicyAccessGranted(mContext.getOpPackageName()); + } catch (RemoteException e) { + } + return false; + } + + /** @hide */ + public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) { + INotificationManager service = getService(); + try { + return service.isNotificationPolicyAccessGrantedForPackage(pkg); } catch (RemoteException e) { } return false; @@ -407,13 +466,13 @@ public class NotificationManager /** * Gets the current notification policy. * - * @param token A valid notification policy token is required to access the current policy. + * <p> + * Only available if policy access is granted. */ - public Policy getNotificationPolicy(@NonNull Policy.Token token) { - checkRequired("token", token); + public Policy getNotificationPolicy() { INotificationManager service = getService(); try { - return service.getNotificationPolicy(token); + return service.getNotificationPolicy(mContext.getOpPackageName()); } catch (RemoteException e) { } return null; @@ -422,19 +481,46 @@ public class NotificationManager /** * Sets the current notification policy. * - * @param token A valid notification policy token is required to modify the current policy. + * <p> + * Only available if policy access is granted. + * * @param policy The new desired policy. */ - public void setNotificationPolicy(@NonNull Policy.Token token, @NonNull Policy policy) { - checkRequired("token", token); + public void setNotificationPolicy(@NonNull Policy policy) { checkRequired("policy", policy); INotificationManager service = getService(); try { - service.setNotificationPolicy(token, policy); + service.setNotificationPolicy(mContext.getOpPackageName(), policy); + } catch (RemoteException e) { + } + } + + /** @hide */ + public void setNotificationPolicyAccessGranted(String pkg, boolean granted) { + INotificationManager service = getService(); + try { + service.setNotificationPolicyAccessGranted(pkg, granted); } catch (RemoteException e) { } } + /** @hide */ + public ArraySet<String> getPackagesRequestingNotificationPolicyAccess() { + INotificationManager service = getService(); + try { + final String[] pkgs = service.getPackagesRequestingNotificationPolicyAccess(); + if (pkgs != null && pkgs.length > 0) { + final ArraySet<String> rt = new ArraySet<>(pkgs.length); + for (int i = 0; i < pkgs.length; i++) { + rt.add(pkgs[i]); + } + return rt; + } + } catch (RemoteException e) { + } + return new ArraySet<String>(); + } + private Context mContext; private static void checkRequired(String name, Object value) { @@ -477,24 +563,30 @@ public class NotificationManager /** Notification categories to prioritize. Bitmask of PRIORITY_CATEGORY_* constants. */ public final int priorityCategories; - /** Notification senders to prioritize. One of: + /** Notification senders to prioritize for calls. One of: + * PRIORITY_SENDERS_ANY, PRIORITY_SENDERS_CONTACTS, PRIORITY_SENDERS_STARRED */ + public final int priorityCallSenders; + + /** Notification senders to prioritize for messages. One of: * PRIORITY_SENDERS_ANY, PRIORITY_SENDERS_CONTACTS, PRIORITY_SENDERS_STARRED */ - public final int prioritySenders; + public final int priorityMessageSenders; - public Policy(int priorityCategories, int prioritySenders) { + public Policy(int priorityCategories, int priorityCallSenders, int priorityMessageSenders) { this.priorityCategories = priorityCategories; - this.prioritySenders = prioritySenders; + this.priorityCallSenders = priorityCallSenders; + this.priorityMessageSenders = priorityMessageSenders; } /** @hide */ public Policy(Parcel source) { - this(source.readInt(), source.readInt()); + this(source.readInt(), source.readInt(), source.readInt()); } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(priorityCategories); - dest.writeInt(prioritySenders); + dest.writeInt(priorityCallSenders); + dest.writeInt(priorityMessageSenders); } @Override @@ -504,7 +596,7 @@ public class NotificationManager @Override public int hashCode() { - return Objects.hash(priorityCategories, prioritySenders); + return Objects.hash(priorityCategories, priorityCallSenders, priorityMessageSenders); } @Override @@ -513,14 +605,16 @@ public class NotificationManager if (o == this) return true; final Policy other = (Policy) o; return other.priorityCategories == priorityCategories - && other.prioritySenders == prioritySenders; + && other.priorityCallSenders == priorityCallSenders + && other.priorityMessageSenders == priorityMessageSenders; } @Override public String toString() { return "NotificationManager.Policy[" + "priorityCategories=" + priorityCategoriesToString(priorityCategories) - + ",prioritySenders=" + prioritySendersToString(prioritySenders) + + ",priorityCallSenders=" + prioritySendersToString(priorityCallSenders) + + ",priorityMessageSenders=" + prioritySendersToString(priorityMessageSenders) + "]"; } @@ -574,75 +668,6 @@ public class NotificationManager } }; - /** - * Represents a client-specific token required to manage notification policy. - */ - public static class Token implements Parcelable { - private final IBinder mBinder; - - /** @hide */ - public Token(IBinder binder) { - if (binder == null) throw new IllegalArgumentException("Binder required for token"); - mBinder = binder; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public int hashCode() { - return Objects.hash(mBinder); - } - - @Override - public boolean equals(Object o) { - if (!(o instanceof Token)) return false; - if (o == this) return true; - final Token other = (Token) o; - return Objects.equals(other.mBinder, mBinder); - } - - @Override - public String toString() { - return String.format("NotificationManager.Token[0x%08x]", - System.identityHashCode(mBinder)); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeStrongBinder(mBinder); - } - - public static final Parcelable.Creator<Token> CREATOR - = new Parcelable.Creator<Token>() { - @Override - public Token createFromParcel(Parcel in) { - return new Token(in.readStrongBinder()); - } - - @Override - public Token[] newArray(int size) { - return new Token[size]; - } - }; - - /** Callback for receiving the result of a token request. */ - public static abstract class RequestCallback { - /** - * Received if the request was granted for this package. - * - * @param token can be used to manage notification policy. - */ - public abstract void onTokenGranted(Policy.Token token); - - /** - * Received if the request was denied for this package. - */ - public abstract void onTokenDenied(); - } - } } /** @@ -671,4 +696,69 @@ public class NotificationManager } return new StatusBarNotification[0]; } + + /** + * Gets the current notification interruption filter. + * + * <p> + * The interruption filter defines which notifications are allowed to interrupt the user + * (e.g. via sound & vibration) and is applied globally. + * @return One of the INTERRUPTION_FILTER_ constants, or INTERRUPTION_FILTER_UNKNOWN when + * unavailable. + * + * <p> + * Only available if policy access is granted. + */ + public final int getCurrentInterruptionFilter() { + final INotificationManager service = getService(); + try { + return zenModeToInterruptionFilter(service.getZenMode()); + } catch (RemoteException e) { + Log.e(TAG, "Unable to talk to notification manager. Woe!", e); + } + return INTERRUPTION_FILTER_UNKNOWN; + } + + /** + * Sets the current notification interruption filter. + * + * <p> + * The interruption filter defines which notifications are allowed to interrupt the user + * (e.g. via sound & vibration) and is applied globally. + * @return One of the INTERRUPTION_FILTER_ constants, or INTERRUPTION_FILTER_UNKNOWN when + * unavailable. + * + * <p> + * Only available if policy access is granted. + */ + public final void setInterruptionFilter(int interruptionFilter) { + final INotificationManager service = getService(); + try { + service.setInterruptionFilter(mContext.getOpPackageName(), interruptionFilter); + } catch (RemoteException e) { + Log.e(TAG, "Unable to talk to notification manager. Woe!", e); + } + } + + /** @hide */ + public static int zenModeToInterruptionFilter(int zen) { + switch (zen) { + case Global.ZEN_MODE_OFF: return INTERRUPTION_FILTER_ALL; + case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return INTERRUPTION_FILTER_PRIORITY; + case Global.ZEN_MODE_ALARMS: return INTERRUPTION_FILTER_ALARMS; + case Global.ZEN_MODE_NO_INTERRUPTIONS: return INTERRUPTION_FILTER_NONE; + default: return INTERRUPTION_FILTER_UNKNOWN; + } + } + + /** @hide */ + public static int zenModeFromInterruptionFilter(int interruptionFilter, int defValue) { + switch (interruptionFilter) { + case INTERRUPTION_FILTER_ALL: return Global.ZEN_MODE_OFF; + case INTERRUPTION_FILTER_PRIORITY: return Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; + case INTERRUPTION_FILTER_ALARMS: return Global.ZEN_MODE_ALARMS; + case INTERRUPTION_FILTER_NONE: return Global.ZEN_MODE_NO_INTERRUPTIONS; + default: return defValue; + } + } } diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 46da025e8ec2..0d009088eab2 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -55,7 +55,6 @@ import android.location.CountryDetector; import android.location.ICountryDetector; import android.location.ILocationManager; import android.location.LocationManager; -import android.media.AudioDevicesManager; import android.media.AudioManager; import android.media.MediaRouter; import android.media.midi.IMidiManager; @@ -91,7 +90,6 @@ import android.os.IPowerManager; import android.os.IUserManager; import android.os.PowerManager; import android.os.Process; -import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemVibrator; import android.os.UserHandle; @@ -111,7 +109,7 @@ import android.telephony.TelephonyManager; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; -import android.view.PhoneLayoutInflater; +import com.android.internal.policy.PhoneLayoutInflater; import android.view.WindowManager; import android.view.WindowManagerImpl; import android.view.accessibility.AccessibilityManager; @@ -702,13 +700,6 @@ final class SystemServiceRegistry { public RadioManager createService(ContextImpl ctx) { return new RadioManager(ctx); }}); - - registerService(Context.AUDIO_DEVICES_SERVICE, AudioDevicesManager.class, - new CachedServiceFetcher<AudioDevicesManager>() { - @Override - public AudioDevicesManager createService(ContextImpl ctx) { - return new AudioDevicesManager(ctx); - }}); } /** @@ -727,7 +718,7 @@ final class SystemServiceRegistry { } /** - * Gets the name of the system-level service that is represented by the specified class. + * Gets the name of the system-level service that is represented by the specified class. */ public static String getSystemServiceName(Class<?> serviceClass) { return SYSTEM_SERVICE_NAMES.get(serviceClass); diff --git a/core/java/android/app/admin/DeviceInitializerStatus.java b/core/java/android/app/admin/DeviceInitializerStatus.java index b58711ccbed8..7de518b46f7b 100644 --- a/core/java/android/app/admin/DeviceInitializerStatus.java +++ b/core/java/android/app/admin/DeviceInitializerStatus.java @@ -37,8 +37,8 @@ package android.app.admin; * <li>{@link #STATUS_ERROR_SET_DEVICE_POLICY} * <li>{@link #STATUS_ERROR_DELETE_APPS} * <li>{@link #STATUS_ERROR_DOUBLE_BUMP} - * <li>{@link #STATUS_STATE_CONNECT_BLUETOOTH_PROXY} - * <li>{@link #STATUS_STATE_DISCONNECT_BLUETOOTH_PROXY} + * <li>{@link #STATUS_STATE_CONNECTING_BLUETOOTH_PROXY} + * <li>{@link #STATUS_STATE_DISCONNECTING_BLUETOOTH_PROXY} * <li>{@link #STATUS_STATE_DEVICE_PROVISIONED} * </ul> */ @@ -84,13 +84,13 @@ public class DeviceInitializerStatus { * Device provisioning status code that indicates that a device is connecting to establish * a Bluetooth network proxy. */ - public static final int STATUS_STATE_CONNECT_BLUETOOTH_PROXY = FLAG_STATUS_HIGH_PRIORITY | 8; + public static final int STATUS_STATE_CONNECTING_BLUETOOTH_PROXY = FLAG_STATUS_HIGH_PRIORITY | 8; /** * Device provisioning status code that indicates that a connected Bluetooth network proxy * is being shut down. */ - public static final int STATUS_STATE_DISCONNECT_BLUETOOTH_PROXY = FLAG_STATUS_HIGH_PRIORITY | 9; + public static final int STATUS_STATE_DISCONNECTING_BLUETOOTH_PROXY = FLAG_STATUS_HIGH_PRIORITY | 9; /** * Device provisioning status code that indicates that a device has been successfully @@ -141,37 +141,5 @@ public class DeviceInitializerStatus { */ public static final int STATUS_ERROR_DOUBLE_BUMP = FLAG_STATUS_ERROR | 30; - /** - * Determine if the specified status code represents an error status. - * @param statusCode status code to check - * @return {@code true} if the status code is an error status code - */ - public static boolean isErrorStatus(int statusCode) { - return isFlagSet(statusCode, FLAG_STATUS_ERROR); - } - - /** - * Determine if the specified status code is a custom status. Custom status codes are defined - * and sent by device initialization agents. - * @param statusCode status code to check - * @return {@code true} if the status code is a custom status code - */ - public static boolean isCustomStatus(int statusCode) { - return isFlagSet(statusCode, FLAG_STATUS_CUSTOM); - } - - /** - * Determine if the specified status code is a high priority status code. - * @param statusCode status code to check - * @return {@code true} if the status code is a high priority status code - */ - public static boolean isHighPriority(int statusCode) { - return isFlagSet(statusCode, FLAG_STATUS_HIGH_PRIORITY); - } - - private static boolean isFlagSet(int statusCode, int flag) { - return (statusCode & flag) != 0; - } - private DeviceInitializerStatus() {} } diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 8009b6c6ce4d..ae072068b922 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -702,7 +702,7 @@ public class DevicePolicyManager { * reported to the remote setup device over Bluetooth. * * <p>Broadcasts with this action must supply a - * {@linkplain DeviceInitializerStatus#isCustomStatus(int) custom} status code in the + * {@linkplain DeviceInitializerStatus#FLAG_STATUS_CUSTOM custom} status code in the * {@link EXTRA_DEVICE_INITIALIZER_STATUS_CODE} extra. * * <p>Broadcasts may optionally contain a description in the @@ -718,7 +718,7 @@ public class DevicePolicyManager { * sent as part of a broadcast with an action of {@code ACTION_SEND_DEVICE_INITIALIZER_STATUS}. * * <p>The status code sent with this extra must be a custom status code as defined by - * {@link DeviceInitializerStatus#isCustomStatus(int)}. + * {@link DeviceInitializerStatus#FLAG_STATUS_CUSTOM}. * @hide */ @SystemApi @@ -1653,9 +1653,9 @@ public class DevicePolicyManager { } /** - * Queries whether {@link #DO_NOT_ASK_CREDENTIALS_ON_BOOT} flag is set. + * Queries whether {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT} flag is set. * - * @return true if DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set. + * @return true if RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT flag is set. * @hide */ public boolean getDoNotAskCredentialsOnBoot() { @@ -1753,7 +1753,7 @@ public class DevicePolicyManager { * is ignored. Once the flag is set, it cannot be reverted back without resetting the * device to factory defaults. */ - public static final int DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002; + public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 0x0002; /** * Force a new device unlock password (the password needed to access the @@ -1779,7 +1779,7 @@ public class DevicePolicyManager { * * @param password The new password for the user. Null or empty clears the password. * @param flags May be 0 or combination of {@link #RESET_PASSWORD_REQUIRE_ENTRY} and - * {@link #DO_NOT_ASK_CREDENTIALS_ON_BOOT}. + * {@link #RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT}. * @return Returns true if the password was applied, or false if it is * not acceptable for the current constraints. */ @@ -4229,7 +4229,7 @@ public class DevicePolicyManager { * Called by device initializer to send a provisioning status update to the remote setup device. * * @param statusCode a custom status code value as defined by - * {@link DeviceInitializerStatus#isCustomStatus(int)}. + * {@link DeviceInitializerStatus#FLAG_STATUS_CUSTOM}. * @param description custom description of the status code sent */ public void sendDeviceInitializerStatus(int statusCode, String description) { diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl index 23659e389afc..254408a830fc 100644 --- a/core/java/android/app/usage/IUsageStatsManager.aidl +++ b/core/java/android/app/usage/IUsageStatsManager.aidl @@ -30,6 +30,6 @@ interface IUsageStatsManager { ParceledListSlice queryConfigurationStats(int bucketType, long beginTime, long endTime, String callingPackage); UsageEvents queryEvents(long beginTime, long endTime, String callingPackage); - void setAppIdle(String packageName, boolean idle, int userId); - boolean isAppIdle(String packageName, int userId); + void setAppInactive(String packageName, boolean inactive, int userId); + boolean isAppInactive(String packageName, int userId); } diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java index 8a01d663055c..c74bbddaaadf 100644 --- a/core/java/android/app/usage/UsageStatsManager.java +++ b/core/java/android/app/usage/UsageStatsManager.java @@ -220,15 +220,15 @@ public final class UsageStatsManager { } /** - * Returns whether the specified app is currently considered idle. This will be true if the + * Returns whether the specified app is currently considered inactive. This will be true if the * app hasn't been used directly or indirectly for a period of time defined by the system. This * could be of the order of several hours or days. * @param packageName The package name of the app to query - * @return whether the app is currently considered idle + * @return whether the app is currently considered inactive */ - public boolean isAppIdle(String packageName) { + public boolean isAppInactive(String packageName) { try { - return mService.isAppIdle(packageName, UserHandle.myUserId()); + return mService.isAppInactive(packageName, UserHandle.myUserId()); } catch (RemoteException e) { // fall through and return default } diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 0a778681b57d..ec6f18d217ee 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -28,14 +28,11 @@ import android.bluetooth.le.ScanRecord; import android.bluetooth.le.ScanResult; import android.bluetooth.le.ScanSettings; import android.content.Context; +import android.os.Binder; import android.os.IBinder; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.ServiceManager; -import android.app.ActivityThread; -import android.os.SystemProperties; -import android.provider.Settings; -import android.os.Binder; import android.util.Log; import android.util.Pair; @@ -1255,7 +1252,7 @@ public final class BluetoothAdapter { * @return true if chipset supports on-chip filtering */ public boolean isOffloadedFilteringSupported() { - if (getState() != STATE_ON) return false; + if (!getLeAccess()) return false; try { return mService.isOffloadedFilteringSupported(); } catch (RemoteException e) { @@ -1270,7 +1267,7 @@ public final class BluetoothAdapter { * @return true if chipset supports on-chip scan batching */ public boolean isOffloadedScanBatchingSupported() { - if (getState() != STATE_ON) return false; + if (!getLeAccess()) return false; try { return mService.isOffloadedScanBatchingSupported(); } catch (RemoteException e) { @@ -1286,7 +1283,7 @@ public final class BluetoothAdapter { * @hide */ public boolean isHardwareTrackingFiltersAvailable() { - if (getState() != STATE_ON) return false; + if (!getLeAccess()) return false; try { IBluetoothGatt iGatt = mManagerService.getBluetoothGatt(); if (iGatt == null) { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 8687c6b02c1b..6a989500f4fc 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -3133,16 +3133,6 @@ public abstract class Context { public static final String RADIO_SERVICE = "radio"; /** - * Use with {@link #getSystemService} to retrieve a - * {@link android.media.AudioDevicesManager} for handling device enumeration & notification. - * - * @see #getSystemService - * @see android.media.AudioDevicesManager - */ - public static final String AUDIO_DEVICES_SERVICE = "audio_devices_manager"; - - - /** * Determine whether the given permission is allowed for a particular * process and user ID running in the system. * diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index d0298cdc7ff9..7d767602541a 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -2589,21 +2589,6 @@ public class Intent implements Parcelable, Cloneable { "android.intent.action.GET_RESTRICTION_ENTRIES"; /** - * @hide - * Activity to challenge the user for a PIN that was configured when setting up - * restrictions. Restrictions include blocking of apps and preventing certain user operations, - * controlled by {@link android.os.UserManager#setUserRestrictions(Bundle). - * Launch the activity using - * {@link android.app.Activity#startActivityForResult(Intent, int)} and check if the - * result is {@link android.app.Activity#RESULT_OK} for a successful response to the - * challenge.<p/> - * Before launching this activity, make sure that there is a PIN in effect, by calling - * {@link android.os.UserManager#hasRestrictionsChallenge()}. - */ - public static final String ACTION_RESTRICTIONS_CHALLENGE = - "android.intent.action.RESTRICTIONS_CHALLENGE"; - - /** * Sent the first time a user is starting, to allow system apps to * perform one time initialization. (This will not be seen by third * party applications because a newly initialized user does not have any @@ -3380,14 +3365,6 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS"; /** - * A Parcelable[] of {@link android.service.chooser.ChooserTarget ChooserTarget} objects - * as set with {@link #putExtra(String, Parcelable[])} representing additional app-specific - * targets to place at the front of the list of choices. Shown to the user with - * {@link #ACTION_CHOOSER}. - */ - public static final String EXTRA_CHOOSER_TARGETS = "android.intent.extra.CHOOSER_TARGETS"; - - /** * A Bundle forming a mapping of potential target package names to different extras Bundles * to add to the default intent extras in {@link #EXTRA_INTENT} when used with * {@link #ACTION_CHOOSER}. Each key should be a package name. The package need not diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 7ff6ec38699f..51fa0750b78f 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1067,6 +1067,13 @@ public abstract class PackageManager { public static final String FEATURE_AUDIO_OUTPUT = "android.hardware.audio.output"; /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: + * The device has professional audio level of functionality, performance, and acoustics. + */ + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_AUDIO_PRO = "android.hardware.audio.pro"; + + /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device is capable of communicating with * other devices via Bluetooth. diff --git a/core/java/android/content/res/AssetManager.java b/core/java/android/content/res/AssetManager.java index 525059f19287..8d96f5c2a9ce 100644 --- a/core/java/android/content/res/AssetManager.java +++ b/core/java/android/content/res/AssetManager.java @@ -785,6 +785,7 @@ public final class AssetManager implements AutoCloseable { private native final void deleteTheme(long theme); /*package*/ native static final void applyThemeStyle(long theme, int styleRes, boolean force); /*package*/ native static final void copyTheme(long dest, long source); + /*package*/ native static final void clearTheme(long theme); /*package*/ native static final int loadThemeAttributeValue(long theme, int ident, TypedValue outValue, boolean resolve); diff --git a/core/java/android/content/res/ConfigurationBoundResourceCache.java b/core/java/android/content/res/ConfigurationBoundResourceCache.java index cde7e84b70ce..fecda8798250 100644 --- a/core/java/android/content/res/ConfigurationBoundResourceCache.java +++ b/core/java/android/content/res/ConfigurationBoundResourceCache.java @@ -1,138 +1,58 @@ /* -* 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. -*/ -package android.content.res; + * 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. + */ -import android.util.ArrayMap; -import android.util.LongSparseArray; -import java.lang.ref.WeakReference; +package android.content.res; /** * A Cache class which can be used to cache resource objects that are easy to clone but more * expensive to inflate. - * @hide + * + * @hide For internal use only. */ -public class ConfigurationBoundResourceCache<T> { - - private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState<T>>>> mCache = - new ArrayMap<String, LongSparseArray<WeakReference<ConstantState<T>>>>(); - - final Resources mResources; +public class ConfigurationBoundResourceCache<T> extends ThemedResourceCache<ConstantState<T>> { + private final Resources mResources; /** - * Creates a Resource cache for the given Resources instance. + * Creates a cache for the given Resources instance. * - * @param resources The Resource which can be used when creating new instances. + * @param resources the resources to use when creating new instances */ public ConfigurationBoundResourceCache(Resources resources) { mResources = resources; } /** - * Adds a new item to the cache. - * - * @param key A custom key that uniquely identifies the resource. - * @param theme The Theme instance where this resource was loaded. - * @param constantState The constant state that can create new instances of the resource. + * If the resource is cached, creates and returns a new instance of it. * + * @param key a key that uniquely identifies the drawable resource + * @param theme the theme where the resource will be used + * @return a new instance of the resource, or {@code null} if not in + * the cache */ - public void put(long key, Resources.Theme theme, ConstantState<T> constantState) { - if (constantState == null) { - return; - } - final String themeKey = theme == null ? "" : theme.getKey(); - LongSparseArray<WeakReference<ConstantState<T>>> themedCache; - synchronized (this) { - themedCache = mCache.get(themeKey); - if (themedCache == null) { - themedCache = new LongSparseArray<WeakReference<ConstantState<T>>>(1); - mCache.put(themeKey, themedCache); - } - themedCache.put(key, new WeakReference<ConstantState<T>>(constantState)); - } - } - - /** - * If the resource is cached, creates a new instance of it and returns. - * - * @param key The long key which can be used to uniquely identify the resource. - * @param theme The The Theme instance where we want to load this resource. - * - * @return If this resources was loaded before, returns a new instance of it. Otherwise, returns - * null. - */ - public T get(long key, Resources.Theme theme) { - final String themeKey = theme != null ? theme.getKey() : ""; - final LongSparseArray<WeakReference<ConstantState<T>>> themedCache; - final WeakReference<ConstantState<T>> wr; - synchronized (this) { - themedCache = mCache.get(themeKey); - if (themedCache == null) { - return null; - } - wr = themedCache.get(key); - } - if (wr == null) { - return null; - } - final ConstantState entry = wr.get(); + public T getInstance(long key, Resources.Theme theme) { + final ConstantState<T> entry = get(key, theme); if (entry != null) { - return (T) entry.newInstance(mResources, theme); - } else { // our entry has been purged - synchronized (this) { - // there is a potential race condition here where this entry may be put in - // another thread. But we prefer it to minimize lock duration - themedCache.delete(key); - } + return entry.newInstance(mResources, theme); } - return null; - } - /** - * Users of ConfigurationBoundResourceCache must call this method whenever a configuration - * change happens. On this callback, the cache invalidates all resources that are not valid - * anymore. - * - * @param configChanges The configuration changes - */ - public void onConfigurationChange(final int configChanges) { - synchronized (this) { - final int size = mCache.size(); - for (int i = size - 1; i >= 0; i--) { - final LongSparseArray<WeakReference<ConstantState<T>>> - themeCache = mCache.valueAt(i); - onConfigurationChangeInt(themeCache, configChanges); - if (themeCache.size() == 0) { - mCache.removeAt(i); - } - } - } + return null; } - private void onConfigurationChangeInt( - final LongSparseArray<WeakReference<ConstantState<T>>> themeCache, - final int configChanges) { - final int size = themeCache.size(); - for (int i = size - 1; i >= 0; i--) { - final WeakReference<ConstantState<T>> wr = themeCache.valueAt(i); - final ConstantState<T> constantState = wr.get(); - if (constantState == null || Configuration.needNewResources( - configChanges, constantState.getChangingConfigurations())) { - themeCache.removeAt(i); - } - } + @Override + public boolean shouldInvalidateEntry(ConstantState<T> entry, int configChanges) { + return Configuration.needNewResources(configChanges, entry.getChangingConfigurations()); } - } diff --git a/core/java/android/content/res/DrawableCache.java b/core/java/android/content/res/DrawableCache.java new file mode 100644 index 000000000000..fc70bc60b5c2 --- /dev/null +++ b/core/java/android/content/res/DrawableCache.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 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. + */ + +package android.content.res; + +import android.graphics.drawable.Drawable; + +/** + * Class which can be used to cache Drawable resources against a theme. + */ +class DrawableCache extends ThemedResourceCache<Drawable.ConstantState> { + private final Resources mResources; + + /** + * Creates a cache for the given Resources instance. + * + * @param resources the resources to use when creating new instances + */ + public DrawableCache(Resources resources) { + mResources = resources; + } + + /** + * If the resource is cached, creates and returns a new instance of it. + * + * @param key a key that uniquely identifies the drawable resource + * @param theme the theme where the resource will be used + * @return a new instance of the resource, or {@code null} if not in + * the cache + */ + public Drawable getInstance(long key, Resources.Theme theme) { + final Drawable.ConstantState entry = get(key, theme); + if (entry != null) { + return entry.newDrawable(mResources, theme); + } + + return null; + } + + @Override + public boolean shouldInvalidateEntry(Drawable.ConstantState entry, int configChanges) { + return false; + } +} diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index ae41b69427e1..a572590e702b 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -20,6 +20,7 @@ import android.annotation.AttrRes; import android.annotation.ColorInt; import android.annotation.StyleRes; import android.annotation.StyleableRes; +import com.android.internal.util.GrowingArrayUtils; import com.android.internal.util.XmlUtils; import org.xmlpull.v1.XmlPullParser; @@ -60,6 +61,7 @@ import android.util.Pools.SynchronizedPool; import android.util.Slog; import android.util.TypedValue; import android.view.ViewDebug; +import android.view.ViewHierarchyEncoder; import java.io.IOException; import java.io.InputStream; @@ -132,10 +134,8 @@ public class Resources { // These are protected by mAccessLock. private final Object mAccessLock = new Object(); private final Configuration mTmpConfig = new Configuration(); - private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> mDrawableCache = - new ArrayMap<>(); - private final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> mColorDrawableCache = - new ArrayMap<>(); + private final DrawableCache mDrawableCache = new DrawableCache(this); + private final DrawableCache mColorDrawableCache = new DrawableCache(this); private final ConfigurationBoundResourceCache<ColorStateList> mColorStateListCache = new ConfigurationBoundResourceCache<>(this); private final ConfigurationBoundResourceCache<Animator> mAnimatorCache = @@ -1441,7 +1441,7 @@ public class Resources { AssetManager.applyThemeStyle(mTheme, resId, force); mThemeResId = resId; - mKey += Integer.toHexString(resId) + (force ? "! " : " "); + mKey.append(resId, force); } /** @@ -1457,7 +1457,7 @@ public class Resources { AssetManager.copyTheme(mTheme, other.mTheme); mThemeResId = other.mThemeResId; - mKey = other.mKey; + mKey.setTo(other.getKey()); } /** @@ -1765,6 +1765,9 @@ public class Resources { mTheme = mAssets.createTheme(); } + /** Unique key for the series of styles applied to this theme. */ + private final ThemeKey mKey = new ThemeKey(); + @SuppressWarnings("hiding") private final AssetManager mAssets; private final long mTheme; @@ -1772,9 +1775,6 @@ public class Resources { /** Resource identifier for the theme. */ private int mThemeResId = 0; - /** Unique key for the series of styles applied to this theme. */ - private String mKey = ""; - // Needed by layoutlib. /*package*/ long getNativeTheme() { return mTheme; @@ -1784,7 +1784,7 @@ public class Resources { return mThemeResId; } - /*package*/ String getKey() { + /*package*/ ThemeKey getKey() { return mKey; } @@ -1793,29 +1793,133 @@ public class Resources { } /** - * Parses {@link #mKey} and returns a String array that holds pairs of adjacent Theme data: - * resource name followed by whether or not it was forced, as specified by - * {@link #applyStyle(int, boolean)}. + * Parses {@link #mKey} and returns a String array that holds pairs of + * adjacent Theme data: resource name followed by whether or not it was + * forced, as specified by {@link #applyStyle(int, boolean)}. * * @hide */ @ViewDebug.ExportedProperty(category = "theme", hasAdjacentMapping = true) public String[] getTheme() { - String[] themeData = mKey.split(" "); - String[] themes = new String[themeData.length * 2]; - String theme; - boolean forced; - - for (int i = 0, j = themeData.length - 1; i < themes.length; i += 2, --j) { - theme = themeData[j]; - forced = theme.endsWith("!"); - themes[i] = forced ? - getResourceNameFromHexString(theme.substring(0, theme.length() - 1)) : - getResourceNameFromHexString(theme); + final int N = mKey.mCount; + final String[] themes = new String[N * 2]; + for (int i = 0, j = N - 1; i < themes.length; i += 2, --j) { + final int resId = mKey.mResId[j]; + final boolean forced = mKey.mForce[j]; + try { + themes[i] = getResourceName(resId); + } catch (NotFoundException e) { + themes[i] = Integer.toHexString(i); + } themes[i + 1] = forced ? "forced" : "not forced"; } return themes; } + + /** @hide */ + public void encode(@NonNull ViewHierarchyEncoder encoder) { + encoder.beginObject(this); + final String[] properties = getTheme(); + for (int i = 0; i < properties.length; i += 2) { + encoder.addProperty(properties[i], properties[i+1]); + } + encoder.endObject(); + } + + /** + * Rebases the theme against the parent Resource object's current + * configuration by re-applying the styles passed to + * {@link #applyStyle(int, boolean)}. + * + * @hide + */ + public void rebase() { + AssetManager.clearTheme(mTheme); + + // Reapply the same styles in the same order. + for (int i = 0; i < mKey.mCount; i++) { + final int resId = mKey.mResId[i]; + final boolean force = mKey.mForce[i]; + AssetManager.applyThemeStyle(mTheme, resId, force); + } + } + } + + static class ThemeKey implements Cloneable { + int[] mResId; + boolean[] mForce; + int mCount; + + private int mHashCode = 0; + + public void append(int resId, boolean force) { + if (mResId == null) { + mResId = new int[4]; + } + + if (mForce == null) { + mForce = new boolean[4]; + } + + mResId = GrowingArrayUtils.append(mResId, mCount, resId); + mForce = GrowingArrayUtils.append(mForce, mCount, force); + mCount++; + + mHashCode = 31 * (31 * mHashCode + resId) + (force ? 1 : 0); + } + + /** + * Sets up this key as a deep copy of another key. + * + * @param other the key to deep copy into this key + */ + public void setTo(ThemeKey other) { + mResId = other.mResId == null ? null : other.mResId.clone(); + mForce = other.mForce == null ? null : other.mForce.clone(); + mCount = other.mCount; + } + + @Override + public int hashCode() { + return mHashCode; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass() || hashCode() != o.hashCode()) { + return false; + } + + final ThemeKey t = (ThemeKey) o; + if (mCount != t.mCount) { + return false; + } + + final int N = mCount; + for (int i = 0; i < N; i++) { + if (mResId[i] != t.mResId[i] || mForce[i] != t.mForce[i]) { + return false; + } + } + + return true; + } + + /** + * @return a shallow copy of this key + */ + @Override + public ThemeKey clone() { + final ThemeKey other = new ThemeKey(); + other.mResId = mResId; + other.mForce = mForce; + other.mCount = mCount; + return other; + } } /** @@ -1944,8 +2048,8 @@ public class Resources { + " final compat is " + mCompatibilityInfo); } - clearDrawableCachesLocked(mDrawableCache, configChanges); - clearDrawableCachesLocked(mColorDrawableCache, configChanges); + mDrawableCache.onConfigurationChange(configChanges); + mColorDrawableCache.onConfigurationChange(configChanges); mColorStateListCache.onConfigurationChange(configChanges); mAnimatorCache.onConfigurationChange(configChanges); mStateListAnimatorCache.onConfigurationChange(configChanges); @@ -1983,48 +2087,6 @@ public class Resources { return configChanges; } - private void clearDrawableCachesLocked( - ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, - int configChanges) { - final int N = caches.size(); - for (int i = 0; i < N; i++) { - clearDrawableCacheLocked(caches.valueAt(i), configChanges); - } - } - - private void clearDrawableCacheLocked( - LongSparseArray<WeakReference<ConstantState>> cache, int configChanges) { - if (DEBUG_CONFIG) { - Log.d(TAG, "Cleaning up drawables config changes: 0x" - + Integer.toHexString(configChanges)); - } - final int N = cache.size(); - for (int i = 0; i < N; i++) { - final WeakReference<ConstantState> ref = cache.valueAt(i); - if (ref != null) { - final ConstantState cs = ref.get(); - if (cs != null) { - if (Configuration.needNewResources( - configChanges, cs.getChangingConfigurations())) { - if (DEBUG_CONFIG) { - Log.d(TAG, "FLUSHING #0x" - + Long.toHexString(cache.keyAt(i)) - + " / " + cs + " with changes: 0x" - + Integer.toHexString(cs.getChangingConfigurations())); - } - cache.setValueAt(i, null); - } else if (DEBUG_CONFIG) { - Log.d(TAG, "(Keeping #0x" - + Long.toHexString(cache.keyAt(i)) - + " / " + cs + " with changes: 0x" - + Integer.toHexString(cs.getChangingConfigurations()) - + ")"); - } - } - } - } - } - /** * {@code Locale.toLanguageTag} will transform the obsolete (and deprecated) * language codes "in", "ji" and "iw" to "id", "yi" and "he" respectively. @@ -2436,7 +2498,7 @@ public class Resources { } final boolean isColorDrawable; - final ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches; + final DrawableCache caches; final long key; if (value.type >= TypedValue.TYPE_FIRST_COLOR_INT && value.type <= TypedValue.TYPE_LAST_COLOR_INT) { @@ -2452,7 +2514,7 @@ public class Resources { // First, check whether we have a cached version of this drawable // that was inflated against the specified theme. if (!mPreloading) { - final Drawable cachedDrawable = getCachedDrawable(caches, key, theme); + final Drawable cachedDrawable = caches.getInstance(key, theme); if (cachedDrawable != null) { return cachedDrawable; } @@ -2479,13 +2541,8 @@ public class Resources { // Determine if the drawable has unresolved theme attributes. If it // does, we'll need to apply a theme and store it in a theme-specific // cache. - final String cacheKey; - if (!dr.canApplyTheme()) { - cacheKey = CACHE_NOT_THEMED; - } else if (theme == null) { - cacheKey = CACHE_NULL_THEME; - } else { - cacheKey = theme.getKey(); + final boolean canApplyTheme = dr.canApplyTheme(); + if (canApplyTheme && theme != null) { dr = dr.mutate(); dr.applyTheme(theme); dr.clearMutated(); @@ -2495,15 +2552,14 @@ public class Resources { // cache: preload, not themed, null theme, or theme-specific. if (dr != null) { dr.setChangingConfigurations(value.changingConfigurations); - cacheDrawable(value, isColorDrawable, caches, cacheKey, key, dr); + cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr); } return dr; } - private void cacheDrawable(TypedValue value, boolean isColorDrawable, - ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, - String cacheKey, long key, Drawable dr) { + private void cacheDrawable(TypedValue value, boolean isColorDrawable, DrawableCache caches, + Theme theme, boolean usesTheme, long key, Drawable dr) { final ConstantState cs = dr.getConstantState(); if (cs == null) { return; @@ -2531,54 +2587,12 @@ public class Resources { } } else { synchronized (mAccessLock) { - LongSparseArray<WeakReference<ConstantState>> themedCache = caches.get(cacheKey); - if (themedCache == null) { - // Clean out the caches before we add more. This shouldn't - // happen very often. - pruneCaches(caches); - themedCache = new LongSparseArray<>(1); - caches.put(cacheKey, themedCache); - } - themedCache.put(key, new WeakReference<>(cs)); - } - } - } - - /** - * Prunes empty caches from the cache map. - * - * @param caches The map of caches to prune. - */ - private void pruneCaches(ArrayMap<String, - LongSparseArray<WeakReference<ConstantState>>> caches) { - final int N = caches.size(); - for (int i = N - 1; i >= 0; i--) { - final LongSparseArray<WeakReference<ConstantState>> cache = caches.valueAt(i); - if (pruneCache(cache)) { - caches.removeAt(i); + caches.put(key, theme, cs, usesTheme); } } } /** - * Prunes obsolete weak references from a cache, returning {@code true} if - * the cache is empty and should be removed. - * - * @param cache The cache of weak references to prune. - * @return {@code true} if the cache is empty and should be removed. - */ - private boolean pruneCache(LongSparseArray<WeakReference<ConstantState>> cache) { - final int N = cache.size(); - for (int i = N - 1; i >= 0; i--) { - final WeakReference entry = cache.valueAt(i); - if (entry == null || entry.get() == null) { - cache.removeAt(i); - } - } - return cache.size() == 0; - } - - /** * Loads a drawable from XML or resources stream. */ private Drawable loadDrawableForCookie(TypedValue value, int id, Theme theme) { @@ -2631,51 +2645,6 @@ public class Resources { return dr; } - private Drawable getCachedDrawable( - ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, - long key, Theme theme) { - synchronized (mAccessLock) { - // First search theme-agnostic cache. - final Drawable unthemedDrawable = getCachedDrawableLocked( - caches, key, CACHE_NOT_THEMED); - if (unthemedDrawable != null) { - return unthemedDrawable; - } - - // Next search theme-specific cache. - final String themeKey = theme != null ? theme.getKey() : CACHE_NULL_THEME; - return getCachedDrawableLocked(caches, key, themeKey); - } - } - - private Drawable getCachedDrawableLocked( - ArrayMap<String, LongSparseArray<WeakReference<ConstantState>>> caches, - long key, String themeKey) { - final LongSparseArray<WeakReference<ConstantState>> cache = caches.get(themeKey); - if (cache != null) { - final ConstantState entry = getConstantStateLocked(cache, key); - if (entry != null) { - return entry.newDrawable(this); - } - } - return null; - } - - private ConstantState getConstantStateLocked( - LongSparseArray<WeakReference<ConstantState>> drawableCache, long key) { - final WeakReference<ConstantState> wr = drawableCache.get(key); - if (wr != null) { - final ConstantState entry = wr.get(); - if (entry != null) { - return entry; - } else { - // Our entry has been purged. - drawableCache.delete(key); - } - } - return null; - } - @Nullable ColorStateList loadColorStateList(TypedValue value, int id, Theme theme) throws NotFoundException { @@ -2713,8 +2682,7 @@ public class Resources { } final ConfigurationBoundResourceCache<ColorStateList> cache = mColorStateListCache; - - csl = cache.get(key, theme); + csl = cache.getInstance(key, theme); if (csl != null) { return csl; } diff --git a/core/java/android/content/res/ThemedResourceCache.java b/core/java/android/content/res/ThemedResourceCache.java new file mode 100644 index 000000000000..9a2d061474e6 --- /dev/null +++ b/core/java/android/content/res/ThemedResourceCache.java @@ -0,0 +1,233 @@ +/* + * Copyright (C) 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. + */ + +package android.content.res; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.res.Resources.Theme; +import android.content.res.Resources.ThemeKey; +import android.util.LongSparseArray; +import android.util.ArrayMap; + +import java.lang.ref.WeakReference; + +/** + * Data structure used for caching data against themes. + * + * @param <T> type of data to cache + */ +abstract class ThemedResourceCache<T> { + private ArrayMap<ThemeKey, LongSparseArray<WeakReference<T>>> mThemedEntries; + private LongSparseArray<WeakReference<T>> mUnthemedEntries; + private LongSparseArray<WeakReference<T>> mNullThemedEntries; + + /** + * Adds a new theme-dependent entry to the cache. + * + * @param key a key that uniquely identifies the entry + * @param theme the theme against which this entry was inflated, or + * {@code null} if the entry has no theme applied + * @param entry the entry to cache + */ + public void put(long key, @Nullable Theme theme, @NonNull T entry) { + put(key, theme, entry, true); + } + + /** + * Adds a new entry to the cache. + * + * @param key a key that uniquely identifies the entry + * @param theme the theme against which this entry was inflated, or + * {@code null} if the entry has no theme applied + * @param entry the entry to cache + * @param usesTheme {@code true} if the entry is affected theme changes, + * {@code false} otherwise + */ + public void put(long key, @Nullable Theme theme, @NonNull T entry, boolean usesTheme) { + if (entry == null) { + return; + } + + synchronized (this) { + final LongSparseArray<WeakReference<T>> entries; + if (!usesTheme) { + entries = getUnthemedLocked(true); + } else { + entries = getThemedLocked(theme, true); + } + if (entries != null) { + entries.put(key, new WeakReference<>(entry)); + } + } + } + + /** + * Returns an entry from the cache. + * + * @param key a key that uniquely identifies the entry + * @param theme the theme where the entry will be used + * @return a cached entry, or {@code null} if not in the cache + */ + @Nullable + public T get(long key, @Nullable Theme theme) { + // The themed (includes null-themed) and unthemed caches are mutually + // exclusive, so we'll give priority to whichever one we think we'll + // hit first. Since most of the framework drawables are themed, that's + // probably going to be the themed cache. + synchronized (this) { + final LongSparseArray<WeakReference<T>> themedEntries = getThemedLocked(theme, false); + if (themedEntries != null) { + final WeakReference<T> themedEntry = themedEntries.get(key); + if (themedEntry != null) { + return themedEntry.get(); + } + } + + final LongSparseArray<WeakReference<T>> unthemedEntries = getUnthemedLocked(false); + if (unthemedEntries != null) { + final WeakReference<T> unthemedEntry = unthemedEntries.get(key); + if (unthemedEntry != null) { + return unthemedEntry.get(); + } + } + } + + return null; + } + + /** + * Prunes cache entries that have been invalidated by a configuration + * change. + * + * @param configChanges a bitmask of configuration changes + */ + public void onConfigurationChange(int configChanges) { + prune(configChanges); + } + + /** + * Returns whether a cached entry has been invalidated by a configuration + * change. + * + * @param entry a cached entry + * @param configChanges a non-zero bitmask of configuration changes + * @return {@code true} if the entry is invalid, {@code false} otherwise + */ + protected abstract boolean shouldInvalidateEntry(@NonNull T entry, int configChanges); + + /** + * Returns the cached data for the specified theme, optionally creating a + * new entry if one does not already exist. + * + * @param t the theme for which to return cached data + * @param create {@code true} to create an entry if one does not already + * exist, {@code false} otherwise + * @return the cached data for the theme, or {@code null} if the cache is + * empty and {@code create} was {@code false} + */ + @Nullable + private LongSparseArray<WeakReference<T>> getThemedLocked(@Nullable Theme t, boolean create) { + if (t == null) { + if (mNullThemedEntries == null && create) { + mNullThemedEntries = new LongSparseArray<>(1); + } + return mNullThemedEntries; + } + + if (mThemedEntries == null) { + if (create) { + mThemedEntries = new ArrayMap<>(1); + } else { + return null; + } + } + + final ThemeKey key = t.getKey(); + LongSparseArray<WeakReference<T>> cache = mThemedEntries.get(key); + if (cache == null && create) { + cache = new LongSparseArray<>(1); + + final ThemeKey keyClone = key.clone(); + mThemedEntries.put(keyClone, cache); + } + + return cache; + } + + /** + * Returns the theme-agnostic cached data. + * + * @param create {@code true} to create an entry if one does not already + * exist, {@code false} otherwise + * @return the theme-agnostic cached data, or {@code null} if the cache is + * empty and {@code create} was {@code false} + */ + @Nullable + private LongSparseArray<WeakReference<T>> getUnthemedLocked(boolean create) { + if (mUnthemedEntries == null && create) { + mUnthemedEntries = new LongSparseArray<>(1); + } + return mUnthemedEntries; + } + + /** + * Prunes cache entries affected by configuration changes or where weak + * references have expired. + * + * @param configChanges a bitmask of configuration changes, or {@code 0} to + * simply prune missing weak references + * @return {@code true} if the cache is completely empty after pruning + */ + private boolean prune(int configChanges) { + synchronized (this) { + if (mThemedEntries != null) { + for (int i = mThemedEntries.size() - 1; i >= 0; i--) { + if (pruneEntriesLocked(mThemedEntries.valueAt(i), configChanges)) { + mThemedEntries.removeAt(i); + } + } + } + + pruneEntriesLocked(mNullThemedEntries, configChanges); + pruneEntriesLocked(mUnthemedEntries, configChanges); + + return mThemedEntries == null && mNullThemedEntries == null + && mUnthemedEntries == null; + } + } + + private boolean pruneEntriesLocked(@Nullable LongSparseArray<WeakReference<T>> entries, + int configChanges) { + if (entries == null) { + return true; + } + + for (int i = entries.size() - 1; i >= 0; i--) { + final WeakReference<T> ref = entries.valueAt(i); + if (ref == null || pruneEntryLocked(ref.get(), configChanges)) { + entries.removeAt(i); + } + } + + return entries.size() == 0; + } + + private boolean pruneEntryLocked(@Nullable T entry, int configChanges) { + return entry == null || (configChanges != 0 + && shouldInvalidateEntry(entry, configChanges)); + } +} diff --git a/core/java/android/ddm/DdmHandleViewDebug.java b/core/java/android/ddm/DdmHandleViewDebug.java index 3a36b0a91a15..be48633c571e 100644 --- a/core/java/android/ddm/DdmHandleViewDebug.java +++ b/core/java/android/ddm/DdmHandleViewDebug.java @@ -229,15 +229,25 @@ public class DdmHandleViewDebug extends ChunkHandler { private Chunk dumpHierarchy(View rootView, ByteBuffer in) { boolean skipChildren = in.getInt() > 0; boolean includeProperties = in.getInt() > 0; + boolean v2 = in.hasRemaining() && in.getInt() > 0; - ByteArrayOutputStream b = new ByteArrayOutputStream(1024); + long start = System.currentTimeMillis(); + + ByteArrayOutputStream b = new ByteArrayOutputStream(2*1024*1024); try { - ViewDebug.dump(rootView, skipChildren, includeProperties, b); - } catch (IOException e) { + if (v2) { + ViewDebug.dumpv2(rootView, b); + } else { + ViewDebug.dump(rootView, skipChildren, includeProperties, b); + } + } catch (IOException | InterruptedException e) { return createFailChunk(1, "Unexpected error while obtaining view hierarchy: " + e.getMessage()); } + long end = System.currentTimeMillis(); + Log.d(TAG, "Time to obtain view hierarchy (ms): " + (end - start)); + byte[] data = b.toByteArray(); return new Chunk(CHUNK_VURT, data, 0, data.length); } diff --git a/core/java/android/hardware/camera2/CameraCaptureSession.java b/core/java/android/hardware/camera2/CameraCaptureSession.java index aeddf032a176..ef71c42a9ba5 100644 --- a/core/java/android/hardware/camera2/CameraCaptureSession.java +++ b/core/java/android/hardware/camera2/CameraCaptureSession.java @@ -212,8 +212,7 @@ public abstract class CameraCaptureSession implements AutoCloseable { * <p>All capture sessions can be used for capturing images from the camera but only capture * sessions created by * {@link CameraDevice#createReprocessibleCaptureSession createReprocessibleCaptureSession} - * can submit reprocess capture requests. The list of requests must all be capturing images from - * the camera or all be reprocess capture requests. Submitting a reprocess request to a regular + * can submit reprocess capture requests. Submitting a reprocess request to a regular * capture session will result in an {@link IllegalArgumentException}.</p> * * @param requests the list of settings for this burst capture @@ -236,9 +235,7 @@ public abstract class CameraCaptureSession implements AutoCloseable { * @throws IllegalArgumentException If the requests target no Surfaces, or the requests target * Surfaces not currently configured as outputs; or a reprocess * capture request is submitted in a non-reprocessible capture - * session; or the list of requests contains both requests to - * capture images from the camera and reprocess capture - * requests; or one of the reprocess capture requests was + * session; or one of the reprocess capture requests was * created with a {@link TotalCaptureResult} from a different * session; or one of the captures targets a Surface in the * middle of being {@link #prepare prepared}; or if the handler diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java index 3c195298b759..dff62270b05a 100644 --- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java @@ -177,26 +177,20 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession { public synchronized int captureBurst(List<CaptureRequest> requests, CaptureCallback callback, Handler handler) throws CameraAccessException { if (requests == null) { - throw new IllegalArgumentException("requests must not be null"); + throw new IllegalArgumentException("Requests must not be null"); } else if (requests.isEmpty()) { - throw new IllegalArgumentException("requests must have at least one element"); - } - - boolean reprocess = requests.get(0).isReprocess(); - if (reprocess && !isReprocessible()) { - throw new IllegalArgumentException("this capture session cannot handle reprocess " + - "requests"); - } else if (reprocess && requests.get(0).getReprocessibleSessionId() != mId) { - throw new IllegalArgumentException("capture request was created for another session"); + throw new IllegalArgumentException("Requests must have at least one element"); } - for (int i = 1; i < requests.size(); i++) { - if (requests.get(i).isReprocess() != reprocess) { - throw new IllegalArgumentException("cannot mix regular and reprocess capture " + - " requests"); - } else if (reprocess && requests.get(i).getReprocessibleSessionId() != mId) { - throw new IllegalArgumentException("capture request was created for another " + - "session"); + for (CaptureRequest request : requests) { + if (request.isReprocess()) { + if (!isReprocessible()) { + throw new IllegalArgumentException("This capture session cannot handle " + + "reprocess requests"); + } else if (request.getReprocessibleSessionId() != mId) { + throw new IllegalArgumentException("Capture request was created for another " + + "session"); + } } } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index ff4ad79f120f..e84b46abf13a 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -94,11 +94,11 @@ public class CameraDeviceImpl extends CameraDevice { private final int mTotalPartialCount; /** - * A list tracking request and its expected last frame. - * Updated when calling ICameraDeviceUser methods. + * A list tracking request and its expected last regular frame number and last reprocess frame + * number. Updated when calling ICameraDeviceUser methods. */ - private final List<SimpleEntry</*frameNumber*/Long, /*requestId*/Integer>> - mFrameNumberRequestPairs = new ArrayList<SimpleEntry<Long, Integer>>(); + private final List<RequestLastFrameNumbersHolder> mRequestLastFrameNumbersList = + new ArrayList<>(); /** * An object tracking received frame numbers. @@ -653,8 +653,8 @@ public class CameraDeviceImpl extends CameraDevice { * * <p>If lastFrameNumber is NO_FRAMES_CAPTURED, it means that the request was never * sent to HAL. Then onCaptureSequenceAborted is immediately triggered. - * If lastFrameNumber is non-negative, then the requestId and lastFrameNumber pair - * is added to the list mFrameNumberRequestPairs.</p> + * If lastFrameNumber is non-negative, then the requestId and lastFrameNumber as the last + * regular frame number will be added to the list mRequestLastFrameNumbersList.</p> * * @param requestId the request ID of the current repeating request. * @@ -693,10 +693,6 @@ public class CameraDeviceImpl extends CameraDevice { "early trigger sequence complete for request %d", requestId)); } - if (lastFrameNumber < Integer.MIN_VALUE - || lastFrameNumber > Integer.MAX_VALUE) { - throw new AssertionError(lastFrameNumber + " cannot be cast to int"); - } holder.getCallback().onCaptureSequenceAborted( CameraDeviceImpl.this, requestId); @@ -710,9 +706,11 @@ public class CameraDeviceImpl extends CameraDevice { requestId)); } } else { - mFrameNumberRequestPairs.add( - new SimpleEntry<Long, Integer>(lastFrameNumber, - requestId)); + // This function is only called for regular request so lastFrameNumber is the last + // regular frame number. + mRequestLastFrameNumbersList.add(new RequestLastFrameNumbersHolder(requestId, + lastFrameNumber)); + // It is possible that the last frame has already arrived, so we need to check // for sequence completion right away checkAndFireSequenceComplete(); @@ -779,8 +777,8 @@ public class CameraDeviceImpl extends CameraDevice { } mRepeatingRequestId = requestId; } else { - mFrameNumberRequestPairs.add( - new SimpleEntry<Long, Integer>(lastFrameNumber, requestId)); + mRequestLastFrameNumbersList.add(new RequestLastFrameNumbersHolder(requestList, + requestId, lastFrameNumber)); } if (mIdle) { @@ -1146,7 +1144,101 @@ public class CameraDeviceImpl extends CameraDevice { public int getSessionId() { return mSessionId; } + } + + /** + * This class holds a capture ID and its expected last regular frame number and last reprocess + * frame number. + */ + static class RequestLastFrameNumbersHolder { + // request ID + private final int mRequestId; + // The last regular frame number for this request ID. It's + // CaptureCallback.NO_FRAMES_CAPTURED if the request ID has no regular request. + private final long mLastRegularFrameNumber; + // The last reprocess frame number for this request ID. It's + // CaptureCallback.NO_FRAMES_CAPTURED if the request ID has no reprocess request. + private final long mLastReprocessFrameNumber; + + /** + * Create a request-last-frame-numbers holder with a list of requests, request ID, and + * the last frame number returned by camera service. + */ + public RequestLastFrameNumbersHolder(List<CaptureRequest> requestList, int requestId, + long lastFrameNumber) { + long lastRegularFrameNumber = CaptureCallback.NO_FRAMES_CAPTURED; + long lastReprocessFrameNumber = CaptureCallback.NO_FRAMES_CAPTURED; + long frameNumber = lastFrameNumber; + + if (lastFrameNumber < requestList.size() - 1) { + throw new IllegalArgumentException("lastFrameNumber: " + lastFrameNumber + + " should be at least " + (requestList.size() - 1) + " for the number of " + + " requests in the list: " + requestList.size()); + } + + // find the last regular frame number and the last reprocess frame number + for (int i = requestList.size() - 1; i >= 0; i--) { + CaptureRequest request = requestList.get(i); + if (request.isReprocess() && lastReprocessFrameNumber == + CaptureCallback.NO_FRAMES_CAPTURED) { + lastReprocessFrameNumber = frameNumber; + } else if (!request.isReprocess() && lastRegularFrameNumber == + CaptureCallback.NO_FRAMES_CAPTURED) { + lastRegularFrameNumber = frameNumber; + } + + if (lastReprocessFrameNumber != CaptureCallback.NO_FRAMES_CAPTURED && + lastRegularFrameNumber != CaptureCallback.NO_FRAMES_CAPTURED) { + break; + } + + frameNumber--; + } + + mLastRegularFrameNumber = lastRegularFrameNumber; + mLastReprocessFrameNumber = lastReprocessFrameNumber; + mRequestId = requestId; + } + + /** + * Create a request-last-frame-numbers holder with a request ID and last regular frame + * number. + */ + public RequestLastFrameNumbersHolder(int requestId, long lastRegularFrameNumber) { + mLastRegularFrameNumber = lastRegularFrameNumber; + mLastReprocessFrameNumber = CaptureCallback.NO_FRAMES_CAPTURED; + mRequestId = requestId; + } + + /** + * Return the last regular frame number. Return CaptureCallback.NO_FRAMES_CAPTURED if + * it contains no regular request. + */ + public long getLastRegularFrameNumber() { + return mLastRegularFrameNumber; + } + + /** + * Return the last reprocess frame number. Return CaptureCallback.NO_FRAMES_CAPTURED if + * it contains no reprocess request. + */ + public long getLastReprocessFrameNumber() { + return mLastReprocessFrameNumber; + } + /** + * Return the last frame number overall. + */ + public long getLastFrameNumber() { + return Math.max(mLastRegularFrameNumber, mLastReprocessFrameNumber); + } + + /** + * Return the request ID. + */ + public int getRequestId() { + return mRequestId; + } } /** @@ -1154,8 +1246,8 @@ public class CameraDeviceImpl extends CameraDevice { */ public class FrameNumberTracker { - private long mCompletedFrameNumber = -1; - private long mCompletedReprocessFrameNumber = -1; + private long mCompletedFrameNumber = CaptureCallback.NO_FRAMES_CAPTURED; + private long mCompletedReprocessFrameNumber = CaptureCallback.NO_FRAMES_CAPTURED; /** the skipped frame numbers that belong to regular results */ private final LinkedList<Long> mSkippedRegularFrameNumbers = new LinkedList<Long>(); /** the skipped frame numbers that belong to reprocess results */ @@ -1360,11 +1452,11 @@ public class CameraDeviceImpl extends CameraDevice { long completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); long completedReprocessFrameNumber = mFrameNumberTracker.getCompletedReprocessFrameNumber(); boolean isReprocess = false; - Iterator<SimpleEntry<Long, Integer> > iter = mFrameNumberRequestPairs.iterator(); + Iterator<RequestLastFrameNumbersHolder> iter = mRequestLastFrameNumbersList.iterator(); while (iter.hasNext()) { - final SimpleEntry<Long, Integer> frameNumberRequestPair = iter.next(); + final RequestLastFrameNumbersHolder requestLastFrameNumbers = iter.next(); boolean sequenceCompleted = false; - final int requestId = frameNumberRequestPair.getValue(); + final int requestId = requestLastFrameNumbers.getRequestId(); final CaptureCallbackHolder holder; synchronized(mInterfaceLock) { if (mRemoteDevice == null) { @@ -1376,19 +1468,22 @@ public class CameraDeviceImpl extends CameraDevice { holder = (index >= 0) ? mCaptureCallbackMap.valueAt(index) : null; if (holder != null) { - isReprocess = holder.getRequest().isReprocess(); + long lastRegularFrameNumber = + requestLastFrameNumbers.getLastRegularFrameNumber(); + long lastReprocessFrameNumber = + requestLastFrameNumbers.getLastReprocessFrameNumber(); + // check if it's okay to remove request from mCaptureCallbackMap - if ((isReprocess && frameNumberRequestPair.getKey() <= - completedReprocessFrameNumber) || (!isReprocess && - frameNumberRequestPair.getKey() <= completedFrameNumber)) { + if (lastRegularFrameNumber <= completedFrameNumber && + lastReprocessFrameNumber <= completedReprocessFrameNumber) { sequenceCompleted = true; mCaptureCallbackMap.removeAt(index); if (DEBUG) { Log.v(TAG, String.format( - "remove holder for requestId %d, " - + "because lastFrame %d is <= %d", - requestId, frameNumberRequestPair.getKey(), - completedFrameNumber)); + "Remove holder for requestId %d, because lastRegularFrame %d " + + "is <= %d and lastReprocessFrame %d is <= %d", requestId, + lastRegularFrameNumber, completedFrameNumber, + lastReprocessFrameNumber, completedReprocessFrameNumber)); } } } @@ -1412,16 +1507,10 @@ public class CameraDeviceImpl extends CameraDevice { requestId)); } - long lastFrameNumber = frameNumberRequestPair.getKey(); - if (lastFrameNumber < Integer.MIN_VALUE - || lastFrameNumber > Integer.MAX_VALUE) { - throw new AssertionError(lastFrameNumber - + " cannot be cast to int"); - } holder.getCallback().onCaptureSequenceCompleted( CameraDeviceImpl.this, requestId, - lastFrameNumber); + requestLastFrameNumbers.getLastFrameNumber()); } } }; diff --git a/core/java/android/hardware/usb/IUsbManager.aidl b/core/java/android/hardware/usb/IUsbManager.aidl index 9bc967fe3c4a..e4ab3f244536 100644 --- a/core/java/android/hardware/usb/IUsbManager.aidl +++ b/core/java/android/hardware/usb/IUsbManager.aidl @@ -85,9 +85,6 @@ interface IUsbManager /* Sets the current USB function. */ void setCurrentFunction(String function, boolean makeDefault); - /* Sets the file path for USB mass storage backing file. */ - void setMassStorageBackingFile(String path); - /* Allow USB debugging from the attached host. If alwaysAllow is true, add the * the public key to list of host keys that the user has approved. */ diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java index f283051caa42..a45d4cae9270 100644 --- a/core/java/android/hardware/usb/UsbManager.java +++ b/core/java/android/hardware/usb/UsbManager.java @@ -410,28 +410,6 @@ public class UsbManager { } } - private static boolean propertyContainsFunction(String property, String function) { - String functions = SystemProperties.get(property, ""); - int index = functions.indexOf(function); - if (index < 0) return false; - if (index > 0 && functions.charAt(index - 1) != ',') return false; - int charAfter = index + function.length(); - if (charAfter < functions.length() && functions.charAt(charAfter) != ',') return false; - return true; - } - - /** - * Returns true if the specified USB function is currently enabled. - * - * @param function name of the USB function - * @return true if the USB function is enabled. - * - * {@hide} - */ - public boolean isFunctionEnabled(String function) { - return propertyContainsFunction("sys.usb.config", function); - } - /** * Returns the current default USB function. * @@ -465,19 +443,4 @@ public class UsbManager { Log.e(TAG, "RemoteException in setCurrentFunction", e); } } - - /** - * Sets the file path for USB mass storage backing file. - * - * @param path backing file path - * - * {@hide} - */ - public void setMassStorageBackingFile(String path) { - try { - mService.setMassStorageBackingFile(path); - } catch (RemoteException e) { - Log.e(TAG, "RemoteException in setDefaultFunction", e); - } - } } diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 36fc4f960d80..50eed3e9df7e 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -173,6 +173,27 @@ public class Build { "ro.build.version.sdk", 0); /** + * The developer preview revision of a prerelease SDK. This value will always + * be <code>0</code> on production platform builds/devices. + * + * <p>When this value is nonzero, any new API added since the last + * officially published {@link #SDK_INT API level} is only guaranteed to be present + * on that specific preview revision. For example, an API <code>Activity.fooBar()</code> + * might be present in preview revision 1 but renamed or removed entirely in + * preview revision 2, which may cause an app attempting to call it to crash + * at runtime.</p> + * + * <p>Experimental apps targeting preview APIs should check this value for + * equality (<code>==</code>) with the preview SDK revision they were built for + * before using any prerelease platform APIs. Apps that detect a preview SDK revision + * other than the specific one they expect should fall back to using APIs from + * the previously published API level only to avoid unwanted runtime exceptions. + * </p> + */ + public static final int PREVIEW_SDK_INT = SystemProperties.getInt( + "ro.build.version.preview_sdk", 0); + + /** * The current development codename, or the string "REL" if this is * a release build. */ diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 4aff7a1835a7..19c8fa9da1f9 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -169,6 +169,65 @@ public final class Debug public int otherSwappedOut; /** @hide */ + public static final int HEAP_UNKNOWN = 0; + /** @hide */ + public static final int HEAP_DALVIK = 1; + /** @hide */ + public static final int HEAP_NATIVE = 2; + + /** @hide */ + public static final int OTHER_DALVIK_OTHER = 0; + /** @hide */ + public static final int OTHER_STACK = 1; + /** @hide */ + public static final int OTHER_CURSOR = 2; + /** @hide */ + public static final int OTHER_ASHMEM = 3; + /** @hide */ + public static final int OTHER_GL_DEV = 4; + /** @hide */ + public static final int OTHER_UNKNOWN_DEV = 5; + /** @hide */ + public static final int OTHER_SO = 6; + /** @hide */ + public static final int OTHER_JAR = 7; + /** @hide */ + public static final int OTHER_APK = 8; + /** @hide */ + public static final int OTHER_TTF = 9; + /** @hide */ + public static final int OTHER_DEX = 10; + /** @hide */ + public static final int OTHER_OAT = 11; + /** @hide */ + public static final int OTHER_ART = 12; + /** @hide */ + public static final int OTHER_UNKNOWN_MAP = 13; + /** @hide */ + public static final int OTHER_GRAPHICS = 14; + /** @hide */ + public static final int OTHER_GL = 15; + /** @hide */ + public static final int OTHER_OTHER_MEMTRACK = 16; + + /** @hide */ + public static final int OTHER_DALVIK_NORMAL = 17; + /** @hide */ + public static final int OTHER_DALVIK_LARGE = 18; + /** @hide */ + public static final int OTHER_DALVIK_LINEARALLOC = 19; + /** @hide */ + public static final int OTHER_DALVIK_ACCOUNTING = 20; + /** @hide */ + public static final int OTHER_DALVIK_CODE_CACHE = 21; + /** @hide */ + public static final int OTHER_DALVIK_ZYGOTE = 22; + /** @hide */ + public static final int OTHER_DALVIK_NON_MOVING = 23; + /** @hide */ + public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24; + + /** @hide */ public static final int NUM_OTHER_STATS = 17; /** @hide */ @@ -284,6 +343,11 @@ public final class Debug } /** @hide */ + public int getOtherPrivate(int which) { + return getOtherPrivateClean(which) + getOtherPrivateDirty(which); + } + + /** @hide */ public int getOtherSharedClean(int which) { return otherStats[which*NUM_CATEGORIES + offsetSharedClean]; } @@ -296,35 +360,157 @@ public final class Debug /** @hide */ public static String getOtherLabel(int which) { switch (which) { - case 0: return "Dalvik Other"; - case 1: return "Stack"; - case 2: return "Cursor"; - case 3: return "Ashmem"; - case 4: return "Gfx dev"; - case 5: return "Other dev"; - case 6: return ".so mmap"; - case 7: return ".jar mmap"; - case 8: return ".apk mmap"; - case 9: return ".ttf mmap"; - case 10: return ".dex mmap"; - case 11: return ".oat mmap"; - case 12: return ".art mmap"; - case 13: return "Other mmap"; - case 14: return "EGL mtrack"; - case 15: return "GL mtrack"; - case 16: return "Other mtrack"; - case 17: return ".Heap"; - case 18: return ".LOS"; - case 19: return ".LinearAlloc"; - case 20: return ".GC"; - case 21: return ".JITCache"; - case 22: return ".Zygote"; - case 23: return ".NonMoving"; - case 24: return ".IndirectRef"; + case OTHER_DALVIK_OTHER: return "Dalvik Other"; + case OTHER_STACK: return "Stack"; + case OTHER_CURSOR: return "Cursor"; + case OTHER_ASHMEM: return "Ashmem"; + case OTHER_GL_DEV: return "Gfx dev"; + case OTHER_UNKNOWN_DEV: return "Other dev"; + case OTHER_SO: return ".so mmap"; + case OTHER_JAR: return ".jar mmap"; + case OTHER_APK: return ".apk mmap"; + case OTHER_TTF: return ".ttf mmap"; + case OTHER_DEX: return ".dex mmap"; + case OTHER_OAT: return ".oat mmap"; + case OTHER_ART: return ".art mmap"; + case OTHER_UNKNOWN_MAP: return "Other mmap"; + case OTHER_GRAPHICS: return "EGL mtrack"; + case OTHER_GL: return "GL mtrack"; + case OTHER_OTHER_MEMTRACK: return "Other mtrack"; + case OTHER_DALVIK_NORMAL: return ".Heap"; + case OTHER_DALVIK_LARGE: return ".LOS"; + case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc"; + case OTHER_DALVIK_ACCOUNTING: return ".GC"; + case OTHER_DALVIK_CODE_CACHE: return ".JITCache"; + case OTHER_DALVIK_ZYGOTE: return ".Zygote"; + case OTHER_DALVIK_NON_MOVING: return ".NonMoving"; + case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; default: return "????"; } } + /** + * Pss of Java Heap bytes in KB due to the application. + * Notes: + * * OTHER_ART is the boot image. Anything private here is blamed on + * the application, not the system. + * * dalvikPrivateDirty includes private zygote, which means the + * application dirtied something allocated by the zygote. We blame + * the application for that memory, not the system. + * * Does not include OTHER_DALVIK_OTHER, which is considered VM + * Overhead and lumped into Private Other. + * * We don't include dalvikPrivateClean, because there should be no + * such thing as private clean for the Java Heap. + * @hide + */ + public int getSummaryJavaHeap() { + return dalvikPrivateDirty + getOtherPrivate(OTHER_ART); + } + + /** + * Pss of Native Heap bytes in KB due to the application. + * Notes: + * * Includes private dirty malloc space. + * * We don't include nativePrivateClean, because there should be no + * such thing as private clean for the Native Heap. + * @hide + */ + public int getSummaryNativeHeap() { + return nativePrivateDirty; + } + + /** + * Pss of code and other static resource bytes in KB due to + * the application. + * @hide + */ + public int getSummaryCode() { + return getOtherPrivate(OTHER_SO) + + getOtherPrivate(OTHER_JAR) + + getOtherPrivate(OTHER_APK) + + getOtherPrivate(OTHER_TTF) + + getOtherPrivate(OTHER_DEX) + + getOtherPrivate(OTHER_OAT); + } + + /** + * Pss in KB of the stack due to the application. + * Notes: + * * Includes private dirty stack, which includes both Java and Native + * stack. + * * Does not include private clean stack, because there should be no + * such thing as private clean for the stack. + * @hide + */ + public int getSummaryStack() { + return getOtherPrivateDirty(OTHER_STACK); + } + + /** + * Pss in KB of graphics due to the application. + * Notes: + * * Includes private Gfx, EGL, and GL. + * * Warning: These numbers can be misreported by the graphics drivers. + * * We don't include shared graphics. It may make sense to, because + * shared graphics are likely buffers due to the application + * anyway, but it's simpler to implement to just group all shared + * memory into the System category. + * @hide + */ + public int getSummaryGraphics() { + return getOtherPrivate(OTHER_GL_DEV) + + getOtherPrivate(OTHER_GRAPHICS) + + getOtherPrivate(OTHER_GL); + } + + /** + * Pss in KB due to the application that haven't otherwise been + * accounted for. + * @hide + */ + public int getSummaryPrivateOther() { + return getTotalPrivateClean() + + getTotalPrivateDirty() + - getSummaryJavaHeap() + - getSummaryNativeHeap() + - getSummaryCode() + - getSummaryStack() + - getSummaryGraphics(); + } + + /** + * Pss in KB due to the system. + * Notes: + * * Includes all shared memory. + * @hide + */ + public int getSummarySystem() { + return getTotalPss() + - getTotalPrivateClean() + - getTotalPrivateDirty(); + } + + /** + * Total Pss in KB. + * @hide + */ + public int getSummaryTotalPss() { + return getTotalPss(); + } + + /** + * Total Swap in KB. + * Notes: + * * Some of this memory belongs in other categories, but we don't + * know if the Swap memory is shared or private, so we don't know + * what to blame on the application and what on the system. + * For now, just lump all the Swap in one place. + * @hide + */ + public int getSummaryTotalSwap() { + return getTotalSwappedOut(); + } + public int describeContents() { return 0; } diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl index c2fd3c3582fd..f212daff29f0 100644 --- a/core/java/android/os/IUserManager.aidl +++ b/core/java/android/os/IUserManager.aidl @@ -45,13 +45,12 @@ interface IUserManager { Bundle getUserRestrictions(int userHandle); boolean hasUserRestriction(in String restrictionKey, int userHandle); void setUserRestrictions(in Bundle restrictions, int userHandle); + void setUserRestriction(String key, boolean value, int userId); + void setSystemControlledUserRestriction(String key, boolean value, int userId); void setApplicationRestrictions(in String packageName, in Bundle restrictions, int userHandle); Bundle getApplicationRestrictions(in String packageName); Bundle getApplicationRestrictionsForUser(in String packageName, int userHandle); - boolean setRestrictionsChallenge(in String newPin); - int checkRestrictionsChallenge(in String pin); - boolean hasRestrictionsChallenge(); void removeRestrictions(); void setDefaultGuestRestrictions(in Bundle restrictions); Bundle getDefaultGuestRestrictions(); diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 44eb1edc47ea..cc37d5e5eec1 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -412,6 +412,16 @@ public class UserManager { public static final String DISALLOW_SAFE_BOOT = "no_safe_boot"; /** + * Specifies if a user is not allowed to record audio. This restriction is always enabled for + * background users. The default value is <code>false</code>. + * + * @see #setUserRestrictions(Bundle) + * @see #getUserRestrictions() + * @hide + */ + public static final String DISALLOW_RECORD_AUDIO = "no_record_audio"; + + /** * Application restriction key that is used to indicate the pending arrival * of real restrictions for the app. * @@ -688,9 +698,11 @@ public class UserManager { */ @Deprecated public void setUserRestriction(String key, boolean value, UserHandle userHandle) { - Bundle bundle = getUserRestrictions(userHandle); - bundle.putBoolean(key, value); - setUserRestrictions(bundle, userHandle); + try { + mService.setUserRestriction(key, value, userHandle.getIdentifier()); + } catch (RemoteException re) { + Log.w(TAG, "Could not set user restriction", re); + } } /** @@ -744,7 +756,7 @@ public class UserManager { * @see #getSerialNumberForUser(UserHandle) */ public UserHandle getUserForSerialNumber(long serialNumber) { - int ident = getUserHandle((int)serialNumber); + int ident = getUserHandle((int) serialNumber); return ident >= 0 ? new UserHandle(ident) : null; } @@ -1252,49 +1264,10 @@ public class UserManager { * apps and requires the MANAGE_USERS permission. * @param newPin the PIN to use for challenge dialogs. * @return Returns true if the challenge PIN was set successfully. + * @deprecated The restrictions PIN functionality is no longer provided by the system. + * This method is preserved for backwards compatibility reasons and always returns false. */ public boolean setRestrictionsChallenge(String newPin) { - try { - return mService.setRestrictionsChallenge(newPin); - } catch (RemoteException re) { - Log.w(TAG, "Could not change restrictions pin"); - } - return false; - } - - /** - * @hide - * @param pin The PIN to verify, or null to get the number of milliseconds to wait for before - * allowing the user to enter the PIN. - * @return Returns a positive number (including zero) for how many milliseconds before - * you can accept another PIN, when the input is null or the input doesn't match the saved PIN. - * Returns {@link #PIN_VERIFICATION_SUCCESS} if the input matches the saved PIN. Returns - * {@link #PIN_VERIFICATION_FAILED_NOT_SET} if there is no PIN set. - */ - public int checkRestrictionsChallenge(String pin) { - try { - return mService.checkRestrictionsChallenge(pin); - } catch (RemoteException re) { - Log.w(TAG, "Could not check restrictions pin"); - } - return PIN_VERIFICATION_FAILED_INCORRECT; - } - - /** - * @hide - * Checks whether the user has restrictions that are PIN-protected. An application that - * participates in restrictions can check if the owner has requested a PIN challenge for - * any restricted operations. If there is a PIN in effect, the application should launch - * the PIN challenge activity {@link android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE}. - * @see android.content.Intent#ACTION_RESTRICTIONS_CHALLENGE - * @return whether a restrictions PIN is in effect. - */ - public boolean hasRestrictionsChallenge() { - try { - return mService.hasRestrictionsChallenge(); - } catch (RemoteException re) { - Log.w(TAG, "Could not change restrictions pin"); - } return false; } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 293cf6fe3ef2..dc70d7bd0e34 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -324,23 +324,7 @@ public final class Settings { "android.settings.BLUETOOTH_SETTINGS"; /** - * Activity Action: Show settings to allow configuration of Wifi Displays. - * <p> - * In some cases, a matching Activity may not exist, so ensure you - * safeguard against this. - * <p> - * Input: Nothing. - * <p> - * Output: Nothing. - * @hide - */ - @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) - public static final String ACTION_WIFI_DISPLAY_SETTINGS = - "android.settings.WIFI_DISPLAY_SETTINGS"; - - /** - * Activity Action: Show settings to allow configuration of - * {@link android.media.routing.MediaRouteService media route providers}. + * Activity Action: Show settings to allow configuration of cast endpoints. * <p> * In some cases, a matching Activity may not exist, so ensure you * safeguard against this. @@ -825,6 +809,18 @@ public final class Settings { = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS"; /** + * Activity Action: Show Do Not Disturb access settings. + * <p> + * In some cases, a matching Activity may not exist, so ensure you safeguard against this. + * <p> + * Input: Nothing. + * <p> + * Output: Nothing. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_ZEN_ACCESS_SETTINGS = "android.settings.ZEN_ACCESS_SETTINGS"; + + /** * @hide */ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) @@ -5951,6 +5947,12 @@ public final class Settings { "wireless_charging_started_sound"; /** + * Whether to play a sound for charging events. + * @hide + */ + public static final String CHARGING_SOUNDS_ENABLED = "charging_sounds_enabled"; + + /** * Whether we keep the device on while the device is plugged in. * Supported values are: * <ul> @@ -6166,6 +6168,17 @@ public final class Settings { */ public static final String MOBILE_DATA = "mobile_data"; + /** + * Whether the mobile data connection should remain active even when higher + * priority networks like WiFi are active, to help make network switching faster. + * + * See ConnectivityService for more info. + * + * (0 = disabled, 1 = enabled) + * @hide + */ + public static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on"; + /** {@hide} */ public static final String NETSTATS_ENABLED = "netstats_enabled"; /** {@hide} */ diff --git a/core/java/android/security/IKeystoreService.aidl b/core/java/android/security/IKeystoreService.aidl index 579cdbeb40f4..4809050f3197 100644 --- a/core/java/android/security/IKeystoreService.aidl +++ b/core/java/android/security/IKeystoreService.aidl @@ -37,9 +37,9 @@ interface IKeystoreService { int exist(String name, int uid); String[] saw(String namePrefix, int uid); int reset(); - int password(String password); + int onUserPasswordChanged(int userId, String newPassword); int lock(); - int unlock(String password); + int unlock(int userId, String userPassword); int zero(); int generate(String name, int uid, int keyType, int keySize, int flags, in KeystoreArguments args); diff --git a/core/java/android/service/chooser/ChooserTarget.java b/core/java/android/service/chooser/ChooserTarget.java index f0ca276f11f2..4c94ee7ca23c 100644 --- a/core/java/android/service/chooser/ChooserTarget.java +++ b/core/java/android/service/chooser/ChooserTarget.java @@ -58,12 +58,6 @@ public final class ChooserTarget implements Parcelable { private IntentSender mIntentSender; /** - * A raw intent provided in lieu of an IntentSender. Will be filled in and sent - * by {@link #sendIntent(Context, Intent)}. - */ - private Intent mIntent; - - /** * The score given to this item. It can be normalized. */ private float mScore; @@ -146,43 +140,6 @@ public final class ChooserTarget implements Parcelable { mIntentSender = intentSender; } - /** - * Construct a deep link target for presentation by a chooser UI. - * - * <p>A target is composed of a title and an icon for presentation to the user. - * The UI presenting this target may truncate the title if it is too long to be presented - * in the available space, as well as crop, resize or overlay the supplied icon.</p> - * - * <p>The creator of a target may supply a ranking score. This score is assumed to be relative - * to the other targets supplied by the same - * {@link ChooserTargetService#onGetChooserTargets(ComponentName, IntentFilter) query}. - * Scores should be in the range from 0.0f (unlikely match) to 1.0f (very relevant match). - * Scores for a set of targets do not need to sum to 1.</p> - * - * <p>Before being sent, the Intent supplied will be - * {@link Intent#fillIn(Intent, int) filled in} by the Intent originally supplied - * to the chooser.</p> - * - * <p>Take care not to place custom {@link android.os.Parcelable} types into - * the Intent as extras, as the system will not be able to unparcel it to merge - * additional extras.</p> - * - * @param title title of this target that will be shown to a user - * @param icon icon to represent this target - * @param score ranking score for this target between 0.0f and 1.0f, inclusive - * @param intent Intent to fill in and send if the user chooses this target - */ - public ChooserTarget(CharSequence title, Bitmap icon, float score, Intent intent) { - mTitle = title; - mIcon = icon; - if (score > 1.f || score < 0.f) { - throw new IllegalArgumentException("Score " + score + " out of range; " - + "must be between 0.0f and 1.0f"); - } - mScore = score; - mIntent = intent; - } - ChooserTarget(Parcel in) { mTitle = in.readCharSequence(); if (in.readInt() != 0) { @@ -192,9 +149,6 @@ public final class ChooserTarget implements Parcelable { } mScore = in.readFloat(); mIntentSender = IntentSender.readIntentSenderOrNullFromParcel(in); - if (in.readInt() != 0) { - mIntent = Intent.CREATOR.createFromParcel(in); - } } /** @@ -241,18 +195,6 @@ public final class ChooserTarget implements Parcelable { } /** - * Returns the Intent supplied by the ChooserTarget's creator. - * This may be null if the creator specified an IntentSender or PendingIntent instead. - * - * <p>To fill in and send the intent, see {@link #sendIntent(Context, Intent)}.</p> - * - * @return the Intent supplied by the ChooserTarget's creator - */ - public Intent getIntent() { - return mIntent; - } - - /** * Fill in the IntentSender supplied by the ChooserTarget's creator and send it. * * @param context the sending Context; generally the Activity presenting the chooser UI @@ -272,91 +214,8 @@ public final class ChooserTarget implements Parcelable { Log.e(TAG, "sendIntent " + this + " failed", e); return false; } - } else if (mIntent != null) { - try { - final Intent toSend = new Intent(mIntent); - toSend.fillIn(fillInIntent, 0); - context.startActivity(toSend); - return true; - } catch (Exception e) { - Log.e(TAG, "sendIntent " + this + " failed", e); - return false; - } } else { - Log.e(TAG, "sendIntent " + this + " failed - no IntentSender or Intent to send"); - return false; - } - } - - /** - * Same as {@link #sendIntent(Context, Intent)}, but offers a userId field to use - * for launching the {@link #getIntent() intent} using - * {@link Activity#startActivityAsCaller(Intent, Bundle, int)} if the - * {@link #getIntentSender() IntentSender} is not present. If the IntentSender is present, - * it will be invoked as usual with its own calling identity. - * - * @hide internal use only. - */ - public boolean sendIntentAsCaller(Activity context, Intent fillInIntent, int userId) { - if (fillInIntent != null) { - fillInIntent.migrateExtraStreamToClipData(); - fillInIntent.prepareToLeaveProcess(); - } - if (mIntentSender != null) { - try { - mIntentSender.sendIntent(context, 0, fillInIntent, null, null); - return true; - } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "sendIntent " + this + " failed", e); - return false; - } - } else if (mIntent != null) { - try { - final Intent toSend = new Intent(mIntent); - toSend.fillIn(fillInIntent, 0); - context.startActivityAsCaller(toSend, null, userId); - return true; - } catch (Exception e) { - Log.e(TAG, "sendIntent " + this + " failed", e); - return false; - } - } else { - Log.e(TAG, "sendIntent " + this + " failed - no IntentSender or Intent to send"); - return false; - } - } - - /** - * The UserHandle is only used if we're launching a raw intent. The IntentSender will be - * launched with its associated identity. - * - * @hide Internal use only - */ - public boolean sendIntentAsUser(Activity context, Intent fillInIntent, UserHandle user) { - if (fillInIntent != null) { - fillInIntent.migrateExtraStreamToClipData(); - fillInIntent.prepareToLeaveProcess(); - } - if (mIntentSender != null) { - try { - mIntentSender.sendIntent(context, 0, fillInIntent, null, null); - return true; - } catch (IntentSender.SendIntentException e) { - Log.e(TAG, "sendIntent " + this + " failed", e); - return false; - } - } else if (mIntent != null) { - try { - final Intent toSend = new Intent(mIntent); - toSend.fillIn(fillInIntent, 0); - context.startActivityAsUser(toSend, user); - return true; - } catch (Exception e) { - Log.e(TAG, "sendIntent " + this + " failed", e); - return false; - } - } else { - Log.e(TAG, "sendIntent " + this + " failed - no IntentSender or Intent to send"); + Log.e(TAG, "sendIntent " + this + " failed - no IntentSender to send"); return false; } } @@ -364,7 +223,7 @@ public final class ChooserTarget implements Parcelable { @Override public String toString() { return "ChooserTarget{" - + (mIntentSender != null ? mIntentSender.getCreatorPackage() : mIntent) + + (mIntentSender != null ? mIntentSender.getCreatorPackage() : null) + ", " + "'" + mTitle + "', " + mScore + "}"; @@ -386,10 +245,6 @@ public final class ChooserTarget implements Parcelable { } dest.writeFloat(mScore); IntentSender.writeIntentSenderOrNullToParcel(mIntentSender, dest); - dest.writeInt(mIntent != null ? 1 : 0); - if (mIntent != null) { - mIntent.writeToParcel(dest, 0); - } } public static final Creator<ChooserTarget> CREATOR diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java index 29aaf307cb14..01718694e811 100644 --- a/core/java/android/service/dreams/DreamService.java +++ b/core/java/android/service/dreams/DreamService.java @@ -40,7 +40,7 @@ import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; -import android.view.PhoneWindow; +import com.android.internal.policy.PhoneWindow; import android.view.SearchEvent; import android.view.View; import android.view.ViewGroup; diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java index 35b8819f3048..7956a3f16ce7 100644 --- a/core/java/android/service/notification/NotificationListenerService.java +++ b/core/java/android/service/notification/NotificationListenerService.java @@ -21,7 +21,7 @@ import android.annotation.SdkConstant; import android.app.INotificationManager; import android.app.Notification; import android.app.Notification.Builder; -import android.app.NotificationManager.Policy; +import android.app.NotificationManager; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -64,25 +64,29 @@ public abstract class NotificationListenerService extends Service { * {@link #getCurrentInterruptionFilter() Interruption filter} constant - * Normal interruption filter. */ - public static final int INTERRUPTION_FILTER_ALL = 1; + public static final int INTERRUPTION_FILTER_ALL + = NotificationManager.INTERRUPTION_FILTER_ALL; /** * {@link #getCurrentInterruptionFilter() Interruption filter} constant - * Priority interruption filter. */ - public static final int INTERRUPTION_FILTER_PRIORITY = 2; + public static final int INTERRUPTION_FILTER_PRIORITY + = NotificationManager.INTERRUPTION_FILTER_PRIORITY; /** * {@link #getCurrentInterruptionFilter() Interruption filter} constant - * No interruptions filter. */ - public static final int INTERRUPTION_FILTER_NONE = 3; + public static final int INTERRUPTION_FILTER_NONE + = NotificationManager.INTERRUPTION_FILTER_NONE; /** * {@link #getCurrentInterruptionFilter() Interruption filter} constant - * Alarms only interruption filter. */ - public static final int INTERRUPTION_FILTER_ALARMS = 4; + public static final int INTERRUPTION_FILTER_ALARMS + = NotificationManager.INTERRUPTION_FILTER_ALARMS; /** {@link #getCurrentInterruptionFilter() Interruption filter} constant - returned when * the value is unavailable for any reason. For example, before the notification listener @@ -90,7 +94,8 @@ public abstract class NotificationListenerService extends Service { * * {@see #onListenerConnected()} */ - public static final int INTERRUPTION_FILTER_UNKNOWN = 0; + public static final int INTERRUPTION_FILTER_UNKNOWN + = NotificationManager.INTERRUPTION_FILTER_UNKNOWN; /** {@link #getCurrentListenerHints() Listener hints} constant - the primary device UI * should disable notification sound, vibrating and other visual or aural effects. @@ -516,22 +521,6 @@ public abstract class NotificationListenerService extends Service { } /** - * Gets the notification policy token associated with this listener. - * - * <p> - * Returns null if this listener is not currently active. - */ - public final Policy.Token getNotificationPolicyToken() { - if (!isBound()) return null; - try { - return getNotificationInterface().getPolicyTokenFromListener(mWrapper); - } catch (android.os.RemoteException ex) { - Log.v(TAG, "Unable to contact notification manager", ex); - return null; - } - } - - /** * Sets the desired {@link #getCurrentListenerHints() listener hints}. * * <p> diff --git a/core/java/android/service/notification/ZenModeConfig.java b/core/java/android/service/notification/ZenModeConfig.java index 26bd10f45f37..599ac74336b7 100644 --- a/core/java/android/service/notification/ZenModeConfig.java +++ b/core/java/android/service/notification/ZenModeConfig.java @@ -538,7 +538,7 @@ public class ZenModeConfig implements Parcelable { } priorityCallSenders = sourceToPrioritySenders(allowCallsFrom, priorityCallSenders); priorityMessageSenders = sourceToPrioritySenders(allowMessagesFrom, priorityMessageSenders); - return new Policy(priorityCategories, priorityCallSenders); + return new Policy(priorityCategories, priorityCallSenders, priorityMessageSenders); } private static int sourceToPrioritySenders(int source, int def) { @@ -567,7 +567,9 @@ public class ZenModeConfig implements Parcelable { allowReminders = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_REMINDERS) != 0; allowRepeatCallers = (policy.priorityCategories & Policy.PRIORITY_CATEGORY_REPEAT_CALLERS) != 0; - allowCallsFrom = prioritySendersToSource(policy.prioritySenders, allowCallsFrom); + allowCallsFrom = prioritySendersToSource(policy.priorityCallSenders, allowCallsFrom); + allowMessagesFrom = prioritySendersToSource(policy.priorityMessageSenders, + allowMessagesFrom); } public static Condition toTimeCondition(Context context, int minutesFromNow, int userHandle) { @@ -733,17 +735,20 @@ public class ZenModeConfig implements Parcelable { && conditionId.getPathSegments().get(0).equals(EVENT_PATH); if (!isEvent) return null; final EventInfo rt = new EventInfo(); - rt.calendar = tryParseLong(conditionId.getQueryParameter("calendar"), 0L); + rt.calendar = tryParseLong(conditionId.getQueryParameter("calendar"), + EventInfo.ANY_CALENDAR); rt.reply = tryParseInt(conditionId.getQueryParameter("reply"), 0); return rt; } public static class EventInfo { + public static final long ANY_CALENDAR = 0; + public static final int REPLY_ANY_EXCEPT_NO = 0; public static final int REPLY_YES_OR_MAYBE = 1; public static final int REPLY_YES = 2; - public long calendar; // CalendarContract.Calendars._ID, or 0 for any + public long calendar = ANY_CALENDAR; // CalendarContract.Calendars._ID, or ANY_CALENDAR public int reply; @Override diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java index cf29310cb604..3eeb04af7d10 100644 --- a/core/java/android/speech/tts/TextToSpeech.java +++ b/core/java/android/speech/tts/TextToSpeech.java @@ -1481,14 +1481,8 @@ public class TextToSpeech { // interface). // Sanitize locale using isLanguageAvailable. - int result = service.isLanguageAvailable( language, country, variant); - if (result >= LANG_AVAILABLE){ - if (result < LANG_COUNTRY_VAR_AVAILABLE) { - variant = ""; - if (result < LANG_COUNTRY_AVAILABLE) { - country = ""; - } - } + int result = service.isLanguageAvailable(language, country, variant); + if (result >= LANG_AVAILABLE) { // Get the default voice for the locale. String voiceName = service.getDefaultVoiceNameFor(language, country, variant); if (TextUtils.isEmpty(voiceName)) { @@ -1502,10 +1496,28 @@ public class TextToSpeech { return LANG_NOT_SUPPORTED; } + // Set the language/country/variant of the voice, so #getLanguage will return + // the currently set voice locale when called. + Voice voice = getVoice(service, voiceName); + String voiceLanguage = ""; + try { + voiceLanguage = voice.getLocale().getISO3Language(); + } catch (MissingResourceException e) { + Log.w(TAG, "Couldn't retrieve ISO 639-2/T language code for locale: " + + voice.getLocale(), e); + } + + String voiceCountry = ""; + try { + voiceCountry = voice.getLocale().getISO3Country(); + } catch (MissingResourceException e) { + Log.w(TAG, "Couldn't retrieve ISO 3166 country code for locale: " + + voice.getLocale(), e); + } mParams.putString(Engine.KEY_PARAM_VOICE_NAME, voiceName); - mParams.putString(Engine.KEY_PARAM_LANGUAGE, language); - mParams.putString(Engine.KEY_PARAM_COUNTRY, country); - mParams.putString(Engine.KEY_PARAM_VARIANT, variant); + mParams.putString(Engine.KEY_PARAM_LANGUAGE, voiceLanguage); + mParams.putString(Engine.KEY_PARAM_COUNTRY, voiceCountry); + mParams.putString(Engine.KEY_PARAM_VARIANT, voice.getLocale().getVariant()); } return result; } @@ -1654,20 +1666,32 @@ public class TextToSpeech { if (TextUtils.isEmpty(voiceName)) { return null; } - List<Voice> voices = service.getVoices(); - if (voices == null) { - return null; - } - for (Voice voice : voices) { - if (voice.getName().equals(voiceName)) { - return voice; - } - } - return null; + return getVoice(service, voiceName); } }, null, "getVoice"); } + + /** + * Returns a Voice instance of the voice with the given voice name. + * + * @return Voice instance with the given voice name, or {@code null} if not set or on error. + * + * @see Voice + */ + private Voice getVoice(ITextToSpeechService service, String voiceName) throws RemoteException { + List<Voice> voices = service.getVoices(); + if (voices == null) { + return null; + } + for (Voice voice : voices) { + if (voice.getName().equals(voiceName)) { + return voice; + } + } + return null; + } + /** * Returns a Voice instance that's the default voice for the default Text-to-speech language. * @return The default voice instance for the default language, or {@code null} if not set or @@ -1690,14 +1714,7 @@ public class TextToSpeech { // Sanitize the locale using isLanguageAvailable. int result = service.isLanguageAvailable(language, country, variant); - if (result >= LANG_AVAILABLE){ - if (result < LANG_COUNTRY_VAR_AVAILABLE) { - variant = ""; - if (result < LANG_COUNTRY_AVAILABLE) { - country = ""; - } - } - } else { + if (result < LANG_AVAILABLE) { // The default language is not supported. return null; } diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index 451abea951d6..59c7c6d34eb8 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -91,6 +91,7 @@ public class StaticLayout extends Layout { b.mEllipsizedWidth = width; b.mEllipsize = null; b.mMaxLines = Integer.MAX_VALUE; + b.mBreakStrategy = Layout.BREAK_STRATEGY_SIMPLE; b.mMeasuredText = MeasuredText.obtain(); return b; @@ -100,6 +101,8 @@ public class StaticLayout extends Layout { b.mPaint = null; b.mText = null; MeasuredText.recycle(b.mMeasuredText); + b.mMeasuredText = null; + nFinishBuilder(b.mNativePtr); sPool.release(b); } diff --git a/core/java/android/text/method/WordIterator.java b/core/java/android/text/method/WordIterator.java index 11226a98f753..c4dc5edc1592 100644 --- a/core/java/android/text/method/WordIterator.java +++ b/core/java/android/text/method/WordIterator.java @@ -95,6 +95,45 @@ public class WordIterator implements Selection.PositionIterator { } while (true); } + /** {@inheritDoc} */ + public boolean isBoundary(int offset) { + int shiftedOffset = offset - mOffsetShift; + checkOffsetIsValid(shiftedOffset); + return mIterator.isBoundary(shiftedOffset); + } + + /** + * Returns the position of next boundary after the given offset. Returns + * {@code DONE} if there is no boundary after the given offset. + * + * @param offset the given start position to search from. + * @return the position of the last boundary preceding the given offset. + */ + public int nextBoundary(int offset) { + int shiftedOffset = offset - mOffsetShift; + shiftedOffset = mIterator.following(shiftedOffset); + if (shiftedOffset == BreakIterator.DONE) { + return BreakIterator.DONE; + } + return shiftedOffset + mOffsetShift; + } + + /** + * Returns the position of boundary preceding the given offset or + * {@code DONE} if the given offset specifies the starting position. + * + * @param offset the given start position to search from. + * @return the position of the last boundary preceding the given offset. + */ + public int prevBoundary(int offset) { + int shiftedOffset = offset - mOffsetShift; + shiftedOffset = mIterator.preceding(shiftedOffset); + if (shiftedOffset == BreakIterator.DONE) { + return BreakIterator.DONE; + } + return shiftedOffset + mOffsetShift; + } + /** If <code>offset</code> is within a word, returns the index of the first character of that * word, otherwise returns BreakIterator.DONE. * diff --git a/core/java/android/transition/Transition.java b/core/java/android/transition/Transition.java index ebc2aac5242e..1b25505799da 100644 --- a/core/java/android/transition/Transition.java +++ b/core/java/android/transition/Transition.java @@ -1639,6 +1639,7 @@ public abstract class Transition implements Cloneable { for (int i = 0; i < count; i++) { TransitionValues values = lookIn.get(i); if (values == null) { + // Null values are always added to the end of the list, so we know to stop now. return null; } if (values.view == view) { @@ -1742,6 +1743,9 @@ public abstract class Transition implements Cloneable { View oldView = oldInfo.view; TransitionValues startValues = getTransitionValues(oldView, true); TransitionValues endValues = getMatchedTransitionValues(oldView, true); + if (startValues == null && endValues == null) { + endValues = mEndValues.viewValues.get(oldView); + } boolean cancel = (startValues != null || endValues != null) && oldInfo.transition.areValuesChanged(oldValues, endValues); if (cancel) { diff --git a/core/java/android/util/FloatMath.java b/core/java/android/util/FloatMath.java index 8f488af66cff..bb7d15f1b40e 100644 --- a/core/java/android/util/FloatMath.java +++ b/core/java/android/util/FloatMath.java @@ -25,6 +25,8 @@ package android.util; * {@link java.lang.Math}. {@link java.lang.Math} should be used in * preference. * + * <p>All methods were removed from the public API in version 23. + * * @deprecated Use {@link java.lang.Math} instead. */ @Deprecated @@ -39,6 +41,7 @@ public class FloatMath { * * @param value to be converted * @return the floor of value + * @removed */ public static float floor(float value) { return (float) Math.floor(value); @@ -50,6 +53,7 @@ public class FloatMath { * * @param value to be converted * @return the ceiling of value + * @removed */ public static float ceil(float value) { return (float) Math.ceil(value); @@ -60,6 +64,7 @@ public class FloatMath { * * @param angle to compute the cosine of, in radians * @return the sine of angle + * @removed */ public static float sin(float angle) { return (float) Math.sin(angle); @@ -70,6 +75,7 @@ public class FloatMath { * * @param angle to compute the cosine of, in radians * @return the cosine of angle + * @removed */ public static float cos(float angle) { return (float) Math.cos(angle); @@ -81,6 +87,7 @@ public class FloatMath { * * @param value to compute sqrt of * @return the square root of value + * @removed */ public static float sqrt(float value) { return (float) Math.sqrt(value); @@ -92,6 +99,7 @@ public class FloatMath { * * @param value to compute the exponential of * @return the exponential of value + * @removed */ public static float exp(float value) { return (float) Math.exp(value); @@ -104,6 +112,7 @@ public class FloatMath { * @param x the base of the operation. * @param y the exponent of the operation. * @return {@code x} to the power of {@code y}. + * @removed */ public static float pow(float x, float y) { return (float) Math.pow(x, y); @@ -116,6 +125,7 @@ public class FloatMath { * @param x a float number * @param y a float number * @return the hypotenuse + * @removed */ public static float hypot(float x, float y) { return (float) Math.hypot(x, y); diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 68ad782ddbd9..3781d404ff42 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -586,7 +586,7 @@ final class AccessibilityInteractionController { } } - private void perfromAccessibilityActionUiThread(Message message) { + private void performAccessibilityActionUiThread(Message message) { final int flags = message.arg1; final int accessibilityViewId = message.arg2; @@ -602,7 +602,8 @@ final class AccessibilityInteractionController { boolean succeeded = false; try { - if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null) { + if (mViewRootImpl.mView == null || mViewRootImpl.mAttachInfo == null || + mViewRootImpl.mStopped || mViewRootImpl.mPausedForTransition) { return; } mViewRootImpl.mAttachInfo.mAccessibilityFetchFlags = flags; @@ -1146,7 +1147,7 @@ final class AccessibilityInteractionController { findAccessibilityNodeInfoByAccessibilityIdUiThread(message); } break; case MSG_PERFORM_ACCESSIBILITY_ACTION: { - perfromAccessibilityActionUiThread(message); + performAccessibilityActionUiThread(message); } break; case MSG_FIND_ACCESSIBILITY_NODE_INFOS_BY_VIEW_ID: { findAccessibilityNodeInfosByViewIdUiThread(message); diff --git a/core/java/android/view/ContextThemeWrapper.java b/core/java/android/view/ContextThemeWrapper.java index 9047b1dd73a2..ce50091f515c 100644 --- a/core/java/android/view/ContextThemeWrapper.java +++ b/core/java/android/view/ContextThemeWrapper.java @@ -87,9 +87,12 @@ public class ContextThemeWrapper extends ContextWrapper { } } - @Override public void setTheme(int resid) { - mThemeResource = resid; - initializeTheme(); + @Override + public void setTheme(int resid) { + if (mThemeResource != resid) { + mThemeResource = resid; + initializeTheme(); + } } /** @hide */ diff --git a/core/java/android/view/GhostView.java b/core/java/android/view/GhostView.java index bc38e1a271f1..41502b6696ab 100644 --- a/core/java/android/view/GhostView.java +++ b/core/java/android/view/GhostView.java @@ -40,8 +40,7 @@ public class GhostView extends View { mView.mGhostView = this; final ViewGroup parent = (ViewGroup) mView.getParent(); setGhostedVisibility(View.INVISIBLE); - parent.mRecreateDisplayList = true; - parent.updateDisplayListIfDirty(); + parent.invalidate(); } @Override @@ -83,8 +82,7 @@ public class GhostView extends View { mView.mGhostView = null; final ViewGroup parent = (ViewGroup) mView.getParent(); if (parent != null) { - parent.mRecreateDisplayList = true; - parent.updateDisplayListIfDirty(); + parent.invalidate(); } } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f62e6a2f1449..e1f1816d993b 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -633,7 +633,6 @@ import java.util.concurrent.atomic.AtomicInteger; * </p> * * @attr ref android.R.styleable#View_alpha - * @attr ref android.R.styleable#View_assistBlocked * @attr ref android.R.styleable#View_background * @attr ref android.R.styleable#View_clickable * @attr ref android.R.styleable#View_contentDescription @@ -2533,7 +2532,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, PFLAG3_SCROLL_INDICATOR_END >> SCROLL_INDICATORS_TO_PFLAGS3_LSHIFT; /** - * <p>Indicates that we are allowing {@link android.view.ViewAssistStructure} to traverse + * <p>Indicates that we are allowing {@link ViewStructure} to traverse * into this view.<p> */ static final int PFLAG3_ASSIST_BLOCKED = 0x100; @@ -4050,11 +4049,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, viewFlagMasks |= SAVE_DISABLED_MASK; } break; - case com.android.internal.R.styleable.View_assistBlocked: - if (a.getBoolean(attr, false)) { - mPrivateFlags3 |= PFLAG3_ASSIST_BLOCKED; - } - break; case com.android.internal.R.styleable.View_duplicateParentState: if (a.getBoolean(attr, false)) { viewFlagValues |= DUPLICATE_PARENT_STATE; @@ -6163,7 +6157,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * @param structure Fill in with structured view data. The default implementation * fills in all data that can be inferred from the view itself. */ - public void onProvideAssistStructure(ViewAssistStructure structure) { + public void onProvideStructure(ViewStructure structure) { final int id = mID; if (id > 0 && (id&0xff000000) != 0 && (id&0x00ff0000) != 0 && (id&0x0000ffff) != 0) { @@ -6217,6 +6211,11 @@ public class View implements Drawable.Callback, KeyEvent.Callback, structure.setContentDescription(getContentDescription()); } + /** @hide */ + public void onProvideAssistStructure(ViewStructure structure) { + onProvideStructure(structure); + } + /** * Called when assist structure is being retrieved from a view as part of * {@link android.app.Activity#onProvideAssistData Activity.onProvideAssistData} to @@ -6225,19 +6224,24 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * view's virtual accessibility nodes, if any. You can override this for a more * optimal implementation providing this data. */ - public void onProvideVirtualAssistStructure(ViewAssistStructure structure) { + public void onProvideVirtualStructure(ViewStructure structure) { AccessibilityNodeProvider provider = getAccessibilityNodeProvider(); if (provider != null) { AccessibilityNodeInfo info = createAccessibilityNodeInfo(); Log.i("View", "Provider of " + this + ": children=" + info.getChildCount()); structure.setChildCount(1); - ViewAssistStructure root = structure.newChild(0); - populateVirtualAssistStructure(root, provider, info); + ViewStructure root = structure.newChild(0); + populateVirtualStructure(root, provider, info); info.recycle(); } } - private void populateVirtualAssistStructure(ViewAssistStructure structure, + /** @hide */ + public void onProvideVirtualAssistStructure(ViewStructure structure) { + onProvideVirtualStructure(structure); + } + + private void populateVirtualStructure(ViewStructure structure, AccessibilityNodeProvider provider, AccessibilityNodeInfo info) { structure.setId(AccessibilityNodeInfo.getVirtualDescendantId(info.getSourceNodeId()), null, null, null); @@ -6288,19 +6292,19 @@ public class View implements Drawable.Callback, KeyEvent.Callback, for (int i=0; i<NCHILDREN; i++) { AccessibilityNodeInfo cinfo = provider.createAccessibilityNodeInfo( AccessibilityNodeInfo.getVirtualDescendantId(info.getChildId(i))); - ViewAssistStructure child = structure.newChild(i); - populateVirtualAssistStructure(child, provider, cinfo); + ViewStructure child = structure.newChild(i); + populateVirtualStructure(child, provider, cinfo); cinfo.recycle(); } } } /** - * Dispatch creation of {@link ViewAssistStructure} down the hierarchy. The default - * implementation calls {@link #onProvideAssistStructure} and - * {@link #onProvideVirtualAssistStructure}. + * Dispatch creation of {@link ViewStructure} down the hierarchy. The default + * implementation calls {@link #onProvideStructure} and + * {@link #onProvideVirtualStructure}. */ - public void dispatchProvideAssistStructure(ViewAssistStructure structure) { + public void dispatchProvideStructure(ViewStructure structure) { if (!isAssistBlocked()) { onProvideAssistStructure(structure); onProvideVirtualAssistStructure(structure); @@ -7904,8 +7908,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * @hide * Indicates whether this view will participate in data collection through - * {@link android.view.ViewAssistStructure}. If true, it will not provide any data + * {@link ViewStructure}. If true, it will not provide any data * for itself or its children. If false, the normal data collection will be allowed. * * @return Returns false if assist data collection is not blocked, else true. @@ -7918,17 +7923,18 @@ public class View implements Drawable.Callback, KeyEvent.Callback, } /** + * @hide * Controls whether assist data collection from this view and its children is enabled - * (that is, whether {@link #onProvideAssistStructure} and - * {@link #onProvideVirtualAssistStructure} will be called). The default value is false, + * (that is, whether {@link #onProvideStructure} and + * {@link #onProvideVirtualStructure} will be called). The default value is false, * allowing normal assist collection. Setting this to false will disable assist collection. * * @param enabled Set to true to <em>disable</em> assist data collection, or false * (the default) to allow it. * * @see #isAssistBlocked() - * @see #onProvideAssistStructure - * @see #onProvideVirtualAssistStructure + * @see #onProvideStructure + * @see #onProvideVirtualStructure * @attr ref android.R.styleable#View_assistBlocked */ public void setAssistBlocked(boolean enabled) { @@ -22353,4 +22359,138 @@ public class View implements Drawable.Callback, KeyEvent.Callback, final String output = bits + " " + name; found.put(key, output); } + + /** {@hide} */ + public void encode(@NonNull ViewHierarchyEncoder stream) { + stream.beginObject(this); + encodeProperties(stream); + stream.endObject(); + } + + /** {@hide} */ + @CallSuper + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + Object resolveId = ViewDebug.resolveId(getContext(), mID); + if (resolveId instanceof String) { + stream.addProperty("id", (String) resolveId); + } else { + stream.addProperty("id", mID); + } + + stream.addProperty("misc:transformation.alpha", + mTransformationInfo != null ? mTransformationInfo.mAlpha : 0); + stream.addProperty("misc:transitionName", getTransitionName()); + + // layout + stream.addProperty("layout:left", mLeft); + stream.addProperty("layout:right", mRight); + stream.addProperty("layout:top", mTop); + stream.addProperty("layout:bottom", mBottom); + stream.addProperty("layout:width", getWidth()); + stream.addProperty("layout:height", getHeight()); + stream.addProperty("layout:layoutDirection", getLayoutDirection()); + stream.addProperty("layout:layoutRtl", isLayoutRtl()); + stream.addProperty("layout:hasTransientState", hasTransientState()); + stream.addProperty("layout:baseline", getBaseline()); + + // layout params + ViewGroup.LayoutParams layoutParams = getLayoutParams(); + if (layoutParams != null) { + stream.addPropertyKey("layoutParams"); + layoutParams.encode(stream); + } + + // scrolling + stream.addProperty("scrolling:scrollX", mScrollX); + stream.addProperty("scrolling:scrollY", mScrollY); + + // padding + stream.addProperty("padding:paddingLeft", mPaddingLeft); + stream.addProperty("padding:paddingRight", mPaddingRight); + stream.addProperty("padding:paddingTop", mPaddingTop); + stream.addProperty("padding:paddingBottom", mPaddingBottom); + stream.addProperty("padding:userPaddingRight", mUserPaddingRight); + stream.addProperty("padding:userPaddingLeft", mUserPaddingLeft); + stream.addProperty("padding:userPaddingBottom", mUserPaddingBottom); + stream.addProperty("padding:userPaddingStart", mUserPaddingStart); + stream.addProperty("padding:userPaddingEnd", mUserPaddingEnd); + + // measurement + stream.addProperty("measurement:minHeight", mMinHeight); + stream.addProperty("measurement:minWidth", mMinWidth); + stream.addProperty("measurement:measuredWidth", mMeasuredWidth); + stream.addProperty("measurement:measuredHeight", mMeasuredHeight); + + // drawing + stream.addProperty("drawing:elevation", getElevation()); + stream.addProperty("drawing:translationX", getTranslationX()); + stream.addProperty("drawing:translationY", getTranslationY()); + stream.addProperty("drawing:translationZ", getTranslationZ()); + stream.addProperty("drawing:rotation", getRotation()); + stream.addProperty("drawing:rotationX", getRotationX()); + stream.addProperty("drawing:rotationY", getRotationY()); + stream.addProperty("drawing:scaleX", getScaleX()); + stream.addProperty("drawing:scaleY", getScaleY()); + stream.addProperty("drawing:pivotX", getPivotX()); + stream.addProperty("drawing:pivotY", getPivotY()); + stream.addProperty("drawing:opaque", isOpaque()); + stream.addProperty("drawing:alpha", getAlpha()); + stream.addProperty("drawing:transitionAlpha", getTransitionAlpha()); + stream.addProperty("drawing:shadow", hasShadow()); + stream.addProperty("drawing:solidColor", getSolidColor()); + stream.addProperty("drawing:layerType", mLayerType); + stream.addProperty("drawing:willNotDraw", willNotDraw()); + stream.addProperty("drawing:hardwareAccelerated", isHardwareAccelerated()); + stream.addProperty("drawing:willNotCacheDrawing", willNotCacheDrawing()); + stream.addProperty("drawing:drawingCacheEnabled", isDrawingCacheEnabled()); + stream.addProperty("drawing:overlappingRendering", hasOverlappingRendering()); + + // focus + stream.addProperty("focus:hasFocus", hasFocus()); + stream.addProperty("focus:isFocused", isFocused()); + stream.addProperty("focus:isFocusable", isFocusable()); + stream.addProperty("focus:isFocusableInTouchMode", isFocusableInTouchMode()); + + stream.addProperty("misc:clickable", isClickable()); + stream.addProperty("misc:pressed", isPressed()); + stream.addProperty("misc:selected", isSelected()); + stream.addProperty("misc:touchMode", isInTouchMode()); + stream.addProperty("misc:hovered", isHovered()); + stream.addProperty("misc:activated", isActivated()); + + stream.addProperty("misc:visibility", getVisibility()); + stream.addProperty("misc:fitsSystemWindows", getFitsSystemWindows()); + stream.addProperty("misc:filterTouchesWhenObscured", getFilterTouchesWhenObscured()); + + stream.addProperty("misc:enabled", isEnabled()); + stream.addProperty("misc:soundEffectsEnabled", isSoundEffectsEnabled()); + stream.addProperty("misc:hapticFeedbackEnabled", isHapticFeedbackEnabled()); + + // theme attributes + Resources.Theme theme = getContext().getTheme(); + if (theme != null) { + stream.addPropertyKey("theme"); + theme.encode(stream); + } + + // view attribute information + int n = mAttributes != null ? mAttributes.length : 0; + stream.addProperty("meta:__attrCount__", n/2); + for (int i = 0; i < n; i += 2) { + stream.addProperty("meta:__attr__" + mAttributes[i], mAttributes[i+1]); + } + + stream.addProperty("misc:scrollBarStyle", getScrollBarStyle()); + + // text + stream.addProperty("text:textDirection", getTextDirection()); + stream.addProperty("text:textAlignment", getTextAlignment()); + + // accessibility + CharSequence contentDescription = getContentDescription(); + stream.addProperty("accessibility:contentDescription", + contentDescription == null ? "" : contentDescription.toString()); + stream.addProperty("accessibility:labelFor", getLabelFor()); + stream.addProperty("accessibility:importantForAccessibility", getImportantForAccessibility()); + } } diff --git a/core/java/android/view/ViewAssistStructure.java b/core/java/android/view/ViewAssistStructure.java index fccfbb8fc409..a66d93c8cc05 100644 --- a/core/java/android/view/ViewAssistStructure.java +++ b/core/java/android/view/ViewAssistStructure.java @@ -16,70 +16,9 @@ package android.view; -import android.graphics.Rect; -import android.os.Bundle; -import android.text.TextPaint; - /** - * Container for storing additional per-view data generated by {@link View#onProvideAssistStructure - * View.onProvideAssistStructure}. + * @deprecated Temporary until old apps can move off this. */ -public abstract class ViewAssistStructure { - public abstract void setId(int id, String packageName, String typeName, String entryName); - - public abstract void setDimens(int left, int top, int scrollX, int scrollY, int width, - int height); - - public abstract void setVisibility(int visibility); - - public abstract void setAssistBlocked(boolean state); - - public abstract void setEnabled(boolean state); - - public abstract void setClickable(boolean state); - - public abstract void setLongClickable(boolean state); - - public abstract void setStylusButtonPressable(boolean state); - - public abstract void setFocusable(boolean state); - - public abstract void setFocused(boolean state); - - public abstract void setAccessibilityFocused(boolean state); - - public abstract void setCheckable(boolean state); - - public abstract void setChecked(boolean state); - - public abstract void setSelected(boolean state); - - public abstract void setActivated(boolean state); - - public abstract void setClassName(String className); - - public abstract void setContentDescription(CharSequence contentDescription); - - public abstract void setText(CharSequence text); - public abstract void setText(CharSequence text, int selectionStart, int selectionEnd); - public abstract void setTextPaint(TextPaint paint); - public abstract void setHint(CharSequence hint); - - public abstract CharSequence getText(); - public abstract int getTextSelectionStart(); - public abstract int getTextSelectionEnd(); - public abstract CharSequence getHint(); - - public abstract Bundle editExtras(); - public abstract void clearExtras(); - - public abstract void setChildCount(int num); - public abstract int getChildCount(); - public abstract ViewAssistStructure newChild(int index); - - public abstract ViewAssistStructure asyncNewChild(int index); - public abstract void asyncCommit(); - - /** @hide */ - public abstract Rect getTempRect(); +@Deprecated +public abstract class ViewAssistStructure extends ViewStructure { } diff --git a/core/java/android/view/ViewDebug.java b/core/java/android/view/ViewDebug.java index 27304f59e437..8bf53a872b91 100644 --- a/core/java/android/view/ViewDebug.java +++ b/core/java/android/view/ViewDebug.java @@ -16,6 +16,7 @@ package android.view; +import android.annotation.NonNull; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -800,6 +801,7 @@ public class ViewDebug { /** * Dumps the view hierarchy starting from the given view. + * @deprecated See {@link #dumpv2(View, ByteArrayOutputStream)} below. * @hide */ public static void dump(View root, boolean skipChildren, boolean includeProperties, @@ -825,6 +827,28 @@ public class ViewDebug { } /** + * Dumps the view hierarchy starting from the given view. + * Rather than using reflection, it uses View's encode method to obtain all the properties. + * @hide + */ + public static void dumpv2(@NonNull final View view, @NonNull ByteArrayOutputStream out) + throws InterruptedException { + final ViewHierarchyEncoder encoder = new ViewHierarchyEncoder(out); + final CountDownLatch latch = new CountDownLatch(1); + + view.post(new Runnable() { + @Override + public void run() { + view.encode(encoder); + latch.countDown(); + } + }); + + latch.await(2, TimeUnit.SECONDS); + encoder.endStream(); + } + + /** * Dumps the theme attributes from the given View. * @hide */ diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index babb4e9066be..51c4760749f2 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2878,12 +2878,12 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } /** - * Dispatch creation of {@link ViewAssistStructure} down the hierarchy. This implementation + * Dispatch creation of {@link ViewStructure} down the hierarchy. This implementation * adds in all child views of the view group, in addition to calling the default View * implementation. */ - public void dispatchProvideAssistStructure(ViewAssistStructure structure) { - super.dispatchProvideAssistStructure(structure); + public void dispatchProvideStructure(ViewStructure structure) { + super.dispatchProvideStructure(structure); if (!isAssistBlocked()) { if (structure.getChildCount() == 0) { final int childrenCount = getChildCount(); @@ -2898,8 +2898,8 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager ? getChildDrawingOrder(childrenCount, i) : i; final View child = (preorderedList == null) ? children[childIndex] : preorderedList.get(childIndex); - ViewAssistStructure cstructure = structure.newChild(i); - child.dispatchProvideAssistStructure(cstructure); + ViewStructure cstructure = structure.newChild(i); + child.dispatchProvideStructure(cstructure); } } } @@ -6861,6 +6861,19 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } return String.valueOf(size); } + + /** @hide */ + void encode(@NonNull ViewHierarchyEncoder encoder) { + encoder.beginObject(this); + encodeProperties(encoder); + encoder.endObject(); + } + + /** @hide */ + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + encoder.addProperty("width", width); + encoder.addProperty("height", height); + } } /** @@ -7329,6 +7342,18 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager bottomMargin, paint); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("leftMargin", leftMargin); + encoder.addProperty("topMargin", topMargin); + encoder.addProperty("rightMargin", rightMargin); + encoder.addProperty("bottomMargin", bottomMargin); + encoder.addProperty("startMargin", startMargin); + encoder.addProperty("endMargin", endMargin); + } } /* Describes a touched view and the ids of the pointers that it has captured. @@ -7665,4 +7690,23 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager canvas.drawLines(sDebugLines, paint); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("focus:descendantFocusability", getDescendantFocusability()); + encoder.addProperty("drawing:clipChildren", getClipChildren()); + encoder.addProperty("drawing:clipToPadding", getClipToPadding()); + encoder.addProperty("drawing:childrenDrawingOrderEnabled", isChildrenDrawingOrderEnabled()); + encoder.addProperty("drawing:persistentDrawingCache", getPersistentDrawingCache()); + + int n = getChildCount(); + encoder.addProperty("meta:__childCount__", (short)n); + for (int i = 0; i < n; i++) { + encoder.addPropertyKey("meta:__child__" + i); + getChildAt(i).encode(encoder); + } + } } diff --git a/core/java/android/view/ViewHierarchyEncoder.java b/core/java/android/view/ViewHierarchyEncoder.java new file mode 100644 index 000000000000..87702161070b --- /dev/null +++ b/core/java/android/view/ViewHierarchyEncoder.java @@ -0,0 +1,201 @@ +package android.view; + +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +/** + * {@link ViewHierarchyEncoder} is a serializer that is tailored towards writing out + * view hierarchies (the view tree, along with the properties for each view) to a stream. + * + * It is typically used as follows: + * <pre> + * ViewHierarchyEncoder e = new ViewHierarchyEncoder(); + * + * for (View view : views) { + * e.beginObject(view); + * e.addProperty("prop1", value); + * ... + * e.endObject(); + * } + * + * // repeat above snippet for each view, finally end with: + * e.endStream(); + * </pre> + * + * <p>On the stream, a snippet such as the above gets encoded as a series of Map's (one + * corresponding to each view) with the property name as the key and the property value + * as the value. + * + * <p>Since the property names are practically the same across all views, rather than using + * the property name directly as the key, we use a short integer id corresponding to each + * property name as the key. A final map is added at the end which contains the mapping + * from the integer to its property name. + * + * <p>A value is encoded as a single byte type identifier followed by the encoding of the + * value. Only primitive types are supported as values, in addition to the Map type. + * + * @hide + */ +public class ViewHierarchyEncoder { + // Prefixes for simple primitives. These match the JNI definitions. + private static final byte SIG_BOOLEAN = 'Z'; + private static final byte SIG_BYTE = 'B'; + private static final byte SIG_SHORT = 'S'; + private static final byte SIG_INT = 'I'; + private static final byte SIG_LONG = 'J'; + private static final byte SIG_FLOAT = 'F'; + private static final byte SIG_DOUBLE = 'D'; + + // Prefixes for some commonly used objects + private static final byte SIG_STRING = 'R'; + + private static final byte SIG_MAP = 'M'; // a map with an short key + private static final short SIG_END_MAP = 0; + + private final DataOutputStream mStream; + + private final Map<String,Short> mPropertyNames = new HashMap<String, Short>(200); + private short mPropertyId = 1; + private Charset mCharset = Charset.forName("utf-8"); + + public ViewHierarchyEncoder(@NonNull ByteArrayOutputStream stream) { + mStream = new DataOutputStream(stream); + } + + public void beginObject(@NonNull Object o) { + startPropertyMap(); + addProperty("meta:__name__", o.getClass().getName()); + addProperty("meta:__hash__", o.hashCode()); + } + + public void endObject() { + endPropertyMap(); + } + + public void endStream() { + // write out the string table + startPropertyMap(); + addProperty("__name__", "propertyIndex"); + for (Map.Entry<String,Short> entry : mPropertyNames.entrySet()) { + writeShort(entry.getValue()); + writeString(entry.getKey()); + } + endPropertyMap(); + } + + public void addProperty(@NonNull String name, boolean v) { + writeShort(createPropertyIndex(name)); + writeBoolean(v); + } + + public void addProperty(@NonNull String name, short s) { + writeShort(createPropertyIndex(name)); + writeShort(s); + } + + public void addProperty(@NonNull String name, int v) { + writeShort(createPropertyIndex(name)); + writeInt(v); + } + + public void addProperty(@NonNull String name, float v) { + writeShort(createPropertyIndex(name)); + writeFloat(v); + } + + public void addProperty(@NonNull String name, @Nullable String s) { + writeShort(createPropertyIndex(name)); + writeString(s); + } + + /** + * Writes the given name as the property name, and leaves it to the callee + * to fill in value for this property. + */ + public void addPropertyKey(@NonNull String name) { + writeShort(createPropertyIndex(name)); + } + + private short createPropertyIndex(@NonNull String name) { + Short index = mPropertyNames.get(name); + if (index == null) { + index = mPropertyId++; + mPropertyNames.put(name, index); + } + + return index; + } + + private void startPropertyMap() { + try { + mStream.write(SIG_MAP); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } + + private void endPropertyMap() { + writeShort(SIG_END_MAP); + } + + private void writeBoolean(boolean v) { + try { + mStream.write(SIG_BOOLEAN); + mStream.write(v ? 1 : 0); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } + + private void writeShort(short s) { + try { + mStream.write(SIG_SHORT); + mStream.writeShort(s); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } + + private void writeInt(int i) { + try { + mStream.write(SIG_INT); + mStream.writeInt(i); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } + + private void writeFloat(float v) { + try { + mStream.write(SIG_FLOAT); + mStream.writeFloat(v); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } + + private void writeString(@Nullable String s) { + if (s == null) { + s = ""; + } + + try { + mStream.write(SIG_STRING); + byte[] bytes = s.getBytes(mCharset); + + short len = (short)Math.min(bytes.length, Short.MAX_VALUE); + mStream.writeShort(len); + + mStream.write(bytes, 0, len); + } catch (IOException e) { + // does not happen since the stream simply wraps a ByteArrayOutputStream + } + } +} diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index fda6e6394fab..57c6cbf46941 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -76,6 +76,7 @@ import android.widget.Scroller; import com.android.internal.R; import com.android.internal.os.SomeArgs; +import com.android.internal.policy.PhoneFallbackEventHandler; import com.android.internal.util.ScreenShapeHelper; import com.android.internal.view.BaseSurfaceHolder; import com.android.internal.view.RootViewSurfaceTaker; @@ -173,6 +174,9 @@ public final class ViewRootImpl implements ViewParent, // so the window should no longer be active. boolean mStopped = false; + // Set to true to stop input during an Activity Transition. + boolean mPausedForTransition = false; + boolean mLastInCompatMode = false; SurfaceHolder.Callback2 mSurfaceHolderCallback; @@ -653,6 +657,10 @@ public final class ViewRootImpl implements ViewParent, return (mWindowAttributes.flags & WindowManager.LayoutParams.FLAG_LOCAL_FOCUS_MODE) != 0; } + public int getWindowFlags() { + return mWindowAttributes.flags; + } + public CharSequence getTitle() { return mWindowAttributes.getTitle(); } @@ -977,15 +985,25 @@ public final class ViewRootImpl implements ViewParent, return null; } - void setStopped(boolean stopped) { + void setWindowStopped(boolean stopped) { if (mStopped != stopped) { mStopped = stopped; - if (!stopped) { + if (!mStopped) { scheduleTraversals(); } } } + /** + * Block the input events during an Activity Transition. The KEYCODE_BACK event is allowed + * through to allow quick reversal of the Activity Transition. + * + * @param paused true to pause, false to resume. + */ + public void setPausedForTransition(boolean paused) { + mPausedForTransition = paused; + } + @Override public ViewParent getParent() { return null; @@ -3632,8 +3650,9 @@ public final class ViewRootImpl implements ViewParent, if (mView == null || !mAdded) { Slog.w(TAG, "Dropping event due to root view being removed: " + q.mEvent); return true; - } else if ((!mAttachInfo.mHasWindowFocus || mStopped) - && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) { + } else if ((!mAttachInfo.mHasWindowFocus + && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) || mStopped + || (mPausedForTransition && !isBack(q.mEvent))) { // This is a focus event and the window doesn't currently have input focus or // has stopped. This could be an event that came back from the previous stage // but the window has lost focus or stopped in the meantime. @@ -3656,6 +3675,14 @@ public final class ViewRootImpl implements ViewParent, mNext.dump(prefix, writer); } } + + private boolean isBack(InputEvent event) { + if (event instanceof KeyEvent) { + return ((KeyEvent) event).getKeyCode() == KeyEvent.KEYCODE_BACK; + } else { + return false; + } + } } /** @@ -6223,7 +6250,7 @@ public final class ViewRootImpl implements ViewParent, @Override public boolean requestSendAccessibilityEvent(View child, AccessibilityEvent event) { - if (mView == null) { + if (mView == null || mStopped || mPausedForTransition) { return false; } // Intercept accessibility focus events fired by virtual nodes to keep diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java new file mode 100644 index 000000000000..8dc49acdb6cd --- /dev/null +++ b/core/java/android/view/ViewStructure.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 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. + */ + +package android.view; + +import android.graphics.Rect; +import android.os.Bundle; +import android.text.TextPaint; + +/** + * Container for storing additional per-view data generated by {@link View#onProvideStructure + * View.onProvideStructure}. + */ +public abstract class ViewStructure { + public abstract void setId(int id, String packageName, String typeName, String entryName); + + public abstract void setDimens(int left, int top, int scrollX, int scrollY, int width, + int height); + + public abstract void setVisibility(int visibility); + + /** @hide */ + public abstract void setAssistBlocked(boolean state); + + public abstract void setEnabled(boolean state); + + public abstract void setClickable(boolean state); + + public abstract void setLongClickable(boolean state); + + public abstract void setStylusButtonPressable(boolean state); + + public abstract void setFocusable(boolean state); + + public abstract void setFocused(boolean state); + + public abstract void setAccessibilityFocused(boolean state); + + public abstract void setCheckable(boolean state); + + public abstract void setChecked(boolean state); + + public abstract void setSelected(boolean state); + + public abstract void setActivated(boolean state); + + public abstract void setClassName(String className); + + public abstract void setContentDescription(CharSequence contentDescription); + + public abstract void setText(CharSequence text); + public abstract void setText(CharSequence text, int selectionStart, int selectionEnd); + public abstract void setTextPaint(TextPaint paint); + public abstract void setHint(CharSequence hint); + + public abstract CharSequence getText(); + public abstract int getTextSelectionStart(); + public abstract int getTextSelectionEnd(); + public abstract CharSequence getHint(); + + public abstract Bundle getExtras(); + public abstract boolean hasExtras(); + + public abstract void setChildCount(int num); + public abstract int getChildCount(); + public abstract ViewAssistStructure newChild(int index); + + public abstract ViewAssistStructure asyncNewChild(int index); + public abstract void asyncCommit(); + + /** @hide */ + public abstract Rect getTempRect(); +} diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index e98391016017..2797b6e9a0ab 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -16,11 +16,11 @@ package android.view; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.app.Presentation; import android.content.Context; import android.content.pm.ActivityInfo; -import android.graphics.Insets; import android.graphics.PixelFormat; import android.graphics.Rect; import android.os.IBinder; @@ -1119,6 +1119,15 @@ public interface WindowManager extends ViewManager { public static final int PRIVATE_FLAG_DISABLE_WALLPAPER_TOUCH_EVENTS = 0x00000800; /** + * Flag to force the status bar window to be visible all the time. If the bar is hidden when + * this flag is set it will be shown again and the bar will have a transparent background. + * This can only be set by {@link LayoutParams#TYPE_STATUS_BAR}. + * + * {@hide} + */ + public static final int PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT = 0x00001000; + + /** * Control flags that are private to the platform. * @hide */ @@ -2066,5 +2075,18 @@ public interface WindowManager extends ViewManager { } private CharSequence mTitle = ""; + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("x", x); + encoder.addProperty("y", y); + encoder.addProperty("horizontalWeight", horizontalWeight); + encoder.addProperty("verticalWeight", verticalWeight); + encoder.addProperty("type", type); + encoder.addProperty("flags", flags); + } } } diff --git a/core/java/android/view/WindowManagerGlobal.java b/core/java/android/view/WindowManagerGlobal.java index 57558ff26205..e7a7ba83c761 100644 --- a/core/java/android/view/WindowManagerGlobal.java +++ b/core/java/android/view/WindowManagerGlobal.java @@ -21,7 +21,6 @@ import android.app.ActivityManager; import android.content.ComponentCallbacks2; import android.content.Context; import android.content.res.Configuration; -import android.os.Build; import android.os.IBinder; import android.os.RemoteException; import android.os.ServiceManager; @@ -552,7 +551,7 @@ public final class WindowManagerGlobal { for (int i = 0; i < count; i++) { if (token == null || mParams.get(i).token == token) { ViewRootImpl root = mRoots.get(i); - root.setStopped(stopped); + root.setWindowStopped(stopped); } } } diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 7ab5aaa252ce..e27e2532dae6 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,6 +16,7 @@ package android.webkit; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.Widget; import android.content.Context; @@ -40,9 +41,10 @@ import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewAssistStructure; +import android.view.ViewStructure; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -2426,7 +2428,7 @@ public class WebView extends AbsoluteLayout } @Override - public void onProvideVirtualAssistStructure(ViewAssistStructure structure) { + public void onProvideVirtualStructure(ViewStructure structure) { mProvider.getViewDelegate().onProvideVirtualAssistStructure(structure); } @@ -2576,4 +2578,18 @@ public class WebView extends AbsoluteLayout super.onFinishTemporaryDetach(); mProvider.getViewDelegate().onFinishTemporaryDetach(); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + checkThread(); + encoder.addProperty("webview:contentHeight", mProvider.getContentHeight()); + encoder.addProperty("webview:contentWidth", mProvider.getContentWidth()); + encoder.addProperty("webview:scale", mProvider.getScale()); + encoder.addProperty("webview:title", mProvider.getTitle()); + encoder.addProperty("webview:url", mProvider.getUrl()); + encoder.addProperty("webview:originalUrl", mProvider.getOriginalUrl()); + } } diff --git a/core/java/android/webkit/WebViewProvider.java b/core/java/android/webkit/WebViewProvider.java index d5787de65ec5..e367192d9291 100644 --- a/core/java/android/webkit/WebViewProvider.java +++ b/core/java/android/webkit/WebViewProvider.java @@ -32,7 +32,7 @@ import android.print.PrintDocumentAdapter; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewAssistStructure; +import android.view.ViewStructure; import android.view.ViewGroup.LayoutParams; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -299,7 +299,7 @@ public interface WebViewProvider { interface ViewDelegate { public boolean shouldDelayChildPressedState(); - public void onProvideVirtualAssistStructure(ViewAssistStructure structure); + public void onProvideVirtualAssistStructure(ViewStructure structure); public AccessibilityNodeProvider getAccessibilityNodeProvider(); diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c57a53a93650..9903b7e88ed9 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -18,6 +18,7 @@ package android.widget; import android.annotation.ColorInt; import android.annotation.DrawableRes; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; @@ -56,6 +57,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; @@ -6330,6 +6332,16 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te public LayoutParams(ViewGroup.LayoutParams source) { super(source); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("list:viewType", viewType); + encoder.addProperty("list:recycledHeaderFooter", recycledHeaderFooter); + encoder.addProperty("list:forceAdd", forceAdd); + } } /** @@ -6912,6 +6924,25 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("drawing:cacheColorHint", getCacheColorHint()); + encoder.addProperty("list:fastScrollEnabled", isFastScrollEnabled()); + encoder.addProperty("list:scrollingCacheEnabled", isScrollingCacheEnabled()); + encoder.addProperty("list:smoothScrollbarEnabled", isSmoothScrollbarEnabled()); + encoder.addProperty("list:stackFromBottom", isStackFromBottom()); + encoder.addProperty("list:textFilterEnabled", isTextFilterEnabled()); + + View selectedView = getSelectedView(); + if (selectedView != null) { + encoder.addPropertyKey("selectedView"); + selectedView.encode(encoder); + } + } + /** * Abstract positon scroller used to handle smooth scrolling. */ diff --git a/core/java/android/widget/ActionMenuPresenter.java b/core/java/android/widget/ActionMenuPresenter.java index e0b0e1fe4262..f08141ce6834 100644 --- a/core/java/android/widget/ActionMenuPresenter.java +++ b/core/java/android/widget/ActionMenuPresenter.java @@ -61,6 +61,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter implements ActionProvider.SubUiVisibilityListener { private static final String TAG = "ActionMenuPresenter"; private static final int ITEM_ANIMATION_DURATION = 150; + private static final boolean ACTIONBAR_ANIMATIONS_ENABLED = false; private OverflowMenuButton mOverflowButton; private boolean mReserveOverflow; @@ -414,7 +415,7 @@ public class ActionMenuPresenter extends BaseMenuPresenter @Override public void updateMenuView(boolean cleared) { final ViewGroup menuViewParent = (ViewGroup) ((View) mMenuView).getParent(); - if (menuViewParent != null) { + if (menuViewParent != null && ACTIONBAR_ANIMATIONS_ENABLED) { setupItemAnimations(); } super.updateMenuView(cleared); diff --git a/core/java/android/widget/ActionMenuView.java b/core/java/android/widget/ActionMenuView.java index d6f227615909..278a8fbbfc0a 100644 --- a/core/java/android/widget/ActionMenuView.java +++ b/core/java/android/widget/ActionMenuView.java @@ -15,6 +15,7 @@ */ package android.widget; +import android.annotation.NonNull; import android.annotation.StyleRes; import android.content.Context; import android.content.res.ColorStateList; @@ -28,6 +29,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import com.android.internal.view.menu.ActionMenuItemView; import com.android.internal.view.menu.MenuBuilder; @@ -835,5 +837,17 @@ public class ActionMenuView extends LinearLayout implements MenuBuilder.ItemInvo super(width, height); this.isOverflowButton = isOverflowButton; } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("layout:overFlowButton", isOverflowButton); + encoder.addProperty("layout:cellsUsed", cellsUsed); + encoder.addProperty("layout:extraPixels", extraPixels); + encoder.addProperty("layout:expandable", expandable); + encoder.addProperty("layout:preventEdgeOffset", preventEdgeOffset); + } } } diff --git a/core/java/android/widget/AdapterView.java b/core/java/android/widget/AdapterView.java index 72cb0b55dad0..54e3996927ed 100644 --- a/core/java/android/widget/AdapterView.java +++ b/core/java/android/widget/AdapterView.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.database.DataSetObserver; @@ -29,6 +30,7 @@ import android.view.SoundEffectConstants; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -1245,4 +1247,16 @@ public abstract class AdapterView<T extends Adapter> extends ViewGroup { } } } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("scrolling:firstPosition", mFirstPosition); + encoder.addProperty("list:nextSelectedPosition", mNextSelectedPosition); + encoder.addProperty("list:nextSelectedRowId", mNextSelectedRowId); + encoder.addProperty("list:selectedPosition", mSelectedPosition); + encoder.addProperty("list:itemCount", mItemCount); + } } diff --git a/core/java/android/widget/CalendarViewLegacyDelegate.java b/core/java/android/widget/CalendarViewLegacyDelegate.java index 6ab3828e03e2..442fb334c4f6 100644 --- a/core/java/android/widget/CalendarViewLegacyDelegate.java +++ b/core/java/android/widget/CalendarViewLegacyDelegate.java @@ -713,7 +713,7 @@ class CalendarViewLegacyDelegate extends CalendarView.AbstractCalendarViewDelega for (int i = 1, count = mDayNamesHeader.getChildCount(); i < count; i++) { label = (TextView) mDayNamesHeader.getChildAt(i); if (mWeekDayTextAppearanceResId > -1) { - label.setTextAppearance(mContext, mWeekDayTextAppearanceResId); + label.setTextAppearance(mWeekDayTextAppearanceResId); } if (i < mDaysPerWeek + 1) { label.setText(mDayNamesShort[i - 1]); diff --git a/core/java/android/widget/CheckedTextView.java b/core/java/android/widget/CheckedTextView.java index 22e079c175e8..6b4b2c73bdff 100644 --- a/core/java/android/widget/CheckedTextView.java +++ b/core/java/android/widget/CheckedTextView.java @@ -16,6 +16,8 @@ package android.widget; +import android.annotation.NonNull; +import android.view.ViewHierarchyEncoder; import com.android.internal.R; import android.annotation.DrawableRes; @@ -459,4 +461,11 @@ public class CheckedTextView extends TextView implements Checkable { info.setCheckable(true); info.setChecked(mChecked); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + stream.addProperty("text:checked", isChecked()); + } } diff --git a/core/java/android/widget/CompoundButton.java b/core/java/android/widget/CompoundButton.java index f2afeebce088..770077d683b8 100644 --- a/core/java/android/widget/CompoundButton.java +++ b/core/java/android/widget/CompoundButton.java @@ -17,8 +17,10 @@ package android.widget; import android.annotation.DrawableRes; +import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.PorterDuff; +import android.view.ViewHierarchyEncoder; import com.android.internal.R; import android.content.Context; @@ -530,9 +532,16 @@ public abstract class CompoundButton extends Button implements Checkable { @Override public void onRestoreInstanceState(Parcelable state) { SavedState ss = (SavedState) state; - + super.onRestoreInstanceState(ss.getSuperState()); setChecked(ss.checked); requestLayout(); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + stream.addProperty("checked", isChecked()); + } } diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 712fdba6dd25..4fd85b6ea953 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -688,44 +688,101 @@ public class Editor { private int getWordStart(int offset) { // FIXME - For this and similar methods we're not doing anything to check if there's // a LocaleSpan in the text, this may be something we should try handling or checking for. - int retOffset = getWordIteratorWithText().getBeginning(offset); - if (retOffset == BreakIterator.DONE) retOffset = offset; + int retOffset = getWordIteratorWithText().prevBoundary(offset); + if (isPunctBoundaryBehind(retOffset, true /* isStart */)) { + // If we're on a punctuation boundary we should continue to get the + // previous offset until we're not longer on a punctuation boundary. + retOffset = getWordIteratorWithText().prevBoundary(retOffset); + while (!isPunctBoundaryBehind(retOffset, false /* isStart */) + && retOffset != BreakIterator.DONE) { + retOffset = getWordIteratorWithText().prevBoundary(retOffset); + } + } + if (retOffset == BreakIterator.DONE) { + return offset; + } return retOffset; } - private int getWordEnd(int offset, boolean includePunctuation) { - int retOffset = getWordIteratorWithText().getEnd(offset); + private int getWordEnd(int offset) { + int retOffset = getWordIteratorWithText().nextBoundary(offset); + if (isPunctBoundaryForward(retOffset, true /* isStart */)) { + // If we're on a punctuation boundary we should continue to get the + // next offset until we're no longer on a punctuation boundary. + retOffset = getWordIteratorWithText().nextBoundary(retOffset); + while (!isPunctBoundaryForward(retOffset, false /* isStart */) + && retOffset != BreakIterator.DONE) { + retOffset = getWordIteratorWithText().nextBoundary(retOffset); + } + } if (retOffset == BreakIterator.DONE) { - retOffset = offset; - } else if (includePunctuation) { - retOffset = handlePunctuation(retOffset); + return offset; } return retOffset; } - private boolean isEndBoundary(int offset) { - int thisEnd = getWordEnd(offset, false); - return offset == thisEnd; - } + /** + * Checks for punctuation boundaries for the provided offset and the + * previous character. + * + * @param offset The offset to check from. + * @param isStart Whether the boundary being checked for is at the start or + * end of a punctuation sequence. + * @return Whether this is a punctuation boundary. + */ + private boolean isPunctBoundaryBehind(int offset, boolean isStart) { + CharSequence text = mTextView.getText(); + if (offset == BreakIterator.DONE || offset > text.length() || offset == 0) { + return false; + } + int cp = Character.codePointAt(text, offset); + int prevCp = Character.codePointBefore(text, offset); - private boolean isStartBoundary(int offset) { - int thisStart = getWordStart(offset); - return thisStart == offset; + if (isPunctuation(cp)) { + // If it's the start, the current cp and the prev cp are + // punctuation. If it's at the end of a punctuation sequence the + // current is punctuation and the prev is not. + return isStart ? isPunctuation(prevCp) : !isPunctuation(prevCp); + } + return false; } - private int handlePunctuation(int offset) { - // FIXME - Check with UX how repeated ending punctuation should be handled. - // FIXME - Check with UX if / how we would handle non sentence ending characters. - // FIXME - Consider punctuation in different languages. + /** + * Checks for punctuation boundaries for the provided offset and the next + * character. + * + * @param offset The offset to check from. + * @param isStart Whether the boundary being checked for is at the start or + * end of a punctuation sequence. + * @return Whether this is a punctuation boundary. + */ + private boolean isPunctBoundaryForward(int offset, boolean isStart) { CharSequence text = mTextView.getText(); - if (offset < text.length()) { - int c = Character.codePointAt(text, offset); - if (c == 0x002e /* period */|| c == 0x003f /* question mark */ - || c == 0x0021 /* exclamation mark */) { - offset = Character.offsetByCodePoints(text, offset, 1); - } + if (offset == BreakIterator.DONE || offset > text.length() || offset == 0) { + return false; + } + int cp = Character.codePointBefore(text, offset); + int nextCpOffset = Math.min(offset + Character.charCount(cp), text.length() - 1); + int nextCp = Character.codePointBefore(text, nextCpOffset); + + if (isPunctuation(cp)) { + // If it's the start, the current cp and the next cp are + // punctuation. If it's at the end of a punctuation sequence the + // current is punctuation and the next is not. + return isStart ? isPunctuation(nextCp) : !isPunctuation(nextCp); } - return offset; + return false; + } + + private boolean isPunctuation(int cp) { + int type = Character.getType(cp); + return (type == Character.CONNECTOR_PUNCTUATION || + type == Character.DASH_PUNCTUATION || + type == Character.END_PUNCTUATION || + type == Character.FINAL_QUOTE_PUNCTUATION || + type == Character.INITIAL_QUOTE_PUNCTUATION || + type == Character.OTHER_PUNCTUATION || + type == Character.START_PUNCTUATION); } /** @@ -788,7 +845,7 @@ public class Editor { if (selectionStart == BreakIterator.DONE || selectionEnd == BreakIterator.DONE || selectionStart == selectionEnd) { // Possible when the word iterator does not properly handle the text's language - long range = getCharRange(minOffset); + long range = getCharClusterRange(minOffset); selectionStart = TextUtils.unpackRangeStartFromLong(range); selectionEnd = TextUtils.unpackRangeEndFromLong(range); } @@ -831,29 +888,25 @@ public class Editor { return mWordIteratorWithText; } - private long getCharRange(int offset) { + private int getNextCursorOffset(int offset, boolean findAfterGivenOffset) { + final Layout layout = mTextView.getLayout(); + if (layout == null) return offset; + final CharSequence text = mTextView.getText(); + final int nextOffset = layout.getPaint().getTextRunCursor(text, 0, text.length(), + layout.isRtlCharAt(offset) ? Paint.DIRECTION_RTL : Paint.DIRECTION_LTR, + offset, findAfterGivenOffset ? Paint.CURSOR_AFTER : Paint.CURSOR_BEFORE); + return nextOffset == -1 ? offset : nextOffset; + } + + private long getCharClusterRange(int offset) { final int textLength = mTextView.getText().length(); - if (offset + 1 < textLength) { - final char currentChar = mTextView.getText().charAt(offset); - final char nextChar = mTextView.getText().charAt(offset + 1); - if (Character.isSurrogatePair(currentChar, nextChar)) { - return TextUtils.packRangeInLong(offset, offset + 2); - } - } if (offset < textLength) { - return TextUtils.packRangeInLong(offset, offset + 1); - } - if (offset - 2 >= 0) { - final char previousChar = mTextView.getText().charAt(offset - 1); - final char previousPreviousChar = mTextView.getText().charAt(offset - 2); - if (Character.isSurrogatePair(previousPreviousChar, previousChar)) { - return TextUtils.packRangeInLong(offset - 2, offset); - } + return TextUtils.packRangeInLong(offset, getNextCursorOffset(offset, true)); } if (offset - 1 >= 0) { - return TextUtils.packRangeInLong(offset - 1, offset); + return TextUtils.packRangeInLong(getNextCursorOffset(offset, false), offset); } - return TextUtils.packRangeInLong(offset, offset); + return TextUtils.packRangeInLong(offset, offset); } private boolean touchPositionIsInSelection() { @@ -2002,7 +2055,7 @@ public class Editor { shadowView.setText(text); shadowView.setTextColor(mTextView.getTextColors()); - shadowView.setTextAppearance(mTextView.getContext(), R.styleable.Theme_textAppearanceLarge); + shadowView.setTextAppearance(R.styleable.Theme_textAppearanceLarge); shadowView.setGravity(Gravity.CENTER); shadowView.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, @@ -3903,13 +3956,9 @@ public class Editor { public void updatePosition(float x, float y) { final int trueOffset = mTextView.getOffsetForPosition(x, y); final int currLine = mTextView.getLineAtCoordinate(y); - - // Don't select white space on different lines. - if (isWhitespaceLine(mPrevLine, currLine, trueOffset)) return; - boolean positionCursor = false; int offset = trueOffset; - int end = getWordEnd(offset, true); + int end = getWordEnd(offset); int start = getWordStart(offset); if (offset < mPreviousOffset) { @@ -3925,16 +3974,16 @@ public class Editor { } } mTouchWordOffset = Math.max(trueOffset - offset, 0); - mInWord = !isStartBoundary(offset); positionCursor = true; - } else if (offset - mTouchWordOffset > mPreviousOffset) { + } else if (offset - mTouchWordOffset > mPreviousOffset || currLine > mPrevLine) { // User is shrinking the selection. if (currLine > mPrevLine) { // We're on a different line, so we'll snap to word boundaries. - offset = end; + offset = start; + mTouchWordOffset = Math.max(trueOffset - offset, 0); + } else { + offset -= mTouchWordOffset; } - offset -= mTouchWordOffset; - mInWord = !isEndBoundary(offset); positionCursor = true; } @@ -3946,11 +3995,13 @@ public class Editor { int alteredOffset = mTextView.getOffsetAtCoordinate(mPrevLine, x); if (alteredOffset >= selectionEnd) { // Can't pass the other drag handle. - offset = Math.max(0, selectionEnd - 1); + offset = getNextCursorOffset(selectionEnd, false); } else { offset = alteredOffset; } + mTouchWordOffset = 0; } + mInWord = !getWordIteratorWithText().isBoundary(offset); positionAtCursorOffset(offset, false); } } @@ -4005,14 +4056,9 @@ public class Editor { public void updatePosition(float x, float y) { final int trueOffset = mTextView.getOffsetForPosition(x, y); final int currLine = mTextView.getLineAtCoordinate(y); - - // Don't select white space on different lines. - if (isWhitespaceLine(mPrevLine, currLine, trueOffset)) return; - int offset = trueOffset; boolean positionCursor = false; - - int end = getWordEnd(offset, true); + int end = getWordEnd(offset); int start = getWordStart(offset); if (offset > mPreviousOffset) { @@ -4028,17 +4074,17 @@ public class Editor { } } mTouchWordOffset = Math.max(offset - trueOffset, 0); - mInWord = !isEndBoundary(offset); positionCursor = true; - } else if (offset + mTouchWordOffset < mPreviousOffset) { + } else if (offset + mTouchWordOffset < mPreviousOffset || currLine < mPrevLine) { // User is shrinking the selection. if (currLine < mPrevLine) { // We're on a different line, so we'll snap to word boundaries. - offset = start; + offset = end; + mTouchWordOffset = Math.max(offset - trueOffset, 0); + } else { + offset += mTouchWordOffset; } - offset += mTouchWordOffset; positionCursor = true; - mInWord = !isStartBoundary(offset); } if (positionCursor) { @@ -4049,11 +4095,13 @@ public class Editor { int length = mTextView.getText().length(); if (alteredOffset <= selectionStart) { // Can't pass the other drag handle. - offset = Math.min(selectionStart + 1, length); + offset = getNextCursorOffset(selectionStart, true); } else { offset = Math.min(alteredOffset, length); } + mTouchWordOffset = 0; } + mInWord = !getWordIteratorWithText().isBoundary(offset); positionAtCursorOffset(offset, false); } } @@ -4070,36 +4118,6 @@ public class Editor { } /** - * Checks whether selection is happening on a different line than previous and - * if that line only contains whitespace up to the touch location. - * - * @param prevLine The previous line the selection was on. - * @param currLine The current line being selected. - * @param offset The offset in the text where the touch occurred. - * @return Whether or not it was just a white space line being selected. - */ - private boolean isWhitespaceLine(int prevLine, int currLine, int offset) { - if (prevLine == currLine) { - // Same line; don't care. - return false; - } - CharSequence text = mTextView.getText(); - if (offset == text.length()) { - // No character at the last position. - return false; - } - int lineEndOffset = mTextView.getLayout().getLineEnd(currLine); - for (int cp, i = offset; i < lineEndOffset; i += Character.charCount(cp)) { - cp = Character.codePointAt(text, i); - if (!Character.isSpaceChar(cp) && !Character.isWhitespace(cp)) { - // There are non white space chars on the line. - return false; - } - } - return true; - } - - /** * A CursorController instance can be used to control a cursor in the text. */ private interface CursorController extends ViewTreeObserver.OnTouchModeChangeListener { @@ -4178,8 +4196,6 @@ public class Editor { private int mStartOffset = -1; // Indicates whether the user is selecting text and using the drag accelerator. private boolean mDragAcceleratorActive; - // Indicates the line of text the drag accelerator is on. - private int mPrevLine = -1; SelectionModifierCursorController() { resetTouchOffsets(); @@ -4272,8 +4288,6 @@ public class Editor { } } - // New selection, reset line. - mPrevLine = mTextView.getLineAtCoordinate(y); mDownPositionX = x; mDownPositionY = y; mGestureStayedInTapRegion = true; @@ -4318,7 +4332,7 @@ public class Editor { // We don't start "dragging" until the user is past the initial word that // gets selected on long press. int firstWordStart = getWordStart(mStartOffset); - int firstWordEnd = getWordEnd(mStartOffset, false); + int firstWordEnd = getWordEnd(mStartOffset); if (offset > firstWordEnd || offset < firstWordStart) { // Basically the goal in the below code is to have the highlight be @@ -4330,13 +4344,6 @@ public class Editor { if (my > fingerOffset) my -= fingerOffset; offset = mTextView.getOffsetForPosition(mx, my); - int currLine = mTextView.getLineAtCoordinate(my); - - // Don't select white space on different lines. - if (isWhitespaceLine(mPrevLine, currLine, offset)) return; - - mPrevLine = currLine; - // Perform the check for closeness at edge of view, if we're very close // don't adjust the offset to be in front of the finger - otherwise the // user can't select words at the edge. @@ -4365,7 +4372,7 @@ public class Editor { // Need to adjust start offset based on direction of movement. int newStart = mStartOffset < offset ? getWordStart(mStartOffset) - : getWordEnd(mStartOffset, true); + : getWordEnd(mStartOffset); Selection.setSelection((Spannable) mTextView.getText(), newStart, offset); } diff --git a/core/java/android/widget/FrameLayout.java b/core/java/android/widget/FrameLayout.java index 0602944e0de6..7ca450a92a03 100644 --- a/core/java/android/widget/FrameLayout.java +++ b/core/java/android/widget/FrameLayout.java @@ -33,6 +33,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.widget.RemoteViews.RemoteView; import com.android.internal.R; @@ -407,6 +408,18 @@ public class FrameLayout extends ViewGroup { return FrameLayout.class.getName(); } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("measurement:measureAllChildren", mMeasureAllChildren); + encoder.addProperty("padding:foregroundPaddingLeft", mForegroundPaddingLeft); + encoder.addProperty("padding:foregroundPaddingTop", mForegroundPaddingTop); + encoder.addProperty("padding:foregroundPaddingRight", mForegroundPaddingRight); + encoder.addProperty("padding:foregroundPaddingBottom", mForegroundPaddingBottom); + } + /** * Per-child layout information for layouts that support margins. * See {@link android.R.styleable#FrameLayout_Layout FrameLayout Layout Attributes} diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index c95977445b47..dcaafa527920 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -17,6 +17,7 @@ package android.widget; import android.annotation.IntDef; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; @@ -31,6 +32,7 @@ import android.view.SoundEffectConstants; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; @@ -2420,4 +2422,11 @@ public class GridView extends AbsListView { row, 1, column, 1, isHeading, isSelected); info.setCollectionItemInfo(itemInfo); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("numColumns", getNumColumns()); + } } diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 0879c5dc7ede..cf67905af3d6 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; @@ -35,6 +36,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -1695,6 +1697,13 @@ public class HorizontalScrollView extends FrameLayout { return ss; } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("layout:fillViewPort", mFillViewport); + } + static class SavedState extends BaseSavedState { public int scrollPosition; public boolean isLayoutRtl; diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java index 6d2f3686940d..05059bca81d8 100644 --- a/core/java/android/widget/ImageView.java +++ b/core/java/android/widget/ImageView.java @@ -17,6 +17,7 @@ package android.widget; import android.annotation.DrawableRes; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ContentResolver; import android.content.Context; @@ -43,6 +44,7 @@ import android.util.Log; import android.view.RemotableViewMethod; import android.view.View; import android.view.ViewDebug; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.widget.RemoteViews.RemoteView; @@ -1431,4 +1433,11 @@ public class ImageView extends View { public CharSequence getAccessibilityClassName() { return ImageView.class.getName(); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + stream.addProperty("layout:baseline", getBaseline()); + } } diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java index 72f51c91da5f..f153ce53fbc7 100644 --- a/core/java/android/widget/LinearLayout.java +++ b/core/java/android/widget/LinearLayout.java @@ -19,6 +19,7 @@ package android.widget; import com.android.internal.R; import android.annotation.IntDef; +import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.content.res.TypedArray; @@ -29,6 +30,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.widget.RemoteViews.RemoteView; import java.lang.annotation.Retention; @@ -1813,6 +1815,20 @@ public class LinearLayout extends ViewGroup { return LinearLayout.class.getName(); } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("layout:baselineAligned", mBaselineAligned); + encoder.addProperty("layout:baselineAlignedChildIndex", mBaselineAlignedChildIndex); + encoder.addProperty("measurement:baselineChildTop", mBaselineChildTop); + encoder.addProperty("measurement:orientation", mOrientation); + encoder.addProperty("measurement:gravity", mGravity); + encoder.addProperty("measurement:totalLength", mTotalLength); + encoder.addProperty("layout:totalLength", mTotalLength); + encoder.addProperty("layout:useLargestChild", mUseLargestChild); + } + /** * Per-child layout information associated with ViewLinearLayout. * @@ -1921,5 +1937,14 @@ public class LinearLayout extends ViewGroup { return output + "LinearLayout.LayoutParams={width=" + sizeToString(width) + ", height=" + sizeToString(height) + " weight=" + weight + "}"; } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("layout:weight", weight); + encoder.addProperty("layout:gravity", gravity); + } } } diff --git a/core/java/android/widget/ListPopupWindow.java b/core/java/android/widget/ListPopupWindow.java index 05866f07f9a9..94b9416bfdad 100644 --- a/core/java/android/widget/ListPopupWindow.java +++ b/core/java/android/widget/ListPopupWindow.java @@ -1791,8 +1791,9 @@ public class ListPopupWindow { private class ResizePopupRunnable implements Runnable { public void run() { - if (mDropDownList != null && mDropDownList.getCount() > mDropDownList.getChildCount() && - mDropDownList.getChildCount() <= mListItemExpandMaximum) { + if (mDropDownList != null && mDropDownList.isAttachedToWindow() + && mDropDownList.getCount() > mDropDownList.getChildCount() + && mDropDownList.getChildCount() <= mListItemExpandMaximum) { mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); show(); } diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index a79c8e891c9a..7dcaa1f0dfa6 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -23,6 +23,7 @@ import com.android.internal.util.Predicate; import com.google.android.collect.Lists; import android.annotation.IdRes; +import android.annotation.NonNull; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; @@ -40,6 +41,7 @@ import android.view.SoundEffectConstants; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.ViewRootImpl; import android.view.accessibility.AccessibilityNodeInfo; @@ -3938,4 +3940,12 @@ public class ListView extends AbsListView { position, 1, 0, 1, isHeading, isSelected); info.setCollectionItemInfo(itemInfo); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("recycleOnMeasure", recycleOnMeasure()); + } } diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java index 8d8b3a3bd297..97348e3089cf 100644 --- a/core/java/android/widget/MediaController.java +++ b/core/java/android/widget/MediaController.java @@ -28,7 +28,7 @@ import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.MotionEvent; -import android.view.PhoneWindow; +import com.android.internal.policy.PhoneWindow; import android.view.View; import android.view.ViewGroup; import android.view.Window; diff --git a/core/java/android/widget/ProgressBar.java b/core/java/android/widget/ProgressBar.java index b59ae17ebcea..639a09c99b30 100644 --- a/core/java/android/widget/ProgressBar.java +++ b/core/java/android/widget/ProgressBar.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.PorterDuff; @@ -49,6 +50,7 @@ import android.view.Gravity; import android.view.RemotableViewMethod; import android.view.View; import android.view.ViewDebug; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.animation.AlphaAnimation; @@ -1893,6 +1895,17 @@ public class ProgressBar extends View { postDelayed(mAccessibilityEventSender, TIMEOUT_SEND_ACCESSIBILITY_EVENT); } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + + stream.addProperty("progress:max", getMax()); + stream.addProperty("progress:progress", getProgress()); + stream.addProperty("progress:secondaryProgress", getSecondaryProgress()); + stream.addProperty("progress:indeterminate", isIndeterminate()); + } + /** * Command for sending an accessibility event. */ diff --git a/core/java/android/widget/RelativeLayout.java b/core/java/android/widget/RelativeLayout.java index d12739fe3e36..affc5daa35f7 100644 --- a/core/java/android/widget/RelativeLayout.java +++ b/core/java/android/widget/RelativeLayout.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.util.ArrayMap; import com.android.internal.R; @@ -36,6 +37,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.widget.RemoteViews.RemoteView; @@ -1616,6 +1618,13 @@ public class RelativeLayout extends ViewGroup { // This will set the layout direction super.resolveLayoutDirection(layoutDirection); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("layout:alignWithParent", alignWithParent); + } } private static class DependencyGraph { diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 98d61d377ccb..2709f252483b 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -38,6 +39,7 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.ViewParent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -1787,6 +1789,13 @@ public class ScrollView extends FrameLayout { return ss; } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("fillViewport", mFillViewport); + } + static class SavedState extends BaseSavedState { public int scrollPosition; diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java index f94f97c759b8..ff587c2c4c2e 100644 --- a/core/java/android/widget/Switch.java +++ b/core/java/android/widget/Switch.java @@ -26,13 +26,11 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Insets; -import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.Region.Op; import android.graphics.drawable.Drawable; -import android.os.Bundle; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -46,7 +44,7 @@ import android.view.Gravity; import android.view.MotionEvent; import android.view.SoundEffectConstants; import android.view.VelocityTracker; -import android.view.ViewAssistStructure; +import android.view.ViewStructure; import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @@ -1363,8 +1361,8 @@ public class Switch extends CompoundButton { } @Override - public void onProvideAssistStructure(ViewAssistStructure structure) { - super.onProvideAssistStructure(structure); + public void onProvideStructure(ViewStructure structure) { + super.onProvideStructure(structure); CharSequence switchText = isChecked() ? mTextOn : mTextOff; if (!TextUtils.isEmpty(switchText)) { CharSequence oldText = structure.getText(); diff --git a/core/java/android/widget/TableRow.java b/core/java/android/widget/TableRow.java index f73ee49da2f1..d4288d69c2c2 100644 --- a/core/java/android/widget/TableRow.java +++ b/core/java/android/widget/TableRow.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; @@ -24,7 +25,7 @@ import android.view.Gravity; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; - +import android.view.ViewHierarchyEncoder; /** * <p>A layout that arranges its children horizontally. A TableRow should @@ -509,6 +510,14 @@ public class TableRow extends LinearLayout { height = WRAP_CONTENT; } } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + encoder.addProperty("layout:column", column); + encoder.addProperty("layout:span", span); + } } // special transparent hierarchy change listener diff --git a/core/java/android/widget/TextClock.java b/core/java/android/widget/TextClock.java index e2acaac3f06a..5d7b56979218 100644 --- a/core/java/android/widget/TextClock.java +++ b/core/java/android/widget/TextClock.java @@ -16,6 +16,7 @@ package android.widget; +import android.annotation.NonNull; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -32,6 +33,7 @@ import android.provider.Settings; import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.RemotableViewMethod; +import android.view.ViewHierarchyEncoder; import com.android.internal.R; @@ -546,4 +548,18 @@ public class TextClock extends TextView { mTime.setTimeInMillis(System.currentTimeMillis()); setText(DateFormat.format(mFormat, mTime)); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + + CharSequence s = getFormat12Hour(); + stream.addProperty("format12Hour", s == null ? null : s.toString()); + + s = getFormat24Hour(); + stream.addProperty("format24Hour", s == null ? null : s.toString()); + stream.addProperty("format", mFormat == null ? null : mFormat.toString()); + stream.addProperty("hasSeconds", mHasSeconds); + } } diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 449173fb0249..68c49cd06302 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -114,12 +114,13 @@ import android.view.KeyCharacterMap; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; -import android.view.ViewAssistStructure; +import android.view.ViewStructure; import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup.LayoutParams; import android.view.ViewRootImpl; import android.view.ViewTreeObserver; +import android.view.ViewHierarchyEncoder; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; @@ -2844,7 +2845,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener @ViewDebug.IntToString(from = Typeface.BOLD_ITALIC, to = "BOLD_ITALIC") }) public int getTypefaceStyle() { - return mTextPaint.getTypeface().getStyle(); + Typeface typeface = mTextPaint.getTypeface(); + return typeface != null ? typeface.getStyle() : Typeface.NORMAL; } /** @@ -8713,8 +8715,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } @Override - public void onProvideAssistStructure(ViewAssistStructure structure) { - super.onProvideAssistStructure(structure); + public void onProvideStructure(ViewStructure structure) { + super.onProvideStructure(structure); final boolean isPassword = hasPasswordTransformationMethod(); if (!isPassword) { structure.setText(getText(), getSelectionStart(), getSelectionEnd()); @@ -9556,6 +9558,23 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder stream) { + super.encodeProperties(stream); + + TruncateAt ellipsize = getEllipsize(); + stream.addProperty("text:ellipsize", ellipsize == null ? null : ellipsize.name()); + stream.addProperty("text:textSize", getTextSize()); + stream.addProperty("text:scaledTextSize", getScaledTextSize()); + stream.addProperty("text:typefaceStyle", getTypefaceStyle()); + stream.addProperty("text:selectionStart", getSelectionStart()); + stream.addProperty("text:selectionEnd", getSelectionEnd()); + stream.addProperty("text:curTextColor", mCurTextColor); + stream.addProperty("text:text", mText == null ? null : mText.toString()); + stream.addProperty("text:gravity", mGravity); + } + /** * User interface state that is stored by TextView for implementing * {@link View#onSaveInstanceState}. diff --git a/core/java/android/widget/Toolbar.java b/core/java/android/widget/Toolbar.java index 087406a35ca0..62d948d8afb6 100644 --- a/core/java/android/widget/Toolbar.java +++ b/core/java/android/widget/Toolbar.java @@ -590,7 +590,7 @@ public class Toolbar extends ViewGroup { mTitleTextView.setSingleLine(); mTitleTextView.setEllipsize(TextUtils.TruncateAt.END); if (mTitleTextAppearance != 0) { - mTitleTextView.setTextAppearance(context, mTitleTextAppearance); + mTitleTextView.setTextAppearance(mTitleTextAppearance); } if (mTitleTextColor != 0) { mTitleTextView.setTextColor(mTitleTextColor); @@ -644,7 +644,7 @@ public class Toolbar extends ViewGroup { mSubtitleTextView.setSingleLine(); mSubtitleTextView.setEllipsize(TextUtils.TruncateAt.END); if (mSubtitleTextAppearance != 0) { - mSubtitleTextView.setTextAppearance(context, mSubtitleTextAppearance); + mSubtitleTextView.setTextAppearance(mSubtitleTextAppearance); } if (mSubtitleTextColor != 0) { mSubtitleTextView.setTextColor(mSubtitleTextColor); @@ -670,7 +670,7 @@ public class Toolbar extends ViewGroup { public void setTitleTextAppearance(Context context, @StyleRes int resId) { mTitleTextAppearance = resId; if (mTitleTextView != null) { - mTitleTextView.setTextAppearance(context, resId); + mTitleTextView.setTextAppearance(resId); } } @@ -681,7 +681,7 @@ public class Toolbar extends ViewGroup { public void setSubtitleTextAppearance(Context context, @StyleRes int resId) { mSubtitleTextAppearance = resId; if (mSubtitleTextView != null) { - mSubtitleTextView.setTextAppearance(context, resId); + mSubtitleTextView.setTextAppearance(resId); } } diff --git a/core/java/com/android/internal/app/ChooserActivity.java b/core/java/com/android/internal/app/ChooserActivity.java index 62ca1f0f3935..83fa967e5ca8 100644 --- a/core/java/com/android/internal/app/ChooserActivity.java +++ b/core/java/com/android/internal/app/ChooserActivity.java @@ -24,9 +24,11 @@ import android.content.IntentSender; import android.content.IntentSender.SendIntentException; import android.content.ServiceConnection; import android.content.pm.ActivityInfo; +import android.content.pm.LabeledIntent; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; +import android.database.DataSetObserver; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -37,6 +39,7 @@ import android.os.Parcelable; import android.os.RemoteException; import android.os.ResultReceiver; import android.os.UserHandle; +import android.os.UserManager; import android.service.chooser.ChooserTarget; import android.service.chooser.ChooserTargetService; import android.service.chooser.IChooserTargetResult; @@ -44,8 +47,16 @@ import android.service.chooser.IChooserTargetService; import android.text.TextUtils; import android.util.Log; import android.util.Slog; +import android.view.LayoutInflater; import android.view.View; +import android.view.View.OnClickListener; import android.view.ViewGroup; +import android.view.ViewGroup.LayoutParams; +import android.widget.AbsListView; +import android.widget.BaseAdapter; +import android.widget.LinearLayout; +import android.widget.ListView; +import com.android.internal.R; import java.util.ArrayList; import java.util.List; @@ -63,7 +74,7 @@ public class ChooserActivity extends ResolverActivity { private IntentSender mRefinementIntentSender; private RefinementResultReceiver mRefinementResultReceiver; - private ChooserTarget[] mCallerChooserTargets; + private ChooserListAdapter mChooserListAdapter; private final List<ChooserTargetServiceConnection> mServiceConnections = new ArrayList<>(); @@ -84,8 +95,7 @@ public class ChooserActivity extends ResolverActivity { + " Have you considered returning results faster?"); break; } - final ChooserListAdapter cla = (ChooserListAdapter) getAdapter(); - cla.addServiceResults(sri.originalTarget, sri.resultTargets); + mChooserListAdapter.addServiceResults(sri.originalTarget, sri.resultTargets); unbindService(sri.connection); mServiceConnections.remove(sri.connection); break; @@ -166,20 +176,6 @@ public class ChooserActivity extends ResolverActivity { } } - pa = intent.getParcelableArrayExtra(Intent.EXTRA_CHOOSER_TARGETS); - if (pa != null) { - final ChooserTarget[] targets = new ChooserTarget[pa.length]; - for (int i = 0; i < pa.length; i++) { - if (!(pa[i] instanceof ChooserTarget)) { - Log.w(TAG, "Chooser target #" + i + " is not a ChooserTarget: " + pa[i]); - finish(); - super.onCreate(null); - return; - } - targets[i] = (ChooserTarget) pa[i]; - } - mCallerChooserTargets = targets; - } mChosenComponentSender = intent.getParcelableExtra( Intent.EXTRA_CHOSEN_COMPONENT_INTENT_SENDER); mRefinementIntentSender = intent.getParcelableExtra( @@ -233,8 +229,19 @@ public class ChooserActivity extends ResolverActivity { } @Override + void onPrepareAdapterView(AbsListView adapterView, ResolveListAdapter adapter, + boolean alwaysUseOption) { + final ListView listView = adapterView instanceof ListView ? (ListView) adapterView : null; + mChooserListAdapter = (ChooserListAdapter) adapter; + adapterView.setAdapter(new ChooserRowAdapter(mChooserListAdapter)); + if (listView != null) { + listView.setItemsCanFocus(true); + } + } + + @Override int getLayoutResource() { - return com.android.internal.R.layout.chooser_grid; + return R.layout.chooser_grid; } @Override @@ -413,10 +420,11 @@ public class ChooserActivity extends ResolverActivity { } @Override - ResolveListAdapter createAdapter(Context context, Intent[] initialIntents, - List<ResolveInfo> rList, int launchedFromUid, boolean filterLastUsed) { - final ChooserListAdapter adapter = new ChooserListAdapter(context, initialIntents, rList, - launchedFromUid, filterLastUsed, mCallerChooserTargets); + ResolveListAdapter createAdapter(Context context, List<Intent> payloadIntents, + Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid, + boolean filterLastUsed) { + final ChooserListAdapter adapter = new ChooserListAdapter(context, payloadIntents, + initialIntents, rList, launchedFromUid, filterLastUsed); if (DEBUG) Log.d(TAG, "Adapter created; querying services"); queryTargetServices(adapter); return adapter; @@ -426,17 +434,23 @@ public class ChooserActivity extends ResolverActivity { private final DisplayResolveInfo mSourceInfo; private final ResolveInfo mBackupResolveInfo; private final ChooserTarget mChooserTarget; + private Drawable mBadgeIcon = null; private final Drawable mDisplayIcon; private final Intent mFillInIntent; private final int mFillInFlags; - public ChooserTargetInfo(ChooserTarget target) { - this(null, target); - } - public ChooserTargetInfo(DisplayResolveInfo sourceInfo, ChooserTarget chooserTarget) { mSourceInfo = sourceInfo; mChooserTarget = chooserTarget; + if (sourceInfo != null) { + final ResolveInfo ri = sourceInfo.getResolveInfo(); + if (ri != null) { + final ActivityInfo ai = ri.activityInfo; + if (ai != null && ai.applicationInfo != null) { + mBadgeIcon = getPackageManager().getApplicationIcon(ai.applicationInfo); + } + } + } mDisplayIcon = new BitmapDrawable(getResources(), chooserTarget.getIcon()); if (sourceInfo != null) { @@ -453,6 +467,7 @@ public class ChooserActivity extends ResolverActivity { mSourceInfo = other.mSourceInfo; mBackupResolveInfo = other.mBackupResolveInfo; mChooserTarget = other.mChooserTarget; + mBadgeIcon = other.mBadgeIcon; mDisplayIcon = other.mDisplayIcon; mFillInIntent = fillInIntent; mFillInFlags = flags; @@ -460,10 +475,7 @@ public class ChooserActivity extends ResolverActivity { @Override public Intent getResolvedIntent() { - final Intent targetIntent = mChooserTarget.getIntent(); - if (targetIntent != null) { - return targetIntent; - } else if (mSourceInfo != null) { + if (mSourceInfo != null) { return mSourceInfo.getResolvedIntent(); } return getTargetIntent(); @@ -507,7 +519,8 @@ public class ChooserActivity extends ResolverActivity { if (intent == null) { return false; } - return mChooserTarget.sendIntentAsCaller(activity, intent, userId); + // ChooserTargets will launch with their IntentSender's identity + return mChooserTarget.sendIntent(activity, intent); } @Override @@ -516,7 +529,8 @@ public class ChooserActivity extends ResolverActivity { if (intent == null) { return false; } - return mChooserTarget.sendIntentAsUser(activity, intent, user); + // ChooserTargets will launch with their IntentSender's identity + return mChooserTarget.sendIntent(activity, intent); } @Override @@ -540,6 +554,11 @@ public class ChooserActivity extends ResolverActivity { } @Override + public Drawable getBadgeIcon() { + return mBadgeIcon; + } + + @Override public TargetInfo cloneFilledIn(Intent fillInIntent, int flags) { return new ChooserTargetInfo(this, fillInIntent, flags); } @@ -556,16 +575,49 @@ public class ChooserActivity extends ResolverActivity { } public class ChooserListAdapter extends ResolveListAdapter { - private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); - private final List<ChooserTargetInfo> mCallerTargets = new ArrayList<>(); - - public ChooserListAdapter(Context context, Intent[] initialIntents, List<ResolveInfo> rList, - int launchedFromUid, boolean filterLastUsed, ChooserTarget[] callerChooserTargets) { - super(context, initialIntents, rList, launchedFromUid, filterLastUsed); + public static final int TARGET_BAD = -1; + public static final int TARGET_CALLER = 0; + public static final int TARGET_SERVICE = 1; + public static final int TARGET_STANDARD = 2; - if (callerChooserTargets != null) { - for (ChooserTarget target : callerChooserTargets) { - mCallerTargets.add(new ChooserTargetInfo(target)); + private final List<ChooserTargetInfo> mServiceTargets = new ArrayList<>(); + private final List<TargetInfo> mCallerTargets = new ArrayList<>(); + + public ChooserListAdapter(Context context, List<Intent> payloadIntents, + Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid, + boolean filterLastUsed) { + // Don't send the initial intents through the shared ResolverActivity path, + // we want to separate them into a different section. + super(context, payloadIntents, null, rList, launchedFromUid, filterLastUsed); + + if (initialIntents != null) { + final PackageManager pm = getPackageManager(); + for (int i = 0; i < initialIntents.length; i++) { + final Intent ii = initialIntents[i]; + if (ii == null) { + continue; + } + final ActivityInfo ai = ii.resolveActivityInfo(pm, 0); + if (ai == null) { + Log.w(TAG, "No activity found for " + ii); + continue; + } + ResolveInfo ri = new ResolveInfo(); + ri.activityInfo = ai; + UserManager userManager = + (UserManager) getSystemService(Context.USER_SERVICE); + if (userManager.isManagedProfile()) { + ri.noResourceId = true; + } + if (ii instanceof LabeledIntent) { + LabeledIntent li = (LabeledIntent)ii; + ri.resolvePackageName = li.getSourcePackage(); + ri.labelRes = li.getLabelResource(); + ri.nonLocalizedLabel = li.getNonLocalizedLabel(); + ri.icon = li.getIconResource(); + } + mCallerTargets.add(new DisplayResolveInfo(ii, ri, + ri.loadLabel(pm), null, ii)); } } } @@ -578,7 +630,7 @@ public class ChooserActivity extends ResolverActivity { } @Override - public View createView(ViewGroup parent) { + public View onCreateView(ViewGroup parent) { return mInflater.inflate( com.android.internal.R.layout.resolve_grid_item, parent, false); } @@ -600,6 +652,41 @@ public class ChooserActivity extends ResolverActivity { return super.getCount() + mServiceTargets.size() + mCallerTargets.size(); } + public int getCallerTargetsCount() { + return mCallerTargets.size(); + } + + public int getServiceTargetsCount() { + return mServiceTargets.size(); + } + + public int getStandardTargetCount() { + return super.getCount(); + } + + public int getPositionTargetType(int position) { + int offset = 0; + + final int callerTargetCount = mCallerTargets.size(); + if (position < callerTargetCount) { + return TARGET_CALLER; + } + offset += callerTargetCount; + + final int serviceTargetCount = mServiceTargets.size(); + if (position - offset < serviceTargetCount) { + return TARGET_SERVICE; + } + offset += serviceTargetCount; + + final int standardTargetCount = super.getCount(); + if (position - offset < standardTargetCount) { + return TARGET_STANDARD; + } + + return TARGET_BAD; + } + @Override public TargetInfo getItem(int position) { int offset = 0; @@ -643,6 +730,133 @@ public class ChooserActivity extends ResolverActivity { } } + class ChooserRowAdapter extends BaseAdapter { + private ChooserListAdapter mChooserListAdapter; + private final LayoutInflater mLayoutInflater; + private final int mColumnCount = 4; + + public ChooserRowAdapter(ChooserListAdapter wrappedAdapter) { + mChooserListAdapter = wrappedAdapter; + mLayoutInflater = LayoutInflater.from(ChooserActivity.this); + + wrappedAdapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + super.onChanged(); + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + super.onInvalidated(); + notifyDataSetInvalidated(); + } + }); + } + + @Override + public int getCount() { + return (int) ( + Math.ceil((float) mChooserListAdapter.getCallerTargetsCount() / mColumnCount) + + Math.ceil((float) mChooserListAdapter.getServiceTargetsCount() / mColumnCount) + + Math.ceil((float) mChooserListAdapter.getStandardTargetCount() / mColumnCount) + ); + } + + @Override + public Object getItem(int position) { + // We have nothing useful to return here. + return position; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + final View[] holder; + if (convertView == null) { + holder = createViewHolder(parent); + } else { + holder = (View[]) convertView.getTag(); + } + bindViewHolder(position, holder); + + // We keep the actual list item view as the last item in the holder array + return holder[mColumnCount]; + } + + View[] createViewHolder(ViewGroup parent) { + final View[] holder = new View[mColumnCount + 1]; + + final ViewGroup row = (ViewGroup) mLayoutInflater.inflate(R.layout.chooser_row, + parent, false); + for (int i = 0; i < mColumnCount; i++) { + holder[i] = mChooserListAdapter.createView(row); + row.addView(holder[i]); + } + row.setTag(holder); + holder[mColumnCount] = row; + return holder; + } + + void bindViewHolder(int rowPosition, View[] holder) { + final int start = getFirstRowPosition(rowPosition); + final int startType = mChooserListAdapter.getPositionTargetType(start); + + int end = start + mColumnCount - 1; + while (mChooserListAdapter.getPositionTargetType(end) != startType && end >= start) { + end--; + } + + final ViewGroup row = (ViewGroup) holder[mColumnCount]; + + if (startType == ChooserListAdapter.TARGET_SERVICE) { + row.setBackgroundColor(getColor(R.color.chooser_service_row_background_color)); + } else { + row.setBackground(null); + } + + for (int i = 0; i < mColumnCount; i++) { + final View v = holder[i]; + if (start + i <= end) { + v.setVisibility(View.VISIBLE); + final int itemIndex = start + i; + mChooserListAdapter.bindView(itemIndex, v); + v.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + startSelected(itemIndex, false, true); + } + }); + } else { + v.setVisibility(View.GONE); + } + } + } + + int getFirstRowPosition(int row) { + final int callerCount = mChooserListAdapter.getCallerTargetsCount(); + final int callerRows = (int) Math.ceil((float) callerCount / mColumnCount); + + if (row < callerRows) { + return row * mColumnCount; + } + + final int serviceCount = mChooserListAdapter.getServiceTargetsCount(); + final int serviceRows = (int) Math.ceil((float) serviceCount / mColumnCount); + + if (row < callerRows + serviceRows) { + return callerCount + (row - callerRows) * mColumnCount; + } + + return callerCount + serviceCount + + (row - callerRows - serviceRows) * mColumnCount; + } + } + class ChooserTargetServiceConnection implements ServiceConnection { private final DisplayResolveInfo mOriginalTarget; diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java index 204866432000..26cdf6b6eaa2 100644 --- a/core/java/com/android/internal/app/ResolverActivity.java +++ b/core/java/com/android/internal/app/ResolverActivity.java @@ -25,7 +25,6 @@ import android.provider.Settings; import android.text.TextUtils; import android.util.Slog; import android.widget.AbsListView; -import android.widget.GridView; import com.android.internal.R; import com.android.internal.content.PackageMonitor; @@ -83,7 +82,7 @@ import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; * which there is more than one matching activity, allowing the user to decide * which to go to. It is not normally used directly by application developers. */ -public class ResolverActivity extends Activity implements AdapterView.OnItemClickListener { +public class ResolverActivity extends Activity { private static final String TAG = "ResolverActivity"; private static final boolean DEBUG = false; @@ -93,8 +92,6 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic private boolean mSafeForwardingMode; private boolean mAlwaysUseOption; private AbsListView mAdapterView; - private ListView mListView; - private GridView mGridView; private Button mAlwaysButton; private Button mOnceButton; private View mProfileView; @@ -217,6 +214,13 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } catch (RemoteException e) { mLaunchedFromUid = -1; } + + if (mLaunchedFromUid < 0 || UserHandle.isIsolated(mLaunchedFromUid)) { + // Gulp! + finish(); + return; + } + mPm = getPackageManager(); mUsm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); @@ -229,67 +233,11 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic final ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); mIconDpi = am.getLauncherLargeIconDensity(); + // Add our initial intent as the first item, regardless of what else has already been added. mIntents.add(0, new Intent(intent)); - mAdapter = createAdapter(this, initialIntents, rList, mLaunchedFromUid, alwaysUseOption); - - final int layoutId; - final boolean useHeader; - if (mAdapter.hasFilteredItem()) { - layoutId = R.layout.resolver_list_with_default; - alwaysUseOption = false; - useHeader = true; - } else { - useHeader = false; - layoutId = getLayoutResource(); - } - mAlwaysUseOption = alwaysUseOption; - - if (mLaunchedFromUid < 0 || UserHandle.isIsolated(mLaunchedFromUid)) { - // Gulp! - finish(); - return; - } - - int count = mAdapter.mDisplayList.size(); - if (count > 1 || (count == 1 && mAdapter.getOtherProfile() != null)) { - setContentView(layoutId); - mAdapterView = (AbsListView) findViewById(R.id.resolver_list); - mAdapterView.setAdapter(mAdapter); - mAdapterView.setOnItemClickListener(this); - mAdapterView.setOnItemLongClickListener(new ItemLongClickListener()); - - // Initialize the different types of collection views we may have. Depending - // on which ones are initialized later we'll configure different properties. - if (mAdapterView instanceof ListView) { - mListView = (ListView) mAdapterView; - } - if (mAdapterView instanceof GridView) { - mGridView = (GridView) mAdapterView; - } - - if (alwaysUseOption) { - mAdapterView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); - } - if (useHeader && mListView != null) { - mListView.addHeaderView(LayoutInflater.from(this).inflate( - R.layout.resolver_different_item_header, mListView, false)); - } - } else if (count == 1) { - safelyStartActivity(mAdapter.targetInfoForPosition(0, false)); - mPackageMonitor.unregister(); - mRegistered = false; - finish(); - return; - } else { - setContentView(R.layout.resolver_list); - - final TextView empty = (TextView) findViewById(R.id.empty); - empty.setVisibility(View.VISIBLE); + configureContentView(mIntents, initialIntents, rList, alwaysUseOption); - mAdapterView = (AbsListView) findViewById(R.id.resolver_list); - mAdapterView.setVisibility(View.GONE); - } // Prevent the Resolver window from becoming the top fullscreen window and thus from taking // control of the system bars. getWindow().clearFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR); @@ -548,29 +496,6 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } } - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - if (mListView != null) { - position -= mListView.getHeaderViewsCount(); - } - if (position < 0) { - // Header views don't count. - return; - } - final int checkedPos = mAdapterView.getCheckedItemPosition(); - final boolean hasValidSelection = checkedPos != ListView.INVALID_POSITION; - if (mAlwaysUseOption && (!hasValidSelection || mLastSelected != checkedPos)) { - setAlwaysButtonEnabled(hasValidSelection, checkedPos, true); - mOnceButton.setEnabled(hasValidSelection); - if (hasValidSelection) { - mAdapterView.smoothScrollToPosition(checkedPos); - } - mLastSelected = checkedPos; - } else { - startSelected(position, false, true); - } - } - private boolean hasManagedProfile() { UserManager userManager = (UserManager) getSystemService(Context.USER_SERVICE); if (userManager == null) { @@ -831,14 +756,68 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic startActivity(in); } - ResolveListAdapter createAdapter(Context context, Intent[] initialIntents, - List<ResolveInfo> rList, int launchedFromUid, boolean filterLastUsed) { - return new ResolveListAdapter(context, initialIntents, rList, launchedFromUid, - filterLastUsed); + ResolveListAdapter createAdapter(Context context, List<Intent> payloadIntents, + Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid, + boolean filterLastUsed) { + return new ResolveListAdapter(context, payloadIntents, initialIntents, rList, + launchedFromUid, filterLastUsed); } - ResolveListAdapter getAdapter() { - return mAdapter; + void configureContentView(List<Intent> payloadIntents, Intent[] initialIntents, + List<ResolveInfo> rList, boolean alwaysUseOption) { + mAdapter = createAdapter(this, payloadIntents, initialIntents, rList, + mLaunchedFromUid, alwaysUseOption); + + final int layoutId; + if (mAdapter.hasFilteredItem()) { + layoutId = R.layout.resolver_list_with_default; + alwaysUseOption = false; + } else { + layoutId = getLayoutResource(); + } + mAlwaysUseOption = alwaysUseOption; + + int count = mAdapter.mDisplayList.size(); + if (count > 1 || (count == 1 && mAdapter.getOtherProfile() != null)) { + setContentView(layoutId); + mAdapterView = (AbsListView) findViewById(R.id.resolver_list); + onPrepareAdapterView(mAdapterView, mAdapter, alwaysUseOption); + } else if (count == 1) { + safelyStartActivity(mAdapter.targetInfoForPosition(0, false)); + mPackageMonitor.unregister(); + mRegistered = false; + finish(); + return; + } else { + setContentView(R.layout.resolver_list); + + final TextView empty = (TextView) findViewById(R.id.empty); + empty.setVisibility(View.VISIBLE); + + mAdapterView = (AbsListView) findViewById(R.id.resolver_list); + mAdapterView.setVisibility(View.GONE); + } + } + + void onPrepareAdapterView(AbsListView adapterView, ResolveListAdapter adapter, + boolean alwaysUseOption) { + final boolean useHeader = adapter.hasFilteredItem(); + final ListView listView = adapterView instanceof ListView ? (ListView) adapterView : null; + + adapterView.setAdapter(mAdapter); + + final ItemClickListener listener = new ItemClickListener(); + adapterView.setOnItemClickListener(listener); + adapterView.setOnItemLongClickListener(listener); + + if (alwaysUseOption) { + listView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); + } + + if (useHeader && listView != null) { + listView.addHeaderView(LayoutInflater.from(this).inflate( + R.layout.resolver_different_item_header, listView, false)); + } } final class DisplayResolveInfo implements TargetInfo { @@ -888,6 +867,10 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic return mDisplayIcon; } + public Drawable getBadgeIcon() { + return null; + } + @Override public TargetInfo cloneFilledIn(Intent fillInIntent, int flags) { return new DisplayResolveInfo(this, fillInIntent, flags); @@ -1024,6 +1007,11 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic public Drawable getDisplayIcon(); /** + * @return The (small) icon to badge the target with + */ + public Drawable getBadgeIcon(); + + /** * Clone this target with the given fill-in information. */ public TargetInfo cloneFilledIn(Intent fillInIntent, int flags); @@ -1035,6 +1023,7 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic } class ResolveListAdapter extends BaseAdapter { + private final List<Intent> mIntents; private final Intent[] mInitialIntents; private final List<ResolveInfo> mBaseResolveList; private ResolveInfo mLastChosen; @@ -1050,8 +1039,10 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic private int mLastChosenPosition = -1; private boolean mFilterLastUsed; - public ResolveListAdapter(Context context, Intent[] initialIntents, - List<ResolveInfo> rList, int launchedFromUid, boolean filterLastUsed) { + public ResolveListAdapter(Context context, List<Intent> payloadIntents, + Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid, + boolean filterLastUsed) { + mIntents = payloadIntents; mInitialIntents = initialIntents; mBaseResolveList = rList; mLaunchedFromUid = launchedFromUid; @@ -1430,15 +1421,19 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic View view = convertView; if (view == null) { view = createView(parent); - - final ViewHolder holder = new ViewHolder(view); - view.setTag(holder); } - bindView(view, getItem(position)); + onBindView(view, getItem(position)); return view; } - public View createView(ViewGroup parent) { + public final View createView(ViewGroup parent) { + final View view = onCreateView(parent); + final ViewHolder holder = new ViewHolder(view); + view.setTag(holder); + return view; + } + + public View onCreateView(ViewGroup parent) { return mInflater.inflate( com.android.internal.R.layout.resolve_list_item, parent, false); } @@ -1447,7 +1442,11 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic return !TextUtils.isEmpty(info.getExtendedInfo()); } - private final void bindView(View view, TargetInfo info) { + public final void bindView(int position, View view) { + onBindView(view, getItem(position)); + } + + private void onBindView(View view, TargetInfo info) { final ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(info.getDisplayLabel()); if (showsExtendedInfo(info)) { @@ -1461,6 +1460,15 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic new LoadAdapterIconTask((DisplayResolveInfo) info).execute(); } holder.icon.setImageDrawable(info.getDisplayIcon()); + if (holder.badge != null) { + final Drawable badge = info.getBadgeIcon(); + if (badge != null) { + holder.badge.setImageDrawable(badge); + holder.badge.setVisibility(View.VISIBLE); + } else { + holder.badge.setVisibility(View.GONE); + } + } } } @@ -1514,20 +1522,47 @@ public class ResolverActivity extends Activity implements AdapterView.OnItemClic public TextView text; public TextView text2; public ImageView icon; + public ImageView badge; public ViewHolder(View view) { text = (TextView) view.findViewById(com.android.internal.R.id.text1); text2 = (TextView) view.findViewById(com.android.internal.R.id.text2); icon = (ImageView) view.findViewById(R.id.icon); + badge = (ImageView) view.findViewById(R.id.target_badge); } } - class ItemLongClickListener implements AdapterView.OnItemLongClickListener { + class ItemClickListener implements AdapterView.OnItemClickListener, + AdapterView.OnItemLongClickListener { + @Override + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + final ListView listView = parent instanceof ListView ? (ListView) parent : null; + if (listView != null) { + position -= listView.getHeaderViewsCount(); + } + if (position < 0) { + // Header views don't count. + return; + } + final int checkedPos = mAdapterView.getCheckedItemPosition(); + final boolean hasValidSelection = checkedPos != ListView.INVALID_POSITION; + if (mAlwaysUseOption && (!hasValidSelection || mLastSelected != checkedPos)) { + setAlwaysButtonEnabled(hasValidSelection, checkedPos, true); + mOnceButton.setEnabled(hasValidSelection); + if (hasValidSelection) { + mAdapterView.smoothScrollToPosition(checkedPos); + } + mLastSelected = checkedPos; + } else { + startSelected(position, false, true); + } + } @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { - if (mListView != null) { - position -= mListView.getHeaderViewsCount(); + final ListView listView = parent instanceof ListView ? (ListView) parent : null; + if (listView != null) { + position -= listView.getHeaderViewsCount(); } if (position < 0) { // Header views don't count. diff --git a/core/java/com/android/internal/app/RestrictionsPinActivity.java b/core/java/com/android/internal/app/RestrictionsPinActivity.java deleted file mode 100644 index 66585c629099..000000000000 --- a/core/java/com/android/internal/app/RestrictionsPinActivity.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * 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. - */ - -package com.android.internal.app; - -import android.content.Context; -import android.os.Bundle; -import android.os.UserManager; -import android.text.Editable; -import android.text.TextWatcher; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; -import android.widget.TextView.OnEditorActionListener; - -import com.android.internal.R; - -/** - * This activity is launched by Settings and other apps to either create a new PIN or - * challenge for an existing PIN. The PIN is maintained by UserManager. - */ -public class RestrictionsPinActivity extends AlertActivity - implements OnClickListener, TextWatcher, OnEditorActionListener { - - protected UserManager mUserManager; - protected boolean mHasRestrictionsPin; - - protected EditText mPinText; - protected TextView mPinErrorMessage; - private Button mOkButton; - private Button mCancelButton; - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - mUserManager = (UserManager) getSystemService(Context.USER_SERVICE); - mHasRestrictionsPin = mUserManager.hasRestrictionsChallenge(); - initUi(); - setupAlert(); - } - - protected void initUi() { - AlertController.AlertParams ap = mAlertParams; - ap.mTitle = getString(R.string.restr_pin_enter_admin_pin); - LayoutInflater inflater = - (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); - ap.mView = inflater.inflate(R.layout.restrictions_pin_challenge, null); - - mPinErrorMessage = (TextView) ap.mView.findViewById(R.id.pin_error_message); - mPinText = (EditText) ap.mView.findViewById(R.id.pin_text); - mOkButton = (Button) ap.mView.findViewById(R.id.pin_ok_button); - mCancelButton = (Button) ap.mView.findViewById(R.id.pin_cancel_button); - - mPinText.addTextChangedListener(this); - - mOkButton.setOnClickListener(this); - mCancelButton.setOnClickListener(this); - } - - protected boolean verifyingPin() { - return true; - } - - public void onResume() { - super.onResume(); - - setPositiveButtonState(false); - boolean hasPin = mUserManager.hasRestrictionsChallenge(); - if (hasPin) { - mPinErrorMessage.setVisibility(View.INVISIBLE); - mPinText.setOnEditorActionListener(this); - updatePinTimer(-1); - } else if (verifyingPin()) { - setResult(RESULT_OK); - finish(); - } - } - - protected void setPositiveButtonState(boolean enabled) { - mOkButton.setEnabled(enabled); - } - - private boolean updatePinTimer(int pinTimerMs) { - if (pinTimerMs < 0) { - pinTimerMs = mUserManager.checkRestrictionsChallenge(null); - } - boolean enableInput; - if (pinTimerMs >= 200) { - // Do the count down timer for less than a minute, otherwise just say try again later. - if (pinTimerMs <= 60000) { - final int seconds = (pinTimerMs + 200) / 1000; - final String formatString = getResources().getQuantityString( - R.plurals.restr_pin_countdown, - seconds); - mPinErrorMessage.setText(String.format(formatString, seconds)); - } else { - mPinErrorMessage.setText(R.string.restr_pin_try_later); - } - enableInput = false; - mPinErrorMessage.setVisibility(View.VISIBLE); - mPinText.setText(""); - mPinText.postDelayed(mCountdownRunnable, Math.min(1000, pinTimerMs)); - } else { - enableInput = true; - mPinErrorMessage.setText(R.string.restr_pin_incorrect); - } - mPinText.setEnabled(enableInput); - setPositiveButtonState(enableInput); - return enableInput; - } - - protected void performPositiveButtonAction() { - int result = mUserManager.checkRestrictionsChallenge(mPinText.getText().toString()); - if (result == UserManager.PIN_VERIFICATION_SUCCESS) { - setResult(RESULT_OK); - finish(); - } else if (result >= 0) { - mPinErrorMessage.setText(R.string.restr_pin_incorrect); - mPinErrorMessage.setVisibility(View.VISIBLE); - updatePinTimer(result); - mPinText.setText(""); - } - } - - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - CharSequence pin = mPinText.getText(); - setPositiveButtonState(pin != null && pin.length() >= 4); - } - - @Override - public void afterTextChanged(Editable s) { - } - - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - performPositiveButtonAction(); - return true; - } - - private Runnable mCountdownRunnable = new Runnable() { - public void run() { - if (updatePinTimer(-1)) { - // If we are no longer counting down, clear the message. - mPinErrorMessage.setVisibility(View.INVISIBLE); - } - } - }; - - @Override - public void onClick(View v) { - if (v == mOkButton) { - performPositiveButtonAction(); - } else if (v == mCancelButton) { - setResult(RESULT_CANCELED); - finish(); - } - } -} diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java index 6173832d8596..cf25cef920ce 100644 --- a/core/java/com/android/internal/logging/MetricsLogger.java +++ b/core/java/com/android/internal/logging/MetricsLogger.java @@ -18,6 +18,7 @@ package com.android.internal.logging; import android.content.Context; import android.os.Build; +import android.view.View; /** * Log all the things. @@ -26,13 +27,44 @@ import android.os.Build; */ public class MetricsLogger implements MetricsConstants { // These constants are temporary, they should migrate to MetricsConstants. - // next value is 148; public static final int NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144; public static final int NOTIFICATION_ZEN_MODE_EXTERNAL_RULE = 145; public static final int ACTION_BAN_APP_NOTES = 146; public static final int NOTIFICATION_ZEN_MODE_EVENT_RULE = 147; public static final int ACTION_DISMISS_ALL_NOTES = 148; + public static final int QS_DND_DETAILS = 149; + public static final int QS_BLUETOOTH_DETAILS = 150; + public static final int QS_CAST_DETAILS = 151; + public static final int QS_WIFI_DETAILS = 152; + public static final int QS_WIFI_TOGGLE = 153; + public static final int QS_BLUETOOTH_TOGGLE = 154; + public static final int QS_CELLULAR_TOGGLE = 155; + public static final int QS_SWITCH_USER = 156; + public static final int QS_CAST_SELECT = 157; + public static final int QS_CAST_DISCONNECT = 158; + public static final int ACTION_BLUETOOTH_TOGGLE = 159; + public static final int ACTION_BLUETOOTH_SCAN = 160; + public static final int ACTION_BLUETOOTH_RENAME = 161; + public static final int ACTION_BLUETOOTH_FILES = 162; + public static final int QS_DND_TIME = 163; + public static final int QS_DND_CONDITION_SELECT = 164; + public static final int QS_DND_ZEN_SELECT = 165; + public static final int QS_DND_TOGGLE = 166; + public static final int ACTION_ZEN_ALLOW_REMINDERS = 167; + public static final int ACTION_ZEN_ALLOW_EVENTS = 168; + public static final int ACTION_ZEN_ALLOW_MESSAGES = 169; + public static final int ACTION_ZEN_ALLOW_CALLS = 170; + public static final int ACTION_ZEN_ALLOW_REPEAT_CALLS = 171; + public static final int ACTION_ZEN_ADD_RULE = 172; + public static final int ACTION_ZEN_ADD_RULE_OK = 173; + public static final int ACTION_ZEN_DELETE_RULE = 174; + public static final int ACTION_ZEN_DELETE_RULE_OK = 175; + public static final int ACTION_ZEN_ENABLE_RULE = 176; + public static final int ACTION_AIRPLANE_TOGGLE = 177; + public static final int ACTION_CELL_DATA_TOGGLE = 178; + public static final int NOTIFICATION_ACCESS = 179; + public static final int NOTIFICATION_ZEN_MODE_ACCESS = 180; public static void visible(Context context, int category) throws IllegalArgumentException { if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) { @@ -41,17 +73,39 @@ public class MetricsLogger implements MetricsConstants { EventLogTags.writeSysuiViewVisibility(category, 100); } - public static void hidden(Context context, int category) { + public static void hidden(Context context, int category) throws IllegalArgumentException { if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) { throw new IllegalArgumentException("Must define metric category"); } EventLogTags.writeSysuiViewVisibility(category, 0); } + public static void visibility(Context context, int category, boolean visibile) + throws IllegalArgumentException { + if (visibile) { + visible(context, category); + } else { + hidden(context, category); + } + } + + public static void visibility(Context context, int category, int vis) + throws IllegalArgumentException { + visibility(context, category, vis == View.VISIBLE); + } + public static void action(Context context, int category) { action(context, category, ""); } + public static void action(Context context, int category, int value) { + action(context, category, Integer.toString(value)); + } + + public static void action(Context context, int category, boolean value) { + action(context, category, Boolean.toString(value)); + } + public static void action(Context context, int category, String pkg) { if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) { throw new IllegalArgumentException("Must define metric category"); diff --git a/core/java/android/view/PhoneFallbackEventHandler.java b/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java index 350650dfaa9e..2cb9c250d2d1 100644 --- a/core/java/android/view/PhoneFallbackEventHandler.java +++ b/core/java/com/android/internal/policy/PhoneFallbackEventHandler.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view; +package com.android.internal.policy; import android.app.KeyguardManager; import android.app.SearchManager; @@ -28,10 +28,11 @@ import android.os.UserHandle; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.Log; -import android.view.View; -import android.view.HapticFeedbackConstants; import android.view.FallbackEventHandler; +import android.view.HapticFeedbackConstants; import android.view.KeyEvent; +import android.view.View; +import com.android.internal.policy.PhoneWindow; /** * @hide diff --git a/core/java/android/view/PhoneLayoutInflater.java b/core/java/com/android/internal/policy/PhoneLayoutInflater.java index 7d89a0b4bd2f..991b6bba7396 100644 --- a/core/java/android/view/PhoneLayoutInflater.java +++ b/core/java/com/android/internal/policy/PhoneLayoutInflater.java @@ -14,10 +14,12 @@ * limitations under the License. */ -package android.view; +package com.android.internal.policy; import android.content.Context; import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; /** * @hide diff --git a/core/java/android/view/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index a3e7a107495d..a578a6e5ddb2 100644 --- a/core/java/android/view/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.view; +package com.android.internal.policy; import static android.view.View.MeasureSpec.AT_MOST; import static android.view.View.MeasureSpec.EXACTLY; @@ -27,6 +27,34 @@ import android.app.ActivityManagerNative; import android.app.SearchManager; import android.os.UserHandle; +import android.view.ActionMode; +import android.view.ContextThemeWrapper; +import android.view.Display; +import android.view.Gravity; +import android.view.IRotationWatcher.Stub; +import android.view.IWindowManager; +import android.view.InputDevice; +import android.view.InputEvent; +import android.view.InputQueue; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MotionEvent; +import android.view.SearchEvent; +import android.view.SurfaceHolder.Callback2; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.view.ViewManager; +import android.view.ViewParent; +import android.view.ViewRootImpl; +import android.view.ViewStub; +import android.view.ViewTreeObserver.OnPreDrawListener; +import android.view.Window; +import android.view.WindowInsets; +import android.view.WindowManager; import com.android.internal.R; import com.android.internal.util.ScreenShapeHelper; import com.android.internal.view.FloatingActionMode; @@ -67,7 +95,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.os.ServiceManager; -import android.os.SystemProperties; import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; @@ -140,7 +167,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private ViewGroup mContentRoot; - SurfaceHolder.Callback2 mTakeSurfaceCallback; + Callback2 mTakeSurfaceCallback; InputQueue.Callback mTakeInputQueueCallback; @@ -427,7 +454,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } @Override - public void takeSurface(SurfaceHolder.Callback2 callback) { + public void takeSurface(Callback2 callback) { mTakeSurfaceCallback = callback; } @@ -2181,7 +2208,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { private ActionBarContextView mPrimaryActionModeView; private PopupWindow mPrimaryActionModePopup; private Runnable mShowPrimaryActionModePopup; - private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener; + private OnPreDrawListener mFloatingToolbarPreDrawListener; private View mFloatingActionModeOriginatingView; private FloatingToolbar mFloatingToolbar; @@ -3354,7 +3381,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { mContext, callback, originatingView, mFloatingToolbar); mFloatingActionModeOriginatingView = originatingView; mFloatingToolbarPreDrawListener = - new ViewTreeObserver.OnPreDrawListener() { + new OnPreDrawListener() { @Override public boolean onPreDraw() { mode.updateViewLocationInWindow(); @@ -4718,7 +4745,7 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } - static class RotationWatcher extends IRotationWatcher.Stub { + static class RotationWatcher extends Stub { private Handler mHandler; private final Runnable mRotationChanged = new Runnable() { public void run() { diff --git a/core/java/com/android/internal/transition/EpicenterClipReveal.java b/core/java/com/android/internal/transition/EpicenterClipReveal.java deleted file mode 100644 index 1a6736a8677d..000000000000 --- a/core/java/com/android/internal/transition/EpicenterClipReveal.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 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. - */ -package com.android.internal.transition; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.animation.RectEvaluator; -import android.animation.TimeInterpolator; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.transition.TransitionValues; -import android.transition.Visibility; -import android.util.AttributeSet; -import android.util.Property; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.AnimationUtils; -import android.view.animation.PathInterpolator; - -import com.android.internal.R; - -/** - * EpicenterClipReveal captures the {@link View#getClipBounds()} before and - * after the scene change and animates between those and the epicenter bounds - * during a visibility transition. - */ -public class EpicenterClipReveal extends Visibility { - private static final String PROPNAME_CLIP = "android:epicenterReveal:clip"; - private static final String PROPNAME_BOUNDS = "android:epicenterReveal:bounds"; - - private final TimeInterpolator mInterpolatorX; - private final TimeInterpolator mInterpolatorY; - private final boolean mCenterClipBounds; - - public EpicenterClipReveal() { - mInterpolatorX = null; - mInterpolatorY = null; - mCenterClipBounds = false; - } - - public EpicenterClipReveal(Context context, AttributeSet attrs) { - super(context, attrs); - - final TypedArray a = context.obtainStyledAttributes(attrs, - R.styleable.EpicenterClipReveal, 0, 0); - - mCenterClipBounds = a.getBoolean(R.styleable.EpicenterClipReveal_centerClipBounds, false); - - final int interpolatorX = a.getResourceId(R.styleable.EpicenterClipReveal_interpolatorX, 0); - if (interpolatorX != 0) { - mInterpolatorX = AnimationUtils.loadInterpolator(context, interpolatorX); - } else { - mInterpolatorX = TransitionConstants.LINEAR_OUT_SLOW_IN; - } - - final int interpolatorY = a.getResourceId(R.styleable.EpicenterClipReveal_interpolatorY, 0); - if (interpolatorY != 0) { - mInterpolatorY = AnimationUtils.loadInterpolator(context, interpolatorY); - } else { - mInterpolatorY = TransitionConstants.FAST_OUT_SLOW_IN; - } - - a.recycle(); - } - - @Override - public void captureStartValues(TransitionValues transitionValues) { - super.captureStartValues(transitionValues); - captureValues(transitionValues); - } - - @Override - public void captureEndValues(TransitionValues transitionValues) { - super.captureEndValues(transitionValues); - captureValues(transitionValues); - } - - private void captureValues(TransitionValues values) { - final View view = values.view; - if (view.getVisibility() == View.GONE) { - return; - } - - final Rect clip = view.getClipBounds(); - values.values.put(PROPNAME_CLIP, clip); - - if (clip == null) { - final Rect bounds = new Rect(0, 0, view.getWidth(), view.getHeight()); - values.values.put(PROPNAME_BOUNDS, bounds); - } - } - - @Override - public Animator onAppear(ViewGroup sceneRoot, View view, - TransitionValues startValues, TransitionValues endValues) { - if (endValues == null) { - return null; - } - - final Rect end = getBestRect(endValues); - final Rect start = getEpicenterOrCenter(end); - - // Prepare the view. - view.setClipBounds(start); - - return createRectAnimator(view, start, end, endValues, mInterpolatorX, mInterpolatorY); - } - - @Override - public Animator onDisappear(ViewGroup sceneRoot, View view, - TransitionValues startValues, TransitionValues endValues) { - if (startValues == null) { - return null; - } - - final Rect start = getBestRect(startValues); - final Rect end = getEpicenterOrCenter(start); - - // Prepare the view. - view.setClipBounds(start); - - return createRectAnimator(view, start, end, endValues, mInterpolatorX, mInterpolatorY); - } - - private Rect getEpicenterOrCenter(Rect bestRect) { - final Rect epicenter = getEpicenter(); - if (epicenter != null) { - // Translate the clip bounds to be centered within the target bounds. - if (mCenterClipBounds) { - final int offsetX = bestRect.centerX() - epicenter.centerX(); - final int offsetY = bestRect.centerY() - epicenter.centerY(); - epicenter.offset(offsetX, offsetY); - } - return epicenter; - } - - final int centerX = bestRect.centerX(); - final int centerY = bestRect.centerY(); - return new Rect(centerX, centerY, centerX, centerY); - } - - private Rect getBestRect(TransitionValues values) { - final Rect clipRect = (Rect) values.values.get(PROPNAME_CLIP); - if (clipRect == null) { - return (Rect) values.values.get(PROPNAME_BOUNDS); - } - return clipRect; - } - - private static Animator createRectAnimator(final View view, Rect start, Rect end, - TransitionValues endValues, TimeInterpolator interpolatorX, - TimeInterpolator interpolatorY) { - final RectEvaluator evaluator = new RectEvaluator(new Rect()); - final Rect terminalClip = (Rect) endValues.values.get(PROPNAME_CLIP); - - final ClipDimenProperty propX = new ClipDimenProperty(ClipDimenProperty.TARGET_X); - final ObjectAnimator animX = ObjectAnimator.ofObject(view, propX, evaluator, start, end); - if (interpolatorX != null) { - animX.setInterpolator(interpolatorX); - } - - final ClipDimenProperty propY = new ClipDimenProperty(ClipDimenProperty.TARGET_Y); - final ObjectAnimator animY = ObjectAnimator.ofObject(view, propY, evaluator, start, end); - if (interpolatorY != null) { - animY.setInterpolator(interpolatorY); - } - - final AnimatorSet animSet = new AnimatorSet(); - animSet.playTogether(animX, animY); - animSet.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - view.setClipBounds(terminalClip); - } - }); - return animSet; - } - - private static class ClipDimenProperty extends Property<View, Rect> { - public static final char TARGET_X = 'x'; - public static final char TARGET_Y = 'y'; - - private final Rect mTempRect = new Rect(); - - private final int mTargetDimension; - - public ClipDimenProperty(char targetDimension) { - super(Rect.class, "clip_bounds_" + targetDimension); - - mTargetDimension = targetDimension; - } - - @Override - public Rect get(View object) { - final Rect tempRect = mTempRect; - if (!object.getClipBounds(tempRect)) { - tempRect.setEmpty(); - } - return tempRect; - } - - @Override - public void set(View object, Rect value) { - final Rect tempRect = mTempRect; - if (object.getClipBounds(tempRect)) { - if (mTargetDimension == TARGET_X) { - tempRect.left = value.left; - tempRect.right = value.right; - } else { - tempRect.top = value.top; - tempRect.bottom = value.bottom; - } - object.setClipBounds(tempRect); - } - } - } -} diff --git a/core/java/com/android/internal/transition/EpicenterTranslate.java b/core/java/com/android/internal/transition/EpicenterTranslate.java deleted file mode 100644 index eac3ff84508f..000000000000 --- a/core/java/com/android/internal/transition/EpicenterTranslate.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (C) 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. - */ -package com.android.internal.transition; - -import com.android.internal.R; - -import android.animation.Animator; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.animation.TimeInterpolator; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; -import android.transition.TransitionValues; -import android.transition.Visibility; -import android.util.AttributeSet; -import android.view.View; -import android.view.ViewGroup; -import android.view.animation.AnimationUtils; - -/** - * EpicenterTranslate captures the {@link View#getTranslationX()} and - * {@link View#getTranslationY()} before and after the scene change and - * animates between those and the epicenter's center during a visibility - * transition. - */ -public class EpicenterTranslate extends Visibility { - private static final String PROPNAME_BOUNDS = "android:epicenterReveal:bounds"; - private static final String PROPNAME_TRANSLATE_X = "android:epicenterReveal:translateX"; - private static final String PROPNAME_TRANSLATE_Y = "android:epicenterReveal:translateY"; - private static final String PROPNAME_TRANSLATE_Z = "android:epicenterReveal:translateZ"; - private static final String PROPNAME_Z = "android:epicenterReveal:z"; - - private final TimeInterpolator mInterpolatorX; - private final TimeInterpolator mInterpolatorY; - private final TimeInterpolator mInterpolatorZ; - - public EpicenterTranslate() { - mInterpolatorX = null; - mInterpolatorY = null; - mInterpolatorZ = null; - } - - public EpicenterTranslate(Context context, AttributeSet attrs) { - super(context, attrs); - - final TypedArray a = context.obtainStyledAttributes(attrs, - R.styleable.EpicenterTranslate, 0, 0); - - final int interpolatorX = a.getResourceId(R.styleable.EpicenterTranslate_interpolatorX, 0); - if (interpolatorX != 0) { - mInterpolatorX = AnimationUtils.loadInterpolator(context, interpolatorX); - } else { - mInterpolatorX = TransitionConstants.FAST_OUT_SLOW_IN; - } - - final int interpolatorY = a.getResourceId(R.styleable.EpicenterTranslate_interpolatorY, 0); - if (interpolatorY != 0) { - mInterpolatorY = AnimationUtils.loadInterpolator(context, interpolatorY); - } else { - mInterpolatorY = TransitionConstants.FAST_OUT_SLOW_IN; - } - - final int interpolatorZ = a.getResourceId(R.styleable.EpicenterTranslate_interpolatorZ, 0); - if (interpolatorZ != 0) { - mInterpolatorZ = AnimationUtils.loadInterpolator(context, interpolatorZ); - } else { - mInterpolatorZ = TransitionConstants.FAST_OUT_SLOW_IN; - } - - a.recycle(); - } - - @Override - public void captureStartValues(TransitionValues transitionValues) { - super.captureStartValues(transitionValues); - captureValues(transitionValues); - } - - @Override - public void captureEndValues(TransitionValues transitionValues) { - super.captureEndValues(transitionValues); - captureValues(transitionValues); - } - - private void captureValues(TransitionValues values) { - final View view = values.view; - if (view.getVisibility() == View.GONE) { - return; - } - - final Rect bounds = new Rect(0, 0, view.getWidth(), view.getHeight()); - values.values.put(PROPNAME_BOUNDS, bounds); - values.values.put(PROPNAME_TRANSLATE_X, view.getTranslationX()); - values.values.put(PROPNAME_TRANSLATE_Y, view.getTranslationY()); - values.values.put(PROPNAME_TRANSLATE_Z, view.getTranslationZ()); - values.values.put(PROPNAME_Z, view.getZ()); - } - - @Override - public Animator onAppear(ViewGroup sceneRoot, View view, - TransitionValues startValues, TransitionValues endValues) { - if (endValues == null) { - return null; - } - - final Rect end = (Rect) endValues.values.get(PROPNAME_BOUNDS); - final Rect start = getEpicenterOrCenter(end); - final float startX = start.centerX() - end.centerX(); - final float startY = start.centerY() - end.centerY(); - final float startZ = 0 - (float) endValues.values.get(PROPNAME_Z); - - // Translate the view to be centered on the epicenter. - view.setTranslationX(startX); - view.setTranslationY(startY); - view.setTranslationZ(startZ); - - final float endX = (float) endValues.values.get(PROPNAME_TRANSLATE_X); - final float endY = (float) endValues.values.get(PROPNAME_TRANSLATE_Y); - final float endZ = (float) endValues.values.get(PROPNAME_TRANSLATE_Z); - return createAnimator(view, startX, startY, startZ, endX, endY, endZ, - mInterpolatorX, mInterpolatorY, mInterpolatorZ); - } - - @Override - public Animator onDisappear(ViewGroup sceneRoot, View view, - TransitionValues startValues, TransitionValues endValues) { - if (startValues == null) { - return null; - } - - final Rect start = (Rect) endValues.values.get(PROPNAME_BOUNDS); - final Rect end = getEpicenterOrCenter(start); - final float endX = end.centerX() - start.centerX(); - final float endY = end.centerY() - start.centerY(); - final float endZ = 0 - (float) startValues.values.get(PROPNAME_Z); - - final float startX = (float) endValues.values.get(PROPNAME_TRANSLATE_X); - final float startY = (float) endValues.values.get(PROPNAME_TRANSLATE_Y); - final float startZ = (float) endValues.values.get(PROPNAME_TRANSLATE_Z); - return createAnimator(view, startX, startY, startZ, endX, endY, endZ, - mInterpolatorX, mInterpolatorY, mInterpolatorZ); - } - - private Rect getEpicenterOrCenter(Rect bestRect) { - final Rect epicenter = getEpicenter(); - if (epicenter != null) { - return epicenter; - } - - final int centerX = bestRect.centerX(); - final int centerY = bestRect.centerY(); - return new Rect(centerX, centerY, centerX, centerY); - } - - private static Animator createAnimator(final View view, float startX, float startY, - float startZ, float endX, float endY, float endZ, TimeInterpolator interpolatorX, - TimeInterpolator interpolatorY, TimeInterpolator interpolatorZ) { - final ObjectAnimator animX = ObjectAnimator.ofFloat(view, View.TRANSLATION_X, startX, endX); - if (interpolatorX != null) { - animX.setInterpolator(interpolatorX); - } - - final ObjectAnimator animY = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, startY, endY); - if (interpolatorY != null) { - animY.setInterpolator(interpolatorY); - } - - final ObjectAnimator animZ = ObjectAnimator.ofFloat(view, View.TRANSLATION_Z, startZ, endZ); - if (interpolatorZ != null) { - animZ.setInterpolator(interpolatorZ); - } - - final AnimatorSet animSet = new AnimatorSet(); - animSet.playTogether(animX, animY, animZ); - return animSet; - } -} diff --git a/core/java/com/android/internal/transition/EpicenterTranslateClipReveal.java b/core/java/com/android/internal/transition/EpicenterTranslateClipReveal.java new file mode 100644 index 000000000000..2c102978fef1 --- /dev/null +++ b/core/java/com/android/internal/transition/EpicenterTranslateClipReveal.java @@ -0,0 +1,328 @@ +/* + * Copyright (C) 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. + */ +package com.android.internal.transition; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.AnimatorSet; +import android.animation.ObjectAnimator; +import android.animation.TimeInterpolator; +import android.animation.TypeEvaluator; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.transition.TransitionValues; +import android.transition.Visibility; +import android.util.AttributeSet; +import android.util.Property; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AnimationUtils; + +import com.android.internal.R; + +/** + * EpicenterTranslateClipReveal captures the clip bounds and translation values + * before and after the scene change and animates between those and the + * epicenter bounds during a visibility transition. + */ +public class EpicenterTranslateClipReveal extends Visibility { + private static final String PROPNAME_CLIP = "android:epicenterReveal:clip"; + private static final String PROPNAME_BOUNDS = "android:epicenterReveal:bounds"; + private static final String PROPNAME_TRANSLATE_X = "android:epicenterReveal:translateX"; + private static final String PROPNAME_TRANSLATE_Y = "android:epicenterReveal:translateY"; + private static final String PROPNAME_TRANSLATE_Z = "android:epicenterReveal:translateZ"; + private static final String PROPNAME_Z = "android:epicenterReveal:z"; + + private final TimeInterpolator mInterpolatorX; + private final TimeInterpolator mInterpolatorY; + private final TimeInterpolator mInterpolatorZ; + + public EpicenterTranslateClipReveal() { + mInterpolatorX = null; + mInterpolatorY = null; + mInterpolatorZ = null; + } + + public EpicenterTranslateClipReveal(Context context, AttributeSet attrs) { + super(context, attrs); + + final TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.EpicenterTranslateClipReveal, 0, 0); + + final int interpolatorX = a.getResourceId( + R.styleable.EpicenterTranslateClipReveal_interpolatorX, 0); + if (interpolatorX != 0) { + mInterpolatorX = AnimationUtils.loadInterpolator(context, interpolatorX); + } else { + mInterpolatorX = TransitionConstants.LINEAR_OUT_SLOW_IN; + } + + final int interpolatorY = a.getResourceId( + R.styleable.EpicenterTranslateClipReveal_interpolatorY, 0); + if (interpolatorY != 0) { + mInterpolatorY = AnimationUtils.loadInterpolator(context, interpolatorY); + } else { + mInterpolatorY = TransitionConstants.FAST_OUT_SLOW_IN; + } + + final int interpolatorZ = a.getResourceId( + R.styleable.EpicenterTranslateClipReveal_interpolatorZ, 0); + if (interpolatorZ != 0) { + mInterpolatorZ = AnimationUtils.loadInterpolator(context, interpolatorZ); + } else { + mInterpolatorZ = TransitionConstants.FAST_OUT_SLOW_IN; + } + + a.recycle(); + } + + @Override + public void captureStartValues(TransitionValues transitionValues) { + super.captureStartValues(transitionValues); + captureValues(transitionValues); + } + + @Override + public void captureEndValues(TransitionValues transitionValues) { + super.captureEndValues(transitionValues); + captureValues(transitionValues); + } + + private void captureValues(TransitionValues values) { + final View view = values.view; + if (view.getVisibility() == View.GONE) { + return; + } + + final Rect bounds = new Rect(0, 0, view.getWidth(), view.getHeight()); + values.values.put(PROPNAME_BOUNDS, bounds); + values.values.put(PROPNAME_TRANSLATE_X, view.getTranslationX()); + values.values.put(PROPNAME_TRANSLATE_Y, view.getTranslationY()); + values.values.put(PROPNAME_TRANSLATE_Z, view.getTranslationZ()); + values.values.put(PROPNAME_Z, view.getZ()); + + final Rect clip = view.getClipBounds(); + values.values.put(PROPNAME_CLIP, clip); + } + + @Override + public Animator onAppear(ViewGroup sceneRoot, View view, + TransitionValues startValues, TransitionValues endValues) { + if (endValues == null) { + return null; + } + + final Rect endBounds = (Rect) endValues.values.get(PROPNAME_BOUNDS); + final Rect startBounds = getEpicenterOrCenter(endBounds); + final float startX = startBounds.centerX() - endBounds.centerX(); + final float startY = startBounds.centerY() - endBounds.centerY(); + final float startZ = 0 - (float) endValues.values.get(PROPNAME_Z); + + // Translate the view to be centered on the epicenter. + view.setTranslationX(startX); + view.setTranslationY(startY); + view.setTranslationZ(startZ); + + final float endX = (float) endValues.values.get(PROPNAME_TRANSLATE_X); + final float endY = (float) endValues.values.get(PROPNAME_TRANSLATE_Y); + final float endZ = (float) endValues.values.get(PROPNAME_TRANSLATE_Z); + + final Rect endClip = getBestRect(endValues); + final Rect startClip = getEpicenterOrCenter(endClip); + + // Prepare the view. + view.setClipBounds(startClip); + + final State startStateX = new State(startClip.left, startClip.right, startX); + final State endStateX = new State(endClip.left, endClip.right, endX); + final State startStateY = new State(startClip.top, startClip.bottom, startY); + final State endStateY = new State(endClip.top, endClip.bottom, endY); + + return createRectAnimator(view, startStateX, startStateY, startZ, endStateX, endStateY, + endZ, endValues, mInterpolatorX, mInterpolatorY, mInterpolatorZ); + } + + @Override + public Animator onDisappear(ViewGroup sceneRoot, View view, + TransitionValues startValues, TransitionValues endValues) { + if (startValues == null) { + return null; + } + + final Rect startBounds = (Rect) endValues.values.get(PROPNAME_BOUNDS); + final Rect endBounds = getEpicenterOrCenter(startBounds); + final float endX = endBounds.centerX() - startBounds.centerX(); + final float endY = endBounds.centerY() - startBounds.centerY(); + final float endZ = 0 - (float) startValues.values.get(PROPNAME_Z); + + final float startX = (float) endValues.values.get(PROPNAME_TRANSLATE_X); + final float startY = (float) endValues.values.get(PROPNAME_TRANSLATE_Y); + final float startZ = (float) endValues.values.get(PROPNAME_TRANSLATE_Z); + + final Rect startClip = getBestRect(startValues); + final Rect endClip = getEpicenterOrCenter(startClip); + + // Prepare the view. + view.setClipBounds(startClip); + + final State startStateX = new State(startClip.left, startClip.right, startX); + final State endStateX = new State(endClip.left, endClip.right, endX); + final State startStateY = new State(startClip.top, startClip.bottom, startY); + final State endStateY = new State(endClip.top, endClip.bottom, endY); + + return createRectAnimator(view, startStateX, startStateY, startZ, endStateX, endStateY, + endZ, endValues, mInterpolatorX, mInterpolatorY, mInterpolatorZ); + } + + private Rect getEpicenterOrCenter(Rect bestRect) { + final Rect epicenter = getEpicenter(); + if (epicenter != null) { + return epicenter; + } + + final int centerX = bestRect.centerX(); + final int centerY = bestRect.centerY(); + return new Rect(centerX, centerY, centerX, centerY); + } + + private Rect getBestRect(TransitionValues values) { + final Rect clipRect = (Rect) values.values.get(PROPNAME_CLIP); + if (clipRect == null) { + return (Rect) values.values.get(PROPNAME_BOUNDS); + } + return clipRect; + } + + private static Animator createRectAnimator(final View view, State startX, State startY, + float startZ, State endX, State endY, float endZ, TransitionValues endValues, + TimeInterpolator interpolatorX, TimeInterpolator interpolatorY, + TimeInterpolator interpolatorZ) { + final StateEvaluator evaluator = new StateEvaluator(); + + final ObjectAnimator animZ = ObjectAnimator.ofFloat(view, View.TRANSLATION_Z, startZ, endZ); + if (interpolatorZ != null) { + animZ.setInterpolator(interpolatorZ); + } + + final StateProperty propX = new StateProperty(StateProperty.TARGET_X); + final ObjectAnimator animX = ObjectAnimator.ofObject(view, propX, evaluator, startX, endX); + if (interpolatorX != null) { + animX.setInterpolator(interpolatorX); + } + + final StateProperty propY = new StateProperty(StateProperty.TARGET_Y); + final ObjectAnimator animY = ObjectAnimator.ofObject(view, propY, evaluator, startY, endY); + if (interpolatorY != null) { + animY.setInterpolator(interpolatorY); + } + + final Rect terminalClip = (Rect) endValues.values.get(PROPNAME_CLIP); + final AnimatorListenerAdapter animatorListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + view.setClipBounds(terminalClip); + } + }; + + final AnimatorSet animSet = new AnimatorSet(); + animSet.playTogether(animX, animY, animZ); + animSet.addListener(animatorListener); + return animSet; + } + + private static class State { + int lower; + int upper; + float trans; + + public State() {} + + public State(int lower, int upper, float trans) { + this.lower = lower; + this.upper = upper; + this.trans = trans; + } + } + + private static class StateEvaluator implements TypeEvaluator<State> { + private final State mTemp = new State(); + + @Override + public State evaluate(float fraction, State startValue, State endValue) { + mTemp.upper = startValue.upper + (int) ((endValue.upper - startValue.upper) * fraction); + mTemp.lower = startValue.lower + (int) ((endValue.lower - startValue.lower) * fraction); + mTemp.trans = startValue.trans + (int) ((endValue.trans - startValue.trans) * fraction); + return mTemp; + } + } + + private static class StateProperty extends Property<View, State> { + public static final char TARGET_X = 'x'; + public static final char TARGET_Y = 'y'; + + private final Rect mTempRect = new Rect(); + private final State mTempState = new State(); + + private final int mTargetDimension; + + public StateProperty(char targetDimension) { + super(State.class, "state_" + targetDimension); + + mTargetDimension = targetDimension; + } + + @Override + public State get(View object) { + final Rect tempRect = mTempRect; + if (!object.getClipBounds(tempRect)) { + tempRect.setEmpty(); + } + final State tempState = mTempState; + if (mTargetDimension == TARGET_X) { + tempState.trans = object.getTranslationX(); + tempState.lower = tempRect.left + (int) tempState.trans; + tempState.upper = tempRect.right + (int) tempState.trans; + } else { + tempState.trans = object.getTranslationY(); + tempState.lower = tempRect.top + (int) tempState.trans; + tempState.upper = tempRect.bottom + (int) tempState.trans; + } + return tempState; + } + + @Override + public void set(View object, State value) { + final Rect tempRect = mTempRect; + if (object.getClipBounds(tempRect)) { + if (mTargetDimension == TARGET_X) { + tempRect.left = value.lower - (int) value.trans; + tempRect.right = value.upper - (int) value.trans; + } else { + tempRect.top = value.lower - (int) value.trans; + tempRect.bottom = value.upper - (int) value.trans; + } + object.setClipBounds(tempRect); + } + + if (mTargetDimension == TARGET_X) { + object.setTranslationX(value.trans); + } else { + object.setTranslationY(value.trans); + } + } + } +} diff --git a/core/java/com/android/internal/util/AsyncChannel.java b/core/java/com/android/internal/util/AsyncChannel.java index 34f62bac29ea..bd0e6cef8ae9 100644 --- a/core/java/com/android/internal/util/AsyncChannel.java +++ b/core/java/com/android/internal/util/AsyncChannel.java @@ -462,10 +462,8 @@ public class AsyncChannel { } catch(Exception e) { } // Tell source we're disconnected. - if (mSrcHandler != null) { - replyDisconnected(STATUS_SUCCESSFUL); - mSrcHandler = null; - } + replyDisconnected(STATUS_SUCCESSFUL); + mSrcHandler = null; // Unlink only when bindService isn't used if (mConnection == null && mDstMessenger != null && mDeathMonitor!= null) { mDstMessenger.getBinder().unlinkToDeath(mDeathMonitor, 0); @@ -871,6 +869,8 @@ public class AsyncChannel { * @param status to be stored in msg.arg1 */ private void replyDisconnected(int status) { + // Can't reply if already disconnected. Avoid NullPointerException. + if (mSrcHandler == null) return; Message msg = mSrcHandler.obtainMessage(CMD_CHANNEL_DISCONNECTED); msg.arg1 = status; msg.obj = this; diff --git a/core/java/com/android/internal/util/CallbackRegistry.java b/core/java/com/android/internal/util/CallbackRegistry.java new file mode 100644 index 000000000000..0f228d4775fd --- /dev/null +++ b/core/java/com/android/internal/util/CallbackRegistry.java @@ -0,0 +1,395 @@ +/* + * Copyright (C) 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. + */ +package com.android.internal.util; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tracks callbacks for the event. This class supports reentrant modification + * of the callbacks during notification without adversely disrupting notifications. + * A common pattern for callbacks is to receive a notification and then remove + * themselves. This class handles this behavior with constant memory under + * most circumstances. + * + * <p>A subclass of {@link CallbackRegistry.NotifierCallback} must be passed to + * the constructor to define how notifications should be called. That implementation + * does the actual notification on the listener.</p> + * + * <p>This class supports only callbacks with at most two parameters. + * Typically, these are the notification originator and a parameter, but these may + * be used as required. If more than two parameters are required or primitive types + * must be used, <code>A</code> should be some kind of containing structure that + * the subclass may reuse between notifications.</p> + * + * @param <C> The callback type. + * @param <T> The notification sender type. Typically this is the containing class. + * @param <A> Opaque argument used to pass additional data beyond an int. + */ +public class CallbackRegistry<C, T, A> implements Cloneable { + private static final String TAG = "CallbackRegistry"; + + /** An ordered collection of listeners waiting to be notified. */ + private List<C> mCallbacks = new ArrayList<C>(); + + /** + * A bit flag for the first 64 listeners that are removed during notification. + * The lowest significant bit corresponds to the 0th index into mCallbacks. + * For a small number of callbacks, no additional array of objects needs to + * be allocated. + */ + private long mFirst64Removed = 0x0; + + /** + * Bit flags for the remaining callbacks that are removed during notification. + * When there are more than 64 callbacks and one is marked for removal, a dynamic + * array of bits are allocated for the callbacks. + */ + private long[] mRemainderRemoved; + + /** + * The reentrancy level of the notification. When we notify a callback, it may cause + * further notifications. The reentrancy level must be tracked to let us clean up + * the callback state when all notifications have been processed. + */ + private int mNotificationLevel; + + /** The notification mechanism for notifying an event. */ + private final NotifierCallback<C, T, A> mNotifier; + + /** + * Creates an EventRegistry that notifies the event with notifier. + * @param notifier The class to use to notify events. + */ + public CallbackRegistry(NotifierCallback<C, T, A> notifier) { + mNotifier = notifier; + } + + /** + * Notify all callbacks. + * + * @param sender The originator. This is an opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg2 An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + */ + public synchronized void notifyCallbacks(T sender, int arg, A arg2) { + mNotificationLevel++; + notifyRecurseLocked(sender, arg, arg2); + mNotificationLevel--; + if (mNotificationLevel == 0) { + if (mRemainderRemoved != null) { + for (int i = mRemainderRemoved.length - 1; i >= 0; i--) { + final long removedBits = mRemainderRemoved[i]; + if (removedBits != 0) { + removeRemovedCallbacks((i + 1) * Long.SIZE, removedBits); + mRemainderRemoved[i] = 0; + } + } + } + if (mFirst64Removed != 0) { + removeRemovedCallbacks(0, mFirst64Removed); + mFirst64Removed = 0; + } + } + } + + /** + * Notify up to the first Long.SIZE callbacks that don't have a bit set in <code>removed</code>. + * + * @param sender The originator. This is an opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg2 An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + */ + private void notifyFirst64Locked(T sender, int arg, A arg2) { + final int maxNotified = Math.min(Long.SIZE, mCallbacks.size()); + notifyCallbacksLocked(sender, arg, arg2, 0, maxNotified, mFirst64Removed); + } + + /** + * Notify all callbacks using a recursive algorithm to avoid allocating on the heap. + * This part captures the callbacks beyond Long.SIZE that have no bits allocated for + * removal before it recurses into {@link #notifyRemainderLocked(Object, int, A, int)}. + * <p> + * Recursion is used to avoid allocating temporary state on the heap. Each stack has one + * long (64 callbacks) worth of information of which has been removed. + * + * @param sender The originator. This is an opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg2 An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + */ + private void notifyRecurseLocked(T sender, int arg, A arg2) { + final int callbackCount = mCallbacks.size(); + final int remainderIndex = mRemainderRemoved == null ? -1 : mRemainderRemoved.length - 1; + + // Now we've got all callbacks that have no mRemainderRemoved value, so notify the + // others. + notifyRemainderLocked(sender, arg, arg2, remainderIndex); + + // notifyRemainderLocked notifies all at maxIndex, so we'd normally start at maxIndex + 1 + // However, we must also keep track of those in mFirst64Removed, so we add 2 instead: + final int startCallbackIndex = (remainderIndex + 2) * Long.SIZE; + + // The remaining have no bit set + notifyCallbacksLocked(sender, arg, arg2, startCallbackIndex, callbackCount, 0); + } + + /** + * Notify callbacks that have mRemainderRemoved bits set for remainderIndex. If + * remainderIndex is -1, the first 64 will be notified instead. + * + * @param sender The originator. This is an opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg2 An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param remainderIndex The index into mRemainderRemoved that should be notified. + */ + private void notifyRemainderLocked(T sender, int arg, A arg2, int remainderIndex) { + if (remainderIndex < 0) { + notifyFirst64Locked(sender, arg, arg2); + } else { + final long bits = mRemainderRemoved[remainderIndex]; + final int startIndex = (remainderIndex + 1) * Long.SIZE; + final int endIndex = Math.min(mCallbacks.size(), startIndex + Long.SIZE); + notifyRemainderLocked(sender, arg, arg2, remainderIndex - 1); + notifyCallbacksLocked(sender, arg, arg2, startIndex, endIndex, bits); + } + } + + /** + * Notify callbacks from startIndex to endIndex, using bits as the bit status + * for whether they have been removed or not. bits should be from mRemainderRemoved or + * mFirst64Removed. bits set to 0 indicates that all callbacks from startIndex to + * endIndex should be notified. + * + * @param sender The originator. This is an opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param arg2 An opaque parameter passed to + * {@link CallbackRegistry.NotifierCallback#onNotifyCallback(Object, Object, int, A)} + * @param startIndex The index into the mCallbacks to start notifying. + * @param endIndex One past the last index into mCallbacks to notify. + * @param bits A bit field indicating which callbacks have been removed and shouldn't + * be notified. + */ + private void notifyCallbacksLocked(T sender, int arg, A arg2, final int startIndex, + final int endIndex, final long bits) { + long bitMask = 1; + for (int i = startIndex; i < endIndex; i++) { + if ((bits & bitMask) == 0) { + mNotifier.onNotifyCallback(mCallbacks.get(i), sender, arg, arg2); + } + bitMask <<= 1; + } + } + + /** + * Add a callback to be notified. If the callback is already in the list, another won't + * be added. This does not affect current notifications. + * @param callback The callback to add. + */ + public synchronized void add(C callback) { + int index = mCallbacks.lastIndexOf(callback); + if (index < 0 || isRemovedLocked(index)) { + mCallbacks.add(callback); + } + } + + /** + * Returns true if the callback at index has been marked for removal. + * + * @param index The index into mCallbacks to check. + * @return true if the callback at index has been marked for removal. + */ + private boolean isRemovedLocked(int index) { + if (index < Long.SIZE) { + // It is in the first 64 callbacks, just check the bit. + final long bitMask = 1L << index; + return (mFirst64Removed & bitMask) != 0; + } else if (mRemainderRemoved == null) { + // It is after the first 64 callbacks, but nothing else was marked for removal. + return false; + } else { + final int maskIndex = (index / Long.SIZE) - 1; + if (maskIndex >= mRemainderRemoved.length) { + // There are some items in mRemainderRemoved, but nothing at the given index. + return false; + } else { + // There is something marked for removal, so we have to check the bit. + final long bits = mRemainderRemoved[maskIndex]; + final long bitMask = 1L << (index % Long.SIZE); + return (bits & bitMask) != 0; + } + } + } + + /** + * Removes callbacks from startIndex to startIndex + Long.SIZE, based + * on the bits set in removed. + * @param startIndex The index into the mCallbacks to start removing callbacks. + * @param removed The bits indicating removal, where each bit is set for one callback + * to be removed. + */ + private void removeRemovedCallbacks(int startIndex, long removed) { + // The naive approach should be fine. There may be a better bit-twiddling approach. + final int endIndex = startIndex + Long.SIZE; + + long bitMask = 1L << (Long.SIZE - 1); + for (int i = endIndex - 1; i >= startIndex; i--) { + if ((removed & bitMask) != 0) { + mCallbacks.remove(i); + } + bitMask >>>= 1; + } + } + + /** + * Remove a callback. This callback won't be notified after this call completes. + * @param callback The callback to remove. + */ + public synchronized void remove(C callback) { + if (mNotificationLevel == 0) { + mCallbacks.remove(callback); + } else { + int index = mCallbacks.lastIndexOf(callback); + if (index >= 0) { + setRemovalBitLocked(index); + } + } + } + + private void setRemovalBitLocked(int index) { + if (index < Long.SIZE) { + // It is in the first 64 callbacks, just check the bit. + final long bitMask = 1L << index; + mFirst64Removed |= bitMask; + } else { + final int remainderIndex = (index / Long.SIZE) - 1; + if (mRemainderRemoved == null) { + mRemainderRemoved = new long[mCallbacks.size() / Long.SIZE]; + } else if (mRemainderRemoved.length < remainderIndex) { + // need to make it bigger + long[] newRemainders = new long[mCallbacks.size() / Long.SIZE]; + System.arraycopy(mRemainderRemoved, 0, newRemainders, 0, mRemainderRemoved.length); + mRemainderRemoved = newRemainders; + } + final long bitMask = 1L << (index % Long.SIZE); + mRemainderRemoved[remainderIndex] |= bitMask; + } + } + + /** + * Makes a copy of the registered callbacks and returns it. + * + * @return a copy of the registered callbacks. + */ + public synchronized ArrayList<C> copyListeners() { + ArrayList<C> callbacks = new ArrayList<C>(mCallbacks.size()); + int numListeners = mCallbacks.size(); + for (int i = 0; i < numListeners; i++) { + if (!isRemovedLocked(i)) { + callbacks.add(mCallbacks.get(i)); + } + } + return callbacks; + } + + /** + * Returns true if there are no registered callbacks or false otherwise. + * + * @return true if there are no registered callbacks or false otherwise. + */ + public synchronized boolean isEmpty() { + if (mCallbacks.isEmpty()) { + return true; + } else if (mNotificationLevel == 0) { + return false; + } else { + int numListeners = mCallbacks.size(); + for (int i = 0; i < numListeners; i++) { + if (!isRemovedLocked(i)) { + return false; + } + } + return true; + } + } + + /** + * Removes all callbacks from the list. + */ + public synchronized void clear() { + if (mNotificationLevel == 0) { + mCallbacks.clear(); + } else if (!mCallbacks.isEmpty()) { + for (int i = mCallbacks.size() - 1; i >= 0; i--) { + setRemovalBitLocked(i); + } + } + } + + public synchronized CallbackRegistry<C, T, A> clone() { + CallbackRegistry<C, T, A> clone = null; + try { + clone = (CallbackRegistry<C, T, A>) super.clone(); + clone.mFirst64Removed = 0; + clone.mRemainderRemoved = null; + clone.mNotificationLevel = 0; + clone.mCallbacks = new ArrayList<C>(); + final int numListeners = mCallbacks.size(); + for (int i = 0; i < numListeners; i++) { + if (!isRemovedLocked(i)) { + clone.mCallbacks.add(mCallbacks.get(i)); + } + } + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + } + return clone; + } + + /** + * Class used to notify events from CallbackRegistry. + * + * @param <C> The callback type. + * @param <T> The notification sender type. Typically this is the containing class. + * @param <A> An opaque argument to pass to the notifier + */ + public abstract static class NotifierCallback<C, T, A> { + /** + * Used to notify the callback. + * + * @param callback The callback to notify. + * @param sender The opaque sender object. + * @param arg The opaque notification parameter. + * @param arg2 An opaque argument passed in + * {@link CallbackRegistry#notifyCallbacks} + * @see CallbackRegistry#CallbackRegistry(CallbackRegistry.NotifierCallback) + */ + public abstract void onNotifyCallback(C callback, T sender, int arg, A arg2); + } +} diff --git a/core/java/com/android/internal/widget/ActionBarContextView.java b/core/java/com/android/internal/widget/ActionBarContextView.java index 2946456aecce..106272bd9568 100644 --- a/core/java/com/android/internal/widget/ActionBarContextView.java +++ b/core/java/com/android/internal/widget/ActionBarContextView.java @@ -192,10 +192,10 @@ public class ActionBarContextView extends AbsActionBarView implements AnimatorLi mTitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_title); mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle); if (mTitleStyleRes != 0) { - mTitleView.setTextAppearance(mContext, mTitleStyleRes); + mTitleView.setTextAppearance(mTitleStyleRes); } if (mSubtitleStyleRes != 0) { - mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); + mSubtitleView.setTextAppearance(mSubtitleStyleRes); } } diff --git a/core/java/com/android/internal/widget/ActionBarView.java b/core/java/com/android/internal/widget/ActionBarView.java index 6b781c3a887f..825e336a7ea3 100644 --- a/core/java/com/android/internal/widget/ActionBarView.java +++ b/core/java/com/android/internal/widget/ActionBarView.java @@ -813,14 +813,14 @@ public class ActionBarView extends AbsActionBarView implements DecorToolbar { mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.action_bar_subtitle); if (mTitleStyleRes != 0) { - mTitleView.setTextAppearance(mContext, mTitleStyleRes); + mTitleView.setTextAppearance(mTitleStyleRes); } if (mTitle != null) { mTitleView.setText(mTitle); } if (mSubtitleStyleRes != 0) { - mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); + mSubtitleView.setTextAppearance(mSubtitleStyleRes); } if (mSubtitle != null) { mSubtitleView.setText(mSubtitle); diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 3f7696fa8c34..f98fbfc5c77a 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -1247,9 +1247,13 @@ public final class FloatingToolbar { } private static int getAdjustedToolbarWidth(Context context, int width) { - if (width <= 0 || width > getScreenWidth(context)) { - width = context.getResources() - .getDimensionPixelSize(R.dimen.floating_toolbar_default_width); + int maximumWidth = getScreenWidth(context) - 2 * context.getResources() + .getDimensionPixelSize(R.dimen.floating_toolbar_horizontal_margin); + + if (width <= 0 || width > maximumWidth) { + int defaultWidth = context.getResources() + .getDimensionPixelSize(R.dimen.floating_toolbar_preferred_width); + width = Math.min(defaultWidth, maximumWidth); } return width; } diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index 155f5d35c35d..92d5aea18a52 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -144,10 +144,6 @@ public class BootReceiver extends BroadcastReceiver { -LOG_SIZE, "SYSTEM_RECOVERY_LOG"); addFileToDropBox(db, prefs, headers, "/cache/recovery/last_kmsg", -LOG_SIZE, "SYSTEM_RECOVERY_KMSG"); - addFileToDropBox(db, prefs, headers, "/data/dontpanic/apanic_console", - -LOG_SIZE, "APANIC_CONSOLE"); - addFileToDropBox(db, prefs, headers, "/data/dontpanic/apanic_threads", - -LOG_SIZE, "APANIC_THREADS"); addAuditErrorsToDropBox(db, prefs, headers, -LOG_SIZE, "SYSTEM_AUDIT"); addFsckErrorsToDropBox(db, prefs, headers, -LOG_SIZE, "SYSTEM_FSCK"); } else { diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp index 8ae2e3b51e96..2785c4825dd2 100755 --- a/core/jni/android/graphics/Bitmap.cpp +++ b/core/jni/android/graphics/Bitmap.cpp @@ -188,18 +188,43 @@ size_t Bitmap::rowBytes() const { return mPixelRef->rowBytes(); } -SkPixelRef* Bitmap::pixelRef() const { +SkPixelRef* Bitmap::peekAtPixelRef() const { assertValid(); return mPixelRef.get(); } +SkPixelRef* Bitmap::refPixelRef() { + assertValid(); + android::AutoMutex _lock(mLock); + return refPixelRefLocked(); +} + +SkPixelRef* Bitmap::refPixelRefLocked() { + mPixelRef->ref(); + if (mPixelRef->unique()) { + // We just restored this from 0, pin the pixels and inc the strong count + // Note that there *might be* an incoming onStrongRefDestroyed from whatever + // last unref'd + pinPixelsLocked(); + mPinnedRefCount++; + } + return mPixelRef.get(); +} + void Bitmap::reconfigure(const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable) { + { + android::AutoMutex _lock(mLock); + if (mPinnedRefCount) { + ALOGW("Called reconfigure on a bitmap that is in use! This may" + " cause graphical corruption!"); + } + } mPixelRef->reconfigure(info, rowBytes, ctable); } void Bitmap::reconfigure(const SkImageInfo& info) { - mPixelRef->reconfigure(info, mPixelRef->rowBytes(), mPixelRef->colorTable()); + reconfigure(info, info.minRowBytes(), nullptr); } void Bitmap::detachFromJava() { @@ -287,18 +312,10 @@ void Bitmap::unpinPixelsLocked() { void Bitmap::getSkBitmap(SkBitmap* outBitmap) { assertValid(); android::AutoMutex _lock(mLock); - mPixelRef->ref(); - if (mPixelRef->unique()) { - // We just restored this from 0, pin the pixels and inc the strong count - // Note that there *might be* an incoming onStrongRefDestroyed from whatever - // last unref'd - pinPixelsLocked(); - mPinnedRefCount++; - } // Safe because mPixelRef is a WrappedPixelRef type, otherwise rowBytes() // would require locking the pixels first. outBitmap->setInfo(mPixelRef->info(), mPixelRef->rowBytes()); - outBitmap->setPixelRef(mPixelRef.get())->unref(); + outBitmap->setPixelRef(refPixelRefLocked())->unref(); outBitmap->setHasHardwareMipMap(hasHardwareMipMap()); } @@ -323,7 +340,7 @@ public: } void* pixels() { - return mBitmap->pixelRef()->pixels(); + return mBitmap->peekAtPixelRef()->pixels(); } bool valid() { @@ -780,7 +797,7 @@ static jint Bitmap_config(JNIEnv* env, jobject, jlong bitmapHandle) { static jint Bitmap_getGenerationId(JNIEnv* env, jobject, jlong bitmapHandle) { LocalScopedBitmap bitmap(bitmapHandle); - return static_cast<jint>(bitmap->pixelRef()->getGenerationID()); + return static_cast<jint>(bitmap->peekAtPixelRef()->getGenerationID()); } static jboolean Bitmap_isPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle) { @@ -800,10 +817,10 @@ static void Bitmap_setHasAlpha(JNIEnv* env, jobject, jlong bitmapHandle, jboolean hasAlpha, jboolean requestPremul) { LocalScopedBitmap bitmap(bitmapHandle); if (hasAlpha) { - bitmap->pixelRef()->changeAlphaType( + bitmap->peekAtPixelRef()->changeAlphaType( requestPremul ? kPremul_SkAlphaType : kUnpremul_SkAlphaType); } else { - bitmap->pixelRef()->changeAlphaType(kOpaque_SkAlphaType); + bitmap->peekAtPixelRef()->changeAlphaType(kOpaque_SkAlphaType); } } @@ -812,9 +829,9 @@ static void Bitmap_setPremultiplied(JNIEnv* env, jobject, jlong bitmapHandle, LocalScopedBitmap bitmap(bitmapHandle); if (!bitmap->info().isOpaque()) { if (isPremul) { - bitmap->pixelRef()->changeAlphaType(kPremul_SkAlphaType); + bitmap->peekAtPixelRef()->changeAlphaType(kPremul_SkAlphaType); } else { - bitmap->pixelRef()->changeAlphaType(kUnpremul_SkAlphaType); + bitmap->peekAtPixelRef()->changeAlphaType(kUnpremul_SkAlphaType); } } } @@ -1164,7 +1181,7 @@ static jboolean Bitmap_sameAs(JNIEnv* env, jobject, jlong bm0Handle, static jlong Bitmap_refPixelRef(JNIEnv* env, jobject, jlong bitmapHandle) { LocalScopedBitmap bitmap(bitmapHandle); - SkPixelRef* pixelRef = bitmap.valid() ? bitmap->pixelRef() : nullptr; + SkPixelRef* pixelRef = bitmap.valid() ? bitmap->peekAtPixelRef() : nullptr; SkSafeRef(pixelRef); return reinterpret_cast<jlong>(pixelRef); } diff --git a/core/jni/android/graphics/Bitmap.h b/core/jni/android/graphics/Bitmap.h index d6e5c61f4039..efeb8981e0cc 100644 --- a/core/jni/android/graphics/Bitmap.h +++ b/core/jni/android/graphics/Bitmap.h @@ -62,7 +62,8 @@ public: int width() const { return info().width(); } int height() const { return info().height(); } size_t rowBytes() const; - SkPixelRef* pixelRef() const; + SkPixelRef* peekAtPixelRef() const; + SkPixelRef* refPixelRef(); bool valid() const { return mPixelStorageType != PixelStorageType::Invalid; } void reconfigure(const SkImageInfo& info, size_t rowBytes, SkColorTable* ctable); @@ -88,6 +89,7 @@ private: JNIEnv* jniEnv(); bool shouldDisposeSelfLocked(); void assertValid() const; + SkPixelRef* refPixelRefLocked(); android::Mutex mLock; int mPinnedRefCount = 0; diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index cdd397d7fe61..3ca4e726c918 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -184,7 +184,7 @@ public: } mBitmap->reconfigure(info, bitmap->rowBytes(), ctable); - bitmap->setPixelRef(mBitmap->pixelRef()); + bitmap->setPixelRef(mBitmap->refPixelRef())->unref(); // since we're already allocated, we lockPixels right away // HeapAllocator/JavaPixelAllocator behaves this way too @@ -258,7 +258,7 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding unsigned int existingBufferSize = 0; if (javaBitmap != NULL) { reuseBitmap = GraphicsJNI::getBitmap(env, javaBitmap); - if (reuseBitmap->pixelRef()->isImmutable()) { + if (reuseBitmap->peekAtPixelRef()->isImmutable()) { ALOGW("Unable to reuse an immutable bitmap as an image decoder target."); javaBitmap = NULL; reuseBitmap = nullptr; diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp index 0deb8ccb6d95..1c6f7de0df38 100644 --- a/core/jni/android/graphics/Graphics.cpp +++ b/core/jni/android/graphics/Graphics.cpp @@ -352,8 +352,8 @@ void GraphicsJNI::getSkBitmap(JNIEnv* env, jobject bitmap, SkBitmap* outBitmap) getBitmap(env, bitmap)->getSkBitmap(outBitmap); } -SkPixelRef* GraphicsJNI::getSkPixelRef(JNIEnv* env, jobject bitmap) { - return getBitmap(env, bitmap)->pixelRef(); +SkPixelRef* GraphicsJNI::refSkPixelRef(JNIEnv* env, jobject bitmap) { + return getBitmap(env, bitmap)->refPixelRef(); } SkColorType GraphicsJNI::getNativeBitmapColorType(JNIEnv* env, jobject jconfig) { diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h index e748bac63929..ef9c2a976dc5 100644 --- a/core/jni/android/graphics/GraphicsJNI.h +++ b/core/jni/android/graphics/GraphicsJNI.h @@ -52,7 +52,7 @@ public: static android::Canvas* getNativeCanvas(JNIEnv*, jobject canvas); static android::Bitmap* getBitmap(JNIEnv*, jobject bitmap); static void getSkBitmap(JNIEnv*, jobject bitmap, SkBitmap* outBitmap); - static SkPixelRef* getSkPixelRef(JNIEnv*, jobject bitmap); + static SkPixelRef* refSkPixelRef(JNIEnv*, jobject bitmap); static SkRegion* getNativeRegion(JNIEnv*, jobject region); // Given the 'native' long held by the Rasterizer.java object, return a diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp index 662ecd332502..aeb058bc9ce4 100644 --- a/core/jni/android_media_AudioTrack.cpp +++ b/core/jni/android_media_AudioTrack.cpp @@ -35,7 +35,7 @@ #include "android_media_AudioFormat.h" #include "android_media_AudioErrors.h" -#include "android_media_PlaybackSettings.h" +#include "android_media_PlaybackParams.h" #include "android_media_DeviceCallback.h" // ---------------------------------------------------------------------------- @@ -61,7 +61,7 @@ struct audio_attributes_fields_t { }; static audio_track_fields_t javaAudioTrackFields; static audio_attributes_fields_t javaAudioAttrFields; -static PlaybackSettings::fields_t gPlaybackSettingsFields; +static PlaybackParams::fields_t gPlaybackParamsFields; struct audiotrack_callback_cookie { jclass audioTrack_class; @@ -693,8 +693,8 @@ static jint android_media_AudioTrack_get_playback_rate(JNIEnv *env, jobject thi // ---------------------------------------------------------------------------- -static void android_media_AudioTrack_set_playback_settings(JNIEnv *env, jobject thiz, - jobject settings) { +static void android_media_AudioTrack_set_playback_params(JNIEnv *env, jobject thiz, + jobject params) { sp<AudioTrack> lpTrack = getAudioTrack(env, thiz); if (lpTrack == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -702,10 +702,10 @@ static void android_media_AudioTrack_set_playback_settings(JNIEnv *env, jobject return; } - PlaybackSettings pbs; - pbs.fillFromJobject(env, gPlaybackSettingsFields, settings); + PlaybackParams pbs; + pbs.fillFromJobject(env, gPlaybackParamsFields, params); - ALOGV("setPlaybackSettings: %d:%f %d:%f %d:%u %d:%u", + ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", pbs.speedSet, pbs.audioRate.mSpeed, pbs.pitchSet, pbs.audioRate.mPitch, pbs.audioFallbackModeSet, pbs.audioRate.mFallbackMode, @@ -719,8 +719,8 @@ static void android_media_AudioTrack_set_playback_settings(JNIEnv *env, jobject // ---------------------------------------------------------------------------- -static jobject android_media_AudioTrack_get_playback_settings(JNIEnv *env, jobject thiz, - jobject settings) { +static jobject android_media_AudioTrack_get_playback_params(JNIEnv *env, jobject thiz, + jobject params) { sp<AudioTrack> lpTrack = getAudioTrack(env, thiz); if (lpTrack == NULL) { jniThrowException(env, "java/lang/IllegalStateException", @@ -728,13 +728,13 @@ static jobject android_media_AudioTrack_get_playback_settings(JNIEnv *env, jobj return NULL; } - PlaybackSettings pbs; + PlaybackParams pbs; pbs.audioRate = lpTrack->getPlaybackRate(); pbs.speedSet = true; pbs.pitchSet = true; pbs.audioFallbackModeSet = true; pbs.audioStretchModeSet = true; - return pbs.asJobject(env, gPlaybackSettingsFields); + return pbs.asJobject(env, gPlaybackParamsFields); } @@ -1049,12 +1049,12 @@ static JNINativeMethod gMethods[] = { "(I)I", (void *)android_media_AudioTrack_set_playback_rate}, {"native_get_playback_rate", "()I", (void *)android_media_AudioTrack_get_playback_rate}, - {"native_set_playback_settings", - "(Landroid/media/PlaybackSettings;)V", - (void *)android_media_AudioTrack_set_playback_settings}, - {"native_get_playback_settings", - "()Landroid/media/PlaybackSettings;", - (void *)android_media_AudioTrack_get_playback_settings}, + {"native_set_playback_params", + "(Landroid/media/PlaybackParams;)V", + (void *)android_media_AudioTrack_set_playback_params}, + {"native_get_playback_params", + "()Landroid/media/PlaybackParams;", + (void *)android_media_AudioTrack_get_playback_params}, {"native_set_marker_pos","(I)I", (void *)android_media_AudioTrack_set_marker_pos}, {"native_get_marker_pos","()I", (void *)android_media_AudioTrack_get_marker_pos}, {"native_set_pos_update_period", @@ -1144,8 +1144,8 @@ int register_android_media_AudioTrack(JNIEnv *env) env->DeleteLocalRef(audioAttrClass); - // initialize PlaybackSettings field info - gPlaybackSettingsFields.init(env); + // initialize PlaybackParams field info + gPlaybackParamsFields.init(env); return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods)); } diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index db495dd4709f..74a9e4e2d162 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -976,6 +976,12 @@ static void android_content_AssetManager_copyTheme(JNIEnv* env, jobject clazz, dest->setTo(*src); } +static void android_content_AssetManager_clearTheme(JNIEnv* env, jobject clazz, jlong themeHandle) +{ + ResTable::Theme* theme = reinterpret_cast<ResTable::Theme*>(themeHandle); + theme->clear(); +} + static jint android_content_AssetManager_loadThemeAttributeValue( JNIEnv* env, jobject clazz, jlong themeHandle, jint ident, jobject outValue, jboolean resolve) { @@ -2108,6 +2114,8 @@ static JNINativeMethod gAssetManagerMethods[] = { (void*) android_content_AssetManager_applyThemeStyle }, { "copyTheme", "(JJ)V", (void*) android_content_AssetManager_copyTheme }, + { "clearTheme", "(J)V", + (void*) android_content_AssetManager_clearTheme }, { "loadThemeAttributeValue", "(JILandroid/util/TypedValue;Z)I", (void*) android_content_AssetManager_loadThemeAttributeValue }, { "getThemeChangingConfigurations", "(J)I", diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 1965cd399a04..77af341590f7 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -180,7 +180,7 @@ static jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz, (void*) screenshot->getPixels(), (void*) screenshot.get(), DeleteScreenshot, screenshotInfo, rowBytes, nullptr); screenshot.detach(); - bitmap->pixelRef()->setImmutable(); + bitmap->peekAtPixelRef()->setImmutable(); return GraphicsJNI::createBitmap(env, bitmap, GraphicsJNI::kBitmapCreateFlag_Premultiplied, NULL); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index e3930cdbdf8a..e5bba6e06139 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2103,7 +2103,8 @@ <!-- @SystemApi Allows an application to collect component usage statistics - <p>Not for use by third-party applications. --> + <p>Declaring the permission implies intention to use the API and the user of the + device can grant permission through the Settings application. --> <permission android:name="android.permission.PACKAGE_USAGE_STATS" android:protectionLevel="signature|development|appop" /> <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" /> @@ -2352,11 +2353,6 @@ <permission android:name="android.permission.BIND_CONDITION_PROVIDER_SERVICE" android:protectionLevel="signature" /> - <!-- Must be required by a {@link android.media.routing.MediaRouteService}, - to ensure that only the system can bind to it. --> - <permission android:name="android.permission.BIND_MEDIA_ROUTE_SERVICE" - android:protectionLevel="signature" /> - <!-- Must be required by an {@link android.service.dreams.DreamService}, to ensure that only the system can bind to it. --> <permission android:name="android.permission.BIND_DREAM_SERVICE" @@ -2578,17 +2574,6 @@ android:process=":ui"> </activity> - <activity android:name="com.android.internal.app.RestrictionsPinActivity" - android:theme="@style/Theme.Material.DayNight.Dialog.Alert" - android:excludeFromRecents="true" - android:windowSoftInputMode="adjustPan" - android:process=":ui"> - <intent-filter android:priority="100"> - <action android:name="android.intent.action.RESTRICTIONS_CHALLENGE" /> - <category android:name="android.intent.category.DEFAULT" /> - </intent-filter> - </activity> - <receiver android:name="com.android.server.BootReceiver" android:primaryUserOnly="true"> <intent-filter android:priority="1000"> diff --git a/core/res/res/drawable-hdpi/text_cursor_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/text_cursor_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 0179433e7f1d..000000000000 --- a/core/res/res/drawable-hdpi/text_cursor_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/text_cursor_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/text_cursor_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index e5760be70067..000000000000 --- a/core/res/res/drawable-mdpi/text_cursor_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/text_cursor_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/text_cursor_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 39392149d2e8..000000000000 --- a/core/res/res/drawable-xhdpi/text_cursor_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable-xxhdpi/text_cursor_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/text_cursor_mtrl_alpha.9.png Binary files differdeleted file mode 100644 index 432c3859f98b..000000000000 --- a/core/res/res/drawable-xxhdpi/text_cursor_mtrl_alpha.9.png +++ /dev/null diff --git a/core/res/res/drawable/text_cursor_material.xml b/core/res/res/drawable/text_cursor_material.xml index a350c47b61f7..0bedaa9427fb 100644 --- a/core/res/res/drawable/text_cursor_material.xml +++ b/core/res/res/drawable/text_cursor_material.xml @@ -14,6 +14,15 @@ limitations under the License. --> -<nine-patch xmlns:android="http://schemas.android.com/apk/res/android" - android:src="@drawable/text_cursor_mtrl_alpha" - android:tint="?attr/colorControlActivated" /> +<inset xmlns:android="http://schemas.android.com/apk/res/android" + android:inset="2dp"> + <shape + android:tint="?attr/colorControlActivated" + android:shape="rectangle"> + <size + android:height="2dp" + android:width="2dp" /> + <solid + android:color="@color/white" /> + </shape> +</inset> diff --git a/core/res/res/layout-land/time_picker_material.xml b/core/res/res/layout-land/time_picker_material.xml index 89c3749ed17f..4b544d2244c1 100644 --- a/core/res/res/layout-land/time_picker_material.xml +++ b/core/res/res/layout-land/time_picker_material.xml @@ -16,7 +16,6 @@ --> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> @@ -27,8 +26,7 @@ android:layout_column="0" android:layout_row="0" android:layout_rowSpan="3" - android:layout_gravity="center|fill" - tools:background="@color/accent_material_light" /> + android:layout_gravity="center|fill" /> <RelativeLayout android:layout_width="wrap_content" @@ -56,20 +54,14 @@ android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:singleLine="true" android:ellipsize="none" - android:gravity="right" - tools:text="23" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:gravity="right" /> <TextView android:id="@+id/separator" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" - android:importantForAccessibility="no" - tools:text=":" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:importantForAccessibility="no" /> <!-- The minutes should always be to the right of the separator, regardless of the current locale's layout direction. --> @@ -80,10 +72,7 @@ android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:singleLine="true" android:ellipsize="none" - android:gravity="left" - tools:text="59" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:gravity="left" /> </LinearLayout> <!-- The layout alignment of this view will switch between toRightOf @@ -106,10 +95,7 @@ android:paddingTop="@dimen/timepicker_am_top_padding" android:lines="1" android:ellipsize="none" - android:includeFontPadding="false" - tools:text="AM" - tools:textSize="@dimen/timepicker_ampm_label_size" - tools:textColor="@color/white" /> + android:includeFontPadding="false" /> <CheckedTextView android:id="@+id/pm_label" @@ -121,10 +107,7 @@ android:paddingTop="@dimen/timepicker_pm_top_padding" android:lines="1" android:ellipsize="none" - android:includeFontPadding="false" - tools:text="PM" - tools:textSize="@dimen/timepicker_ampm_label_size" - tools:textColor="@color/white" /> + android:includeFontPadding="false" /> </LinearLayout> </RelativeLayout> diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml index 0fa82ebcb9d6..dcdfb6c318d4 100644 --- a/core/res/res/layout/chooser_grid.xml +++ b/core/res/res/layout/chooser_grid.xml @@ -21,7 +21,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:maxWidth="@dimen/resolver_max_width" - android:maxCollapsedHeight="256dp" + android:maxCollapsedHeight="288dp" android:maxCollapsedHeightSmall="56dp" android:id="@id/contentPanel"> @@ -30,24 +30,25 @@ android:layout_height="wrap_content" android:layout_alwaysShow="true" android:elevation="8dp" - android:paddingStart="?attr/dialogPreferredPadding" + android:paddingStart="16dp" android:background="@color/white" > <ImageView android:id="@+id/title_icon" android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="start|center_vertical" android:layout_marginEnd="16dp" + android:visibility="gone" android:scaleType="fitCenter" /> <TextView android:id="@+id/title" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:minHeight="56dp" android:textAppearance="?attr/textAppearanceMedium" + android:textSize="14sp" android:gravity="start|center_vertical" android:paddingEnd="?attr/dialogPreferredPadding" - android:paddingTop="8dp" - android:paddingBottom="8dp" /> + android:paddingTop="12dp" + android:paddingBottom="12dp" /> <LinearLayout android:id="@+id/profile_button" android:layout_width="wrap_content" android:layout_height="48dp" @@ -82,23 +83,24 @@ </LinearLayout> </LinearLayout> - <GridView + <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/resolver_list" android:clipToPadding="false" - android:paddingStart="@dimen/chooser_grid_padding" - android:paddingEnd="@dimen/chooser_grid_padding" android:scrollbarStyle="outsideOverlay" android:background="@color/white" android:elevation="8dp" - android:numColumns="4" + android:listSelector="@color/transparent" + android:divider="@null" + android:scrollIndicators="top" android:nestedScrollingEnabled="true" /> <TextView android:id="@+id/empty" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alwaysShow="true" + android:background="@color/white" android:text="@string/noApplications" android:padding="32dp" android:gravity="center" diff --git a/core/res/res/layout/chooser_row.xml b/core/res/res/layout/chooser_row.xml new file mode 100644 index 000000000000..9baa32c67f3f --- /dev/null +++ b/core/res/res/layout/chooser_row.xml @@ -0,0 +1,31 @@ +<?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. +*/ +--> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="horizontal" + android:layout_width="match_parent" android:layout_height="wrap_content" + android:minHeight="80dp" + android:gravity="start|top" + android:paddingTop="8dp" + android:paddingBottom="8dp" + android:paddingStart="@dimen/chooser_grid_padding" + android:paddingEnd="@dimen/chooser_grid_padding" + android:weightSum="4"> + +</LinearLayout> + diff --git a/core/res/res/layout/date_picker_header_material.xml b/core/res/res/layout/date_picker_header_material.xml index 21503415b857..a4388f61a281 100644 --- a/core/res/res/layout/date_picker_header_material.xml +++ b/core/res/res/layout/date_picker_header_material.xml @@ -16,17 +16,13 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:id="@+id/date_picker_header" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="18dp" android:paddingStart="?attr/dialogPreferredPadding" android:paddingEnd="?attr/dialogPreferredPadding" - android:orientation="vertical" - tools:background="@color/accent_material_light" - tools:paddingStart="24dp" - tools:paddingEnd="24dp"> + android:orientation="vertical"> <!-- Top padding should stay on this view so that the touch target is a bit larger. --> @@ -35,10 +31,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="16dp" - android:textAppearance="@style/TextAppearance.Material.DatePicker.YearLabel" - tools:text="2015" - tools:textSize="@dimen/date_picker_year_label_size" - tools:textColor="@color/white" /> + android:textAppearance="@style/TextAppearance.Material.DatePicker.YearLabel" /> <TextView android:id="@+id/date_picker_header_date" @@ -47,9 +40,6 @@ android:textAppearance="@style/TextAppearance.Material.DatePicker.DateLabel" android:gravity="start" android:maxLines="2" - android:ellipsize="none" - tools:text="Thu, Sep 30" - tools:textSize="@dimen/date_picker_date_label_size" - tools:textColor="@color/white" /> + android:ellipsize="none" /> </LinearLayout> diff --git a/core/res/res/layout/resolve_grid_item.xml b/core/res/res/layout/resolve_grid_item.xml index 664b02fdbb60..1c496f6435d6 100644 --- a/core/res/res/layout/resolve_grid_item.xml +++ b/core/res/res/layout/resolve_grid_item.xml @@ -18,18 +18,31 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" - android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" android:minWidth="80dp" android:gravity="center" android:paddingTop="8dp" android:paddingBottom="8dp" - android:background="?attr/activatedBackgroundIndicator"> + android:background="?attr/selectableItemBackgroundBorderless"> - <!-- Activity icon when presenting dialog --> - <ImageView android:id="@+id/icon" - android:layout_width="48dp" - android:layout_height="48dp" - android:scaleType="fitCenter" /> + <FrameLayout android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <ImageView android:id="@+id/icon" + android:layout_width="48dp" + android:layout_height="48dp" + android:layout_marginLeft="3dp" + android:layout_marginRight="3dp" + android:layout_marginBottom="3dp" + android:scaleType="fitCenter" /> + <ImageView android:id="@+id/target_badge" + android:layout_width="16dp" + android:layout_height="16dp" + android:layout_gravity="end|bottom" + android:visibility="gone" + android:scaleType="fitCenter" /> + </FrameLayout> <!-- Activity name --> <TextView android:id="@android:id/text1" @@ -40,21 +53,23 @@ android:layout_marginRight="4dp" android:textAppearance="?attr/textAppearanceSmall" android:textColor="?attr/textColorPrimary" + android:textSize="12sp" android:fontFamily="sans-serif-condensed" - android:gravity="center" + android:gravity="top|center_horizontal" android:minLines="2" android:maxLines="2" android:ellipsize="marquee" /> <!-- Extended activity info to distinguish between duplicate activity names --> <TextView android:id="@android:id/text2" android:textAppearance="?android:attr/textAppearanceSmall" + android:textSize="12sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:minLines="2" android:maxLines="2" - android:gravity="center" + android:gravity="top|center_horizontal" android:ellipsize="marquee" /> </LinearLayout> diff --git a/core/res/res/layout/time_picker_header_material.xml b/core/res/res/layout/time_picker_header_material.xml index be9e4431da7f..3f5e300628b2 100644 --- a/core/res/res/layout/time_picker_header_material.xml +++ b/core/res/res/layout/time_picker_header_material.xml @@ -18,13 +18,11 @@ <!-- This layout is duplicated in land/time_picker_material.xml, so any changes made here need to be manually copied over. --> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" android:id="@+id/time_header" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" - android:padding="@dimen/timepicker_separator_padding" - tools:background="@color/accent_material_light"> + android:padding="@dimen/timepicker_separator_padding"> <!-- The hour should always be to the left of the separator, regardless of the current locale's layout direction. --> @@ -37,10 +35,7 @@ android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:singleLine="true" android:ellipsize="none" - android:gravity="right" - tools:text="23" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:gravity="right" /> <TextView android:id="@+id/separator" @@ -50,10 +45,7 @@ android:layout_marginRight="@dimen/timepicker_separator_padding" android:layout_centerInParent="true" android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" - android:importantForAccessibility="no" - tools:text=":" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:importantForAccessibility="no" /> <!-- The minutes should always be to the left of the separator, regardless of the current locale's layout direction. --> @@ -66,10 +58,7 @@ android:textAppearance="@style/TextAppearance.Material.TimePicker.TimeLabel" android:singleLine="true" android:ellipsize="none" - android:gravity="left" - tools:text="59" - tools:textSize="@dimen/timepicker_time_label_size" - tools:textColor="@color/white" /> + android:gravity="left" /> <!-- The layout alignment of this view will switch between toRightOf @id/minutes and toLeftOf @id/hours depending on the locale. --> @@ -90,10 +79,7 @@ android:paddingTop="@dimen/timepicker_am_top_padding" android:textAppearance="@style/TextAppearance.Material.TimePicker.AmPmLabel" android:lines="1" - android:ellipsize="none" - tools:text="AM" - tools:textSize="@dimen/timepicker_ampm_label_size" - tools:textColor="@color/white" /> + android:ellipsize="none" /> <CheckedTextView android:id="@+id/pm_label" android:layout_width="wrap_content" @@ -103,9 +89,6 @@ android:paddingTop="@dimen/timepicker_pm_top_padding" android:textAppearance="@style/TextAppearance.Material.TimePicker.AmPmLabel" android:lines="1" - android:ellipsize="none" - tools:text="PM" - tools:textSize="@dimen/timepicker_ampm_label_size" - tools:textColor="@color/white" /> + android:ellipsize="none" /> </LinearLayout> </RelativeLayout> diff --git a/core/res/res/transition/popup_window_enter.xml b/core/res/res/transition/popup_window_enter.xml index 38c41f016635..c4c8dacdf027 100644 --- a/core/res/res/transition/popup_window_enter.xml +++ b/core/res/res/transition/popup_window_enter.xml @@ -16,17 +16,14 @@ <transitionSet xmlns:android="http://schemas.android.com/apk/res/android" android:transitionOrdering="together"> - <!-- Start from location of epicenter, move to popup location. --> - <transition - class="com.android.internal.transition.EpicenterTranslate" - android:duration="300" /> - <!-- Start from size of epicenter, expand to full width/height. --> <transition - class="com.android.internal.transition.EpicenterClipReveal" - android:centerClipBounds="true" - android:duration="300" /> + class="com.android.internal.transition.EpicenterTranslateClipReveal" + android:duration="250" /> <!-- Quickly fade in. --> - <fade android:duration="100" /> + <fade + android:duration="100" + android:fromAlpha="0.1" + android:toAlpha="1.0" /> </transitionSet> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 922db0579a16..204e43ef4c83 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Af"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Verkieslik Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Verkieslik sellulêr"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vra ontsluitpatroon voordat jy ontspeld"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vra wagwoord voordat jy ontspeld"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Deur jou administrateur geïnstalleer"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Opgedateer deur jou administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Deur jou administrateur uitgevee"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Om batterylewe te help verbeter, verminder batterybespaarder jou toestel se werkverrigting en beperk vibrasie, liggingdienste en die meeste agtergronddata. E-pos, boodskappe en ander programme wat op sinkronisering staatmaak, sal dalk nie opdateer tensy jy hulle oopmaak nie.\n\nBatterybespaarder skakel outomaties af wanneer jou toestel besig is om te laai."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Vou in"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Moenie steur nie"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Staantyd"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weekaande"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Naweke"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Gedemp deur <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Daar is \'n interne probleem met jou toestel en dit sal dalk onstabiel wees totdat jy \'n fabriekterugstelling doen."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Daar is \'n interne probleem met jou toestel. Kontak jou vervaardiger vir besonderhede."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index ad6605a894a2..f993bbacd6ca 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ጠፍቷል"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ተመርጧል"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"የተንቀሳቃሽ ስልክ ተመርጧል"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ከመንቀል በፊት የማስከፈቻ ስርዓተ-ጥለት ጠይቅ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ከመንቀል በፊት የይለፍ ቃል ጠይቅ"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"በእርስዎ አስተዳዳሪ ተጭኗል"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"በአስተዳዳሪዎ ተዘምኗል"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"በእርስዎ አስተዳዳሪ ተሰርዟል"</string> <string name="battery_saver_description" msgid="1960431123816253034">"የባትሪ ዕድሜን ለማሻሻል ማገዝ እንዲቻል፣ ኢሜይል፣ መልዕክት አላላክ እና ሌሎች በማመሳሰል ላይ የሚመረኮዙ መተግበሪያዎች እርስዎ ካልከፈቱዋቸው በቀር አይዘምኑም።\n\nየባትሪ ኃይል ቆጣቢ የእርስዎ መሣሪያ ኃይል በሚሞላበት ጊዜ በራስ-ሰር ይጠፋል።"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ሰብስብ"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"አትረብሽ"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"የማይገኝበት ጊዜ"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"የሳምንቱ ቀኖች ምሽቶች"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"የሳምንት መጨረሻ ቀኖች"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"ድምጽ በ<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ተዘግቷል"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ፣ የፋብሪካ ውሂብ ዳግም እስኪያስጀምሩት ድረስ ላይረጋጋ ይችላል።"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"መሣሪያዎ ላይ የውስጣዊ ችግር አለ። ዝርዝሮችን ለማግኘት አምራችዎን ያነጋግሩ።"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 3591a37498cd..1218957ff66b 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -133,6 +133,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"إيقاف"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"شبكة Wi-Fi مُفضّلة"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"شبكة الجوّال مُفضّلة"</string> @@ -1535,8 +1536,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"تصغير"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"الرجاء عدم الإزعاج"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"التعطل"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ليالي الأسبوع"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"نهايات الأسبوع"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"تم كتم الصوت بواسطة <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"حدثت مشكلة داخلية في جهازك، وقد لا يستقر وضعه حتى إجراء إعادة الضبط بحسب بيانات المصنع."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"حدثت مشكلة داخلية في جهازك. يمكنك الاتصال بالمصنِّع للحصول على تفاصيل."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d17330593a88..402f67ff0ab4 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Изключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предпочита се Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Предпочита се клетъчна мрежа"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запитване за фигура за отключване преди освобождаване"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запитване за парола преди освобождаване"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Инсталирано от администратора ви"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Актуализирано от администратора ви"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Изтрито от администратора ви"</string> <string name="battery_saver_description" msgid="1960431123816253034">"С цел удължаване на живота на батерията режимът за запазването й намалява ефективността на устройството ви и ограничава вибрирането, услугите за местоположение и повечето данни на заден план. Приложенията за електронна поща, съобщения и др., които разчитат на синхронизиране, може да не се актуализират, освен ако не ги отворите.\n\nРежимът за запазване на батерията се изключва автоматично, когато устройството ви се зарежда."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Свиване"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не безпокойте"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Почивка"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Делничните вечери"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Събота и неделя"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Заглушено от <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Възникна вътрешен проблем с устройството ви. То може да е нестабилно, докато не възстановите фабричните настройки."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Възникна вътрешен проблем с устройството ви. За подробности се свържете с производителя."</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index cec614b1b11e..ab988edd9502 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"বন্ধ আছে"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"পছন্দের Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"পছন্দের মোবাইল নেটওয়ার্ক"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"আনপিন করার আগে আনলক প্যাটার্ন চান"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"আনপিন করার আগে পাসওয়ার্ড চান"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"আপনার প্রশাসক দ্বারা ইনস্টল করা হয়েছে"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"আপনার প্রশাসক দ্বারা আপডেট করা হয়েছে"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"আপনার প্রশাসক দ্বারা মুছে ফেলা হয়েছে"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ব্যাটরির লাইফ উন্নত করতে সহায়তা করতে, ব্যাটারি সাশ্রয়কারী আপনার ডিভাইসের কার্যসম্পাদনা হ্রাস করে এবং কম্পন, অবস্থান পরিষেবাসমূহ এবং অধিকাংশ ব্যাকগ্রাউন্ড ডেটা সীমিত করে৷ ইমেল, বার্তাপ্রেরণ এবং অন্যান্য অ্যাপ্লিকেশানগুলিকে যেগুলি সিঙ্কের উপর নির্ভর করে সেগুলিকে আপনি না খোলা পর্যন্ত নাও আপডেট হতে পারে৷\n\nআপনার ডিভাইসটিকে যখন চার্জ করা হয় তখন ব্যাটারি সাশ্রয়কারী স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়৷"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"সঙ্কুচিত করুন"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"বিরক্ত করবেন না"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ডাউনটাইম"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"প্রতি সোম-শুক্র রাত"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"সপ্তাহান্ত"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> দ্বারা নিঃশব্দ করা হয়েছে"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে, এবং আপনি যতক্ষণ না পর্যন্ত এটিকে ফ্যাক্টরি ডেটা রিসেট করছেন ততক্ষণ এটি ঠিকভাবে কাজ নাও করতে পারে৷"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"আপনার ডিভাইসে একটি অভ্যন্তরীন সমস্যা হয়েছে৷ বিস্তারিত জানার জন্য প্রস্তুতকারকের সাথে যোগাযোগ করুন৷"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 8a726f728a51..ae21dec59064 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivades"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferència per la Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Preferència per les dades mòbils"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sol·licita el patró de desbloqueig per anul·lar la fixació"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demana la contrasenya abans d\'anul·lar la fixació"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"L\'administrador ho ha instal·lat"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"L\'administrador l\'ha actualitzat"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"L\'administrador ho ha suprimit"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Per allargar la durada de la bateria, l\'estalvi de bateria redueix el rendiment del dispositiu i limita l\'ús de la vibració, dels serveis d\'ubicació i de la majoria de les dades en segon pla. És possible que el correu electrònic, la missatgeria i altres aplicacions que depenen de la sincronització no s\'actualitzin fins que els obris.\n\nL\'estalvi de bateria es desactiva de manera automàtica quan el dispositiu es posa a carregar."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Replega"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molesteu"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'inactivitat"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Nits entre setmana"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Caps de setmana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Silenciat per <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"S\'ha produït un error intern al dispositiu i és possible que funcioni de manera inestable fins que restableixis les dades de fàbrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"S\'ha produït un error intern al dispositiu. Contacta amb el fabricant del dispositiu per obtenir més informació."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index b02bbe312f6d..35788306c1bb 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuto"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferována síť W-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Preferována mobilní síť"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Před uvolněním požádat o bezpečnostní gesto"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Před uvolněním požádat o heslo"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Nainstalováno administrátorem"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Aktualizováno administrátorem"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Smazáno administrátorem"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Spořič baterie za účelem prodloužení výdrže baterie snižuje výkon zařízení a omezuje vibrace, služby určování polohy a většinu dat na pozadí. E-mail, aplikace pro zasílání zpráv a další aplikace, které používají synchronizaci, se nemusejí aktualizovat, dokud je neotevřete.\n\nPři nabíjení zařízení se spořič baterie automaticky vypne."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Sbalit"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nerušit"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Období klidu"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noci pracovních dnů"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Víkendy"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Ignorováno stranou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"V zařízení došlo k internímu problému. Dokud neprovedete obnovení továrních dat, může být nestabilní."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"V zařízení došlo k internímu problému. Další informace vám sdělí výrobce."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 43e2c959d663..a5467726998e 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Fra"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi-netværk er foretrukket"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobilnetværk er foretrukket"</string> @@ -1083,7 +1084,7 @@ <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Flytter <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_move_title" msgid="1022809140035962662">"Flytter data"</string> <string name="ext_media_move_success_title" msgid="8575300932957954671">"Flytningen er gennemført"</string> - <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data flyttes til <xliff:g id="NAME">%s</xliff:g>"</string> + <string name="ext_media_move_success_message" msgid="4199002148206265426">"Data flyttet til <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Dine data kunne ikke flyttes"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Dine data er stadig på den oprindelige placering"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Der blev ikke fundet nogen matchende aktiviteter."</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Bed om oplåsningsmønster ved deaktivering"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Bed om adgangskode inden frigørelse"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installeret af din administrator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Opdateret af administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Slettet af din administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Batterisparefunktionen hjælper med at forlænge batteriets levetid ved at reducere enhedens ydeevne og begrænse vibration, placeringstjenester og det meste baggrundsdata. E-mail, beskedfunktioner og andre apps, der benytter synkronisering, opdateres muligvis ikke, medmindre du åbner dem.\n\nBatterisparefunktionen slukker automatisk, når enheden oplader."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Vil ikke forstyrres"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nedetid"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hverdagsaftener"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekender"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Lyden blev afbrudt af <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Der er et internt problem med enheden, og den vil muligvis være ustabil, indtil du gendanner fabriksdataene."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Der er et internt problem med enheden. Kontakt producenten for at få yderligere oplysninger."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 975bc0a1974a..a4dd9a45809c 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Aus"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WLAN bevorzugt"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobilfunk bevorzugt"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vor dem Beenden nach Entsperrungsmuster fragen"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vor dem Beenden nach Passwort fragen"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Von Ihrem Administrator installiert"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Von Ihrem Administrator aktualisiert"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Von Ihrem Administrator gelöscht"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Der Energiesparmodus schont den Akku, indem er die Leistung des Geräts reduziert und die Vibrationsfunktion sowie die meisten Hintergrunddatenaktivitäten einschränkt. E-Mail, SMS/MMS und andere Apps, die auf Ihrem Gerät synchronisiert werden, werden möglicherweise erst nach dem Öffnen aktualisiert.\n\nDer Energiesparmodus wird automatisch deaktiviert, wenn Ihr Gerät aufgeladen wird."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Minimieren"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nicht stören"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Ruhezeit"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Wochentags abends"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Wochenende"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Stummgeschaltet durch <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Es liegt ein internes Problem mit Ihrem Gerät vor. Möglicherweise verhält es sich instabil, bis Sie es auf die Werkseinstellungen zurücksetzen."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Es liegt ein internes Problem mit Ihrem Gerät vor. Bitte wenden Sie sich diesbezüglich an den Hersteller."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 4d7958148900..c15f379e2740 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ανενεργό"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Προτίμηση Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Προτίμηση δικτύου κινητής τηλεφωνίας"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Να γίνεται ερώτηση για το μοτίβο ξεκλειδώματος, πριν από το ξεκαρφίτσωμα"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Να γίνεται ερώτηση για τον κωδικό πρόσβασης, πριν από το ξεκαρφίτσωμα"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Εγκαταστάθηκε από το διαχειριστή σας"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Ενημερώθηκε από το διαχειριστή σας"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Διαγράφηκε από το διαχειριστή σας"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Προκειμένου να βελτιώσει τη διάρκεια ζωής της μπαταρίας σας, η Εξοικονόμηση μπαταρίας μειώνει την απόδοση της συσκευής σας και περιορίζει λειτουργίες όπως η δόνηση, οι υπηρεσίες τοποθεσίας και τα περισσότερα δεδομένα παρασκηνίου. Το ηλεκτρονικό ταχυδρομείο, η ανταλλαγή μηνυμάτων και άλλες εφαρμογές που βασίζονται στο συγχρονισμό ενδέχεται να μην ενημερώνονται έως ότου τις ανοίξετε.\n\nΗ Εξοικονόμηση μπαταρίας απενεργοποιείται αυτόματα όταν η συσκευή σας φορτίζει."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Σύμπτυξη"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Μην ενοχλείτε"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Διακοπή λειτουργίας"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Καθημερινές"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Σαββατοκύριακα"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Σίγαση από <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας και ενδέχεται να είναι ασταθής μέχρι την επαναφορά των εργοστασιακών ρυθμίσεων."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Υπάρχει ένα εσωτερικό πρόβλημα με τη συσκευή σας. Επικοινωνήστε με τον κατασκευαστή σας για λεπτομέρειες."</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 8bd4b57367ce..3b50363d79d1 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobile preferred"</string> @@ -1483,8 +1484,9 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string> + <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Weeknight"</string> + <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Weekend"</string> + <string name="zen_mode_default_events_name" msgid="8158334939013085363">"Event"</string> <string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 8bd4b57367ce..3b50363d79d1 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobile preferred"</string> @@ -1483,8 +1484,9 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string> + <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Weeknight"</string> + <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Weekend"</string> + <string name="zen_mode_default_events_name" msgid="8158334939013085363">"Event"</string> <string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 8bd4b57367ce..3b50363d79d1 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferred"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobile preferred"</string> @@ -1483,8 +1484,9 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Collapse"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Do not disturb"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Weeknights"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string> + <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"Weeknight"</string> + <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"Weekend"</string> + <string name="zen_mode_default_events_name" msgid="8158334939013085363">"Event"</string> <string name="muted_by" msgid="6147073845094180001">"Muted by <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index f5cf89bb8d86..c1ea0df4991d 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivada"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Red Wi-Fi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Red móvil preferida"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar patrón de desbloqueo para quitar fijación"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para quitar fijación"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Lo instaló el administrador."</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado por el administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Lo eliminó el administrador."</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ayudar a mejorar la duración de la batería, el ahorro de batería reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayoría de los datos en segundo plano. Es posible que el correo electrónico, la mensajería y otras aplicaciones que se basan en la sincronización no puedan actualizarse, a menos que los abras.\n\nEl ahorro de batería se desactiva de forma automática cuando el dispositivo se está cargando."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molestar"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tiempo de inactividad"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noches entre semana"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fines de semana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Silenciados por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Existe un problema interno con el dispositivo, de modo que el dispositivo puede estar inestable hasta que restablezcas la configuración de fábrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Existe un problema interno con el dispositivo. Comunícate con el fabricante para obtener más información."</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index be2e58a7615b..41276556a88d 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferir Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Preferir datos móviles"</string> @@ -1132,7 +1133,7 @@ <string name="submit" msgid="1602335572089911941">"Enviar"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Se ha habilitado el modo coche"</string> <string name="car_mode_disable_notification_message" msgid="8035230537563503262">"Toca para salir del modo coche."</string> - <string name="tethered_notification_title" msgid="3146694234398202601">"Anclaje a red/Zona Wi-Fi activo"</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Compartir Internet/Zona Wi-Fi activado"</string> <string name="tethered_notification_message" msgid="6857031760103062982">"Toca para configurar"</string> <string name="back_button_label" msgid="2300470004503343439">"Atrás"</string> <string name="next_button_label" msgid="1080555104677992408">"Siguiente"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar patrón de desbloqueo para desactivar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para desactivar"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalado por tu administrador"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado por tu administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado por tu administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reduce el rendimiento del dispositivo y limita la vibración, los servicios de ubicación y la mayor parte de la transmisión de datos en segundo plano. Es posible que las aplicaciones que se sincronizan, como las de correo y mensajes, no se actualicen a menos que las abras.\n\nLa función de ahorro de energía se desactiva automáticamente cuando el dispositivo se está cargando."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"No molestar"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tiempo de inactividad"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noches entre semana"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fines de semana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Se ha producido un problema interno en el dispositivo y es posible que este no sea estable hasta que restablezcas los datos de fábrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Se ha producido un problema interno en el dispositivo. Ponte en contacto con el fabricante para obtener más información."</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 735b56d3942c..6b82b570a6f3 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Väljas"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"WiFi eelistusega"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobiilside eelistusega"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Enne vabastamist küsi avamismustrit"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Enne vabastamist küsi parooli"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installis teie administraator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Värskendas administraator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Kustutas teie administraator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Aku kestuse parandamiseks vähendab akusäästja teie seadme toimivust ning piirab vibratsiooni, asukohateenuseid ja suuremat osa taustaandmetest. E-posti, sõnumsidet ja muid sünkroonimisele tuginevaid rakendusi võidakse värskendada ainult siis, kui te need avate.\n\nAkusäästja lülitatakse seadme laadimise ajal automaatselt välja."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Ahendamine"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Mitte segada"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Puhkeaeg"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Argiõhtud"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Nädalavahetused"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> vaigistas"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Seadmes ilmnes sisemine probleem ja seade võib olla ebastabiilne seni, kuni lähtestate seadme tehase andmetele."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Seadmes ilmnes sisemine probleem. Üksikasjaliku teabe saamiseks võtke ühendust tootjaga."</string> diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml index 25e830857bd0..7bbe9885dc58 100644 --- a/core/res/res/values-eu-rES/strings.xml +++ b/core/res/res/values-eu-rES/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desaktibatuta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi sarea hobesten da"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Sare mugikorra hobesten da"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Eskatu desblokeatzeko eredua aingura kendu aurretik"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Eskatu pasahitza aingura kendu aurretik"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Administratzaileak instalatu du"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Administratzaileak eguneratu du"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Administratzaileak ezabatu du"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Bateriak gehiago iraun dezan, bateria-aurrezleak gailuaren funtzionamendua, dardara, kokapen-zerbitzuak eta atzeko planoko datuen erabilera gehiena mugatzen ditu. Posta elektronikoa, mezuak eta sinkronizatzen diren gainerako zerbitzuak ez dira eguneratuko ireki ezean.\n\nGailua kargatzen ezarri orduko desaktibatzen da bateria-aurrezlea."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Tolestu"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ez molestatu"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Jarduerarik gabeko denbora"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Lanegunetako gauak"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Asteburuak"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Audioa desaktibatu da (<xliff:g id="THIRD_PARTY">%1$s</xliff:g>)"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Barneko arazo bat dago zure gailuan eta agian ezegonkor egongo da jatorrizko datuak berrezartzen dituzun arte."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Barneko arazo bat dago zure gailuan. Xehetasunak jakiteko, jarri fabrikatzailearekin harremanetan."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 93caee260604..02046929a037 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"خاموش"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"شبکه سلولی ترجیحی"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"درخواست الگوی باز کردن قفل قبل از برداشتن پین"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"درخواست گذرواژه قبل از برداشتن پین"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"توسط سرپرستتان نصب شد"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"توسط سرپرست شما بهروزرسانی شد"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"توسط سرپرستتان حذف شد"</string> <string name="battery_saver_description" msgid="1960431123816253034">"برای کمک به بهبود ماندگاری باتری، ابزار صرفهجویی در مصرف باتری عملکرد دستگاهتان را کاهش میدهد و لرزش، سرویسهای مبتنی بر مکان، و دسترسی به اکثر دادهها در پسزمینه را محدود میکند. ایمیل، پیامرسانی و برنامههای دیگری که به همگامسازی متکی هستند، تا زمانی که آنها را باز نکنید نمیتوانند بهروز شوند.\n\nابزار صرفهجویی در مصرف باتری به صورت خودکار در هنگام شارژ شدن دستگاه خاموش میشود."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"کوچک کردن"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"مزاحم نشوید"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"فرویش"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"شبهای آخر هفته"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"آخر هفتهها"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> آن را بیصدا کرد"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"دستگاهتان یک مشکل داخلی دارد، و ممکن است تا زمانی که بازنشانی به داده کارخانه انجام نگیرد، بیثبات بماند."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"دستگاهتان یک مشکل داخلی دارد. برای جزئیات آن با سازندهتان تماس بگیرید."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 79aa23422377..a7c4f3f6d45f 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ei käytössä"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ensisijainen"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Matkapuhelinverkko ensisijainen"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pyydä lukituksenpoistokuvio ennen irrotusta"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pyydä salasana ennen irrotusta"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Järjestelmänvalvoja on asentanut paketin."</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Järjestelmänvalvojasi on päivittänyt paketin."</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Järjestelmänvalvoja on poistanut paketin."</string> <string name="battery_saver_description" msgid="1960431123816253034">"Jos haluat parantaa akun kestoa, virransäästö vähentää laitteesi suorituskykyä ja rajoittaa värinää, sijaintipalveluita ja useimpia taustatietoja. Sähköposti, viestit ja muut synkronointiin perustuvat sovellukset eivät välttämättä päivity, ellet avaa niitä.\n\nVirransäästö poistuu käytöstä automaattisesti, kun laitteesi latautuu."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Kutista"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Älä häiritse"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Vapaalla"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Arki-illat"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Viikonloput"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Mykistänyt <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Laitteellasi on sisäinen ongelma, joka aiheuttaa epävakautta. Voit korjata tilanteen palauttamalla tehdasasetukset."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Laitteesi yhdistäminen ei onnistu sisäisen virheen takia. Saat lisätietoja valmistajalta."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index f76a2537261e..c89d989daa11 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Réseau Wi-Fi de préférence"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Réseau cellulaire de préférence"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Demander le schéma de déverrouillage avant d\'annuler l\'épinglage"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installé par votre administrateur"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Mis à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Supprimé par votre administrateur"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pour améliorer l\'autonomie de la pile, la fonction d\'économie d\'énergie réduit les performances de votre appareil et limite la vibration, les services de localisation ainsi que la plupart des données en arrière-plan. Les applications Courriel, Messages et d\'autres qui reposent sur la synchronisation ne peuvent pas se mettre à jour, sauf si vous les ouvrez. \n\n L\'économiseur d\'énergie se désactive automatiquement lorsque votre appareil est en charge."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne pas déranger"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'arrêt"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Les soirs de semaine"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Les fins de semaine"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Mis en sourdine par <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne est survenu avec votre appareil. Il se peut qu\'il soit instable jusqu\'à ce que vous le réinitialisiez à sa configuration d\'usine."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne est survenu avec votre appareil. Communiquez avec le fabricant pour obtenir plus de détails."</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index e7771063dc27..9cc881b54dca 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Désactivé"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi de préférence"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobile de préférence"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Demander le schéma de déverrouillage avant d\'annuler l\'épinglage"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installé par votre administrateur"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Mis à jour par votre administrateur"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Supprimé par votre administrateur"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pour améliorer l\'autonomie de la batterie, l\'économiseur de batterie réduit les performances de votre appareil, et il désactive le vibreur, les services de localisation et la plupart des données en arrière-plan. La messagerie électronique, les SMS/MMS et les autres applications basées sur la synchronisation ne sont mises à jour que si vous les ouvrez.\n\nL\'économiseur de batterie s\'éteint automatiquement lorsque votre appareil est en charge."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne pas déranger"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Temps d\'arrêt"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Soirs de semaine"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Week-ends"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Son coupé par : <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Un problème interne lié à votre appareil est survenu. Ce dernier risque d\'être instable jusqu\'à ce que vous rétablissiez la configuration d\'usine."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Un problème interne lié à votre appareil est survenu. Veuillez contacter le fabricant pour en savoir plus."</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index c6e224759a07..9fa0aae2de67 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desactivado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wifi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Móbil preferido"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar un padrón de desbloqueo antes de soltar a pantalla"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar un contrasinal antes de soltar a pantalla"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalado polo administrador"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizado polo administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado polo administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para axudar a mellorar a duración da batería, a función aforro de batería reduce o rendemento do teu dispositivo e limita a vibración, os servizos de localización e a maioría dos datos en segundo plano. É posible que o correo electrónico, as mensaxes e outras aplicacións que dependen da sincronización non se actualicen a menos que os abras. \n\nA función aforro de batería desactívase automaticamente cando pos a cargar o teu dispositivo."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Contraer"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Non molestar"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo de inactividade"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites pola semana"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fins de semana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Silenciado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Produciuse un erro interno no teu dispositivo e quizais funcione de maneira inestable ata o restablecemento dos datos de fábrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Produciuse un erro interno co teu dispositivo. Contacta co teu fabricante para obter máis información."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 9c4df9add98f..8fe28a7d01a8 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"बंद"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"वाई-फ़ाई को प्राथमिकता"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"सेल्युलर को प्राथमिकता"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"अनपिन करने से पहले अनलॉक पैटर्न के लिए पूछें"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"अनपिन करने से पहले पासवर्ड के लिए पूछें"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"आपके नियंत्रक द्वारा इंस्टॉल किया गया"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"आपके नियंत्रक द्वारा अपडेट किया गया"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"आपके नियंत्रक द्वारा हटाया गया"</string> <string name="battery_saver_description" msgid="1960431123816253034">"बैटरी जीवन काल को बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके डिवाइस के प्रदर्शन को कम कर देता है और कंपन, स्थान सेवाओं और अधिकांश पृष्ठभूमि डेटा को सीमित कर देता है. हो सकता है कि ईमेल, संदेश सेवा तथा समन्वयन पर आधारित अन्य ऐप्स तब तक ना खुलें जब तक कि आप उन्हें नहीं खोलते.\n\nजब आपका डिवाइस चार्ज हो रहा होता है तो बैटरी सेवर अपने आप बंद हो जाता है."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करें"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"परेशान ना करें"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"बंद रहने का समय"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"कार्यदिवसों की रात"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताहांत"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा म्यूट किया गया"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"आपके डिवाइस के साथ कोई आंतरिक त्रुटि हुई और यह तब तक अस्थिर रह सकता है, जब तक आप फ़ैक्टरी डेटा रीसेट नहीं करते हैं."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"आपके डिवाइस के साथ कोई आंतरिक त्रुटि हुई. विवरणों के लिए अपने निर्माता से संपर्क करें."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 16503b8faa15..a9d5e2b00a51 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -130,6 +130,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Isključeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednost ima Wi-Fi mreža"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Prednost ima mobilna mreža"</string> @@ -1467,8 +1468,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Traži uzorak za otključavanje radi otkvačivanja"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Traži zaporku radi otkvačivanja"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalirao administrator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Ažurira vaš administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Izbrisao administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Da bi se produljilo trajanje baterije, ušteda baterije smanjuje rad uređaja i ograničava vibraciju, usluge lokacije i većinu pozadinskih podataka. Aplikacije za e-poštu, slanje poruka i druge aplikacije koje se oslanjaju na sinkronizaciju možda se neće ažurirati ako ih ne otvorite.\n\nUšteda baterije isključuje se automatski dok se uređaj puni."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1497,8 +1497,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Sažmi"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne ometaj"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prekid rada"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noći radnih dana"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Vikend"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Zvuk je isklj. treća strana <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Na vašem uređaju postoji interni problem i možda neće biti stabilan dok ga ne vratite na tvorničko stanje."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Na vašem uređaju postoji interni problem. Obratite se proizvođaču za više pojedinosti."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index f2f553879d6c..f8d384b1ff37 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Ki"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi előnyben részesítve"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobiladat-kapcsolat előnyben részesítve"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Feloldási minta kérése a rögzítés feloldásához"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Jelszó kérése a rögzítés feloldásához"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"A rendszergazda telepítette"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Frissítette a rendszergazda"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"A rendszergazda törölte"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Az akkumulátoridő növelése érdekében az energiatakarékos mód csökkenti az eszköz teljesítményét, és korlátozza a rezgést, a helyszolgáltatásokat, valamint a legtöbb háttéradatot is. Előfordulhat, hogy azok az e-mail-, üzenetküldő és egyéb alkalmazások, amelyek szinkronizálására számít, csak akkor frissítenek, ha megnyitja azokat.\n\nAz energiatakarékos mód automatikusan kikapcsol, ha eszköze töltőn van."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Összecsukás"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne zavarjanak"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Inaktivitás"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hétköznap esténként"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hétvégente"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"A(z) <xliff:g id="THIRD_PARTY">%1$s</xliff:g> elnémította"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Belső probléma van az eszközzel, és instabil lehet, amíg vissza nem állítja a gyári adatokat."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Belső probléma van az eszközzel. A részletekért vegye fel a kapcsolatot a gyártóval."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 6d21523a28a4..083095065ef1 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Անջատված է"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi, նախընտրելի"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Բջջային, նախընտրելի"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Ապաամրացնելուց առաջ հարցնել ապակողպող նախշը"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Ապաամրացնելուց առաջ հարցնել գաղտնաբառը"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Ադմինիստրատորը տեղադրել է այն"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Ադմինիստրատորը թարմացրել է այն"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Ադմինիստրատորը ջնջել է այն"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Մարտկոցի աշխատանքի ժամկետը երկարացնելու նպատակով, մարտկոցի էներգիայի խնայման գործառույթը սահմանափակում է սարքի աշխատանքը, թրթռոցը, տեղադրության ծառայությունները և հետնաշերտում աշխատող շատ գործընթացներ: Էլփոստը, հաղորդագրությունների փոխանակումը և տվյալների համաժամեցումից կախված այլ հավելվածները կարող են չթարմացվել, եթե դուք դրանք չգործարկեք:\n\nԵրբ ձեր սարքը լիցքավորվում է, մարտկոցի էներգիայի խնայման գործառույթն ինքնաշխատորեն անջատվում է:"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Թաքցնել"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Չանհանգստացնել"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Անգործունության ժամանակը"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Երկուշաբթիից ուրբաթ"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Հանգստյան օրեր"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Համրեցվել է <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ի կողմից"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Սարքում ներքին խնդիր է առաջացել և այն կարող է կրկնվել, մինչև չվերականգնեք գործարանային կարգավորումները:"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Սարքում ներքին խնդիր է առաջացել: Մանրամասների համար կապվեք արտադրողի հետ:"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index f0945cad6644..69ce7118f682 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Nonaktif"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi dipilih"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Seluler dipilih"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Meminta pola pembukaan kunci sebelum melepas sematan"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Meminta sandi sebelum melepas sematan"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Dipasang oleh administrator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Diperbarui oleh administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Dihapus oleh administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Untuk membantu meningkatkan masa pakai baterai, penghemat baterai mengurangi kinerja perangkat dan membatasi getaran, layanan lokasi, dan kebanyakan data latar belakang. Email, perpesanan, dan aplikasi lain yang mengandalkan sinkronisasi mungkin tidak diperbarui kecuali jika dibuka.\n\nPenghemat baterai otomatis nonaktif jika perangkat diisi dayanya."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Ciutkan"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Jangan ganggu"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Waktu non-operasional"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Malam hari kerja"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Akhir pekan"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Dinonaktifkan oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Ada masalah dengan perangkat. Hal ini mungkin membuat perangkat jadi tidak stabil dan perlu dikembalikan ke setelan pabrik."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Ada masalah dengan perangkat. Hubungi produsen perangkat untuk informasi selengkapnya."</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index e999e0fd0762..18fd5da083b5 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Slökkt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi í forgangi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Farsímakerfi í forgangi"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Biðja um opnunarmynstur til að losa"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Biðja um aðgangsorð til að losa"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Uppsett af kerfisstjóra"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Uppfært af kerfisstjóranum"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eytt af kerfisstjóra"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Til að auka endingu rafhlöðunnar mun orkusparnaður draga úr afköstum tækisins og takmarka titring, staðsetningarþjónustu og megnið af bakgrunnsgögnum. Ekki er víst að tölvupóstur, skilaboð og önnur forrit sem reiða sig á samstillingu uppfærist nema þú opnir þau.\n\nSjálfkrafa er slökkt á orkusparnaði þegar tækið er í hleðslu."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Minnka"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ónáðið ekki"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Hvíldartími"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Virk kvöld"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helgar"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tók hljóðið af"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Innra vandamál kom upp í tækinu og það kann að vera óstöðugt þangað til þú núllstillir það."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Innra vandamál kom upp í tækinu. Hafðu samband við framleiðanda til að fá nánari upplýsingar."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 6b29541f52dc..3def7ae82336 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Non attiva"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Rete preferita: Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Rete preferita: cellulare"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Richiedi sequenza di sblocco prima di sbloccare"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Richiedi password prima di sbloccare"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installato dall\'amministratore"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Aggiornato dall\'amministratore"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminato dall\'amministratore"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Per aumentare la durata della batteria, la funzione di risparmio energetico riduce le prestazioni del dispositivo e limita vibrazione, servizi di localizzazione e la maggior parte dei dati in background. App di email, messaggi e altre app che si basano sulla sincronizzazione potrebbero essere aggiornate soltanto all\'apertura.\n\nLa funzione di risparmio energetico viene disattivata automaticamente quando il dispositivo è in carica."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Comprimi"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Non disturbare"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo di inattività"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Sere giorni feriali"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fine settimana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Audio disattivato da <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Si è verificato un problema interno con il dispositivo, che potrebbe essere instabile fino al ripristino dei dati di fabbrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Si è verificato un problema interno con il dispositivo. Per informazioni dettagliate, contatta il produttore."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 3e6b5d3ab9ca..de0f975a53b9 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"כבוי"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi מועדף"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"סלולרי מועדף"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"בקש קו ביטול נעילה לפני ביטול הצמדה"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"בקש סיסמה לפני ביטול הצמדה"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"הותקנה על ידי מנהל המערכת שלך"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"עודכן על ידי מנהל המערכת שלך"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"נמחקה על ידי מנהל המערכת שלך"</string> <string name="battery_saver_description" msgid="1960431123816253034">"כדי לעזור בשיפור חיי הסוללה, תכונת החיסכון בסוללה מצמצמת את פעולות המכשיר ומגבילה רטט, שירותי מיקום ואת רוב נתוני הרקע. אימייל, העברת הודעות ואפליקציות אחרות המסתמכות על סנכרון עשויות שלא להתעדכן, אלא אם תפתח אותן.\n\nתכונת החיסכון בסוללה מושבתת אוטומטית כשהמכשיר בטעינה."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,9 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"כווץ"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"נא לא להפריע"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"זמן השבתה"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"לילות בימי חול"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"סופי שבוע"</string> + <string name="zen_mode_default_weeknights_name" msgid="3081318299464998143">"ערב ביום חול"</string> + <string name="zen_mode_default_weekends_name" msgid="2786495801019345244">"סוף השבוע"</string> + <string name="zen_mode_default_events_name" msgid="8158334939013085363">"אירוע"</string> <string name="muted_by" msgid="6147073845094180001">"הושתק על ידי <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"קיימת בעיה פנימית במכשיר שלך, וייתכן שהתפקוד שלו לא יהיה יציב עד שתבצע איפוס לנתוני היצרן."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"קיימת בעיה פנימית במכשיר שלך. לקבלת פרטים, צור קשר עם היצרן."</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 09d1380af8b6..f952fb66e96f 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"OFF"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi優先"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"モバイル優先"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"画面固定を解除する前にロック解除パターンの入力を求める"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"オフライン再生を解除する前にパスワードの入力を求める"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"管理者によってインストールされました"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"管理者によって更新されています"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"管理者によって削除されました"</string> <string name="battery_saver_description" msgid="1960431123816253034">"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを抑え、バイブレーション、位置情報サービス、大半のバックグラウンドデータを制限します。メール、SMSや、同期を使用するその他のアプリは、起動しても更新されないことがあります。\n\nバッテリーセーバーは端末の充電中は自動的にOFFになります。"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"折りたたむ"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"通知を非表示"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ダウンタイム"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"平日の夜間"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>によりミュートになっています"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"端末で内部的な問題が発生しました。データが初期化されるまで不安定になる可能性があります。"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"端末で内部的な問題が発生しました。詳しくはメーカーにお問い合わせください。"</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 5813e5098347..b88ff5b00df9 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"გამორთული"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"სასურველია Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"სასურველია ფიჭური ინტერნეტი"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ფიქსაციის მოხსნამდე განბლოკვის ნიმუშის მოთხოვნა"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ფიქსაციის მოხსნამდე პაროლის მოთხოვნა"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"თქვენი ადმინისტრატორის მიერ დაყენებული"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"განახლებულია თქვენი ადმინისტრატორის მიერ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"თქვენი ადმინისტრატორის მიერ წაშლილი"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ელემენტის მოქმედების ვადის გაუმჯობესებისათვის, ელემენტის დამზოგი ამცირებს თქვენი მოწყობილობის შესრულებას და ზღუდავს ვიბრაციას, ადგილმდებარეობის მომსახურებებს და ძირითად ფონურ მონაცემებს. ელ-ფოსტა, შეტყობინებები და სხვა სინქრონიზაციაზე დაყრდნობილი აპლიკაციების განახლება არ მოხდება მათ გახსნეამდე. \n\n ელემენტის დამზოგველი ავტომატურად გამოირთვება, როდესაც თქვენს მოწყობილობას დამტენთან შეაერთებთ."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"აკეცვა"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"არ შემაწუხოთ"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ავარიული პაუზა"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"კვირის ღამეებისას"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"შაბათ-კვირას"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"დადუმებულია <xliff:g id="THIRD_PARTY">%1$s</xliff:g>-ის მიერ"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"ფიქსირდება თქვენი მ ოწყობილობის შიდა პრობლემა და შეიძლება არასტაბილური იყოს, სანამ ქარხნულ მონაცემების არ განაახლებთ."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"ფიქსირდება თქვენი მოწყობილობის შიდა პრობლემა. დეტალებისათვის, მიმართეთ თქვენს მწარმოებელს."</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 24ec8b1d7bd8..34a44c2e7636 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Өшірулі"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Қалаулы Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Қалаулы ұялы байланыс"</string> @@ -1080,9 +1081,9 @@ <string name="ext_media_browse_action" msgid="8322172381028546087">"Зерттеу"</string> <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> жоқ"</string> <string name="ext_media_missing_message" msgid="5761133583368750174">"Бұл құрылғыны қайта салыңыз"</string> - <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> жылжытылуда"</string> + <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> тасымалдануда"</string> <string name="ext_media_move_title" msgid="1022809140035962662">"Деректер тасымалдануда"</string> - <string name="ext_media_move_success_title" msgid="8575300932957954671">"Тасымалдау аяқталды"</string> + <string name="ext_media_move_success_title" msgid="8575300932957954671">"Тасымалданып болды"</string> <string name="ext_media_move_success_message" msgid="4199002148206265426">"Деректер <xliff:g id="NAME">%s</xliff:g> ішіне тасымалданды"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Деректерді тасымалдау мүмкін емес"</string> <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Деректер бастапқы орнында қалды"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Босату алдында бекітпесін ашу өрнегін сұрау"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Босату алдында құпия сөзді сұрау"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Әкімші орнатқан"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Әкімші жаңартты"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Әкімші жойған"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Батареяның қызмет көрсету мерзімін жақсарту үшін батарея үнемдегіш құрылғының өнімділігін төмендетеді және дірілді, орынды анықтау қызметтерін және фондық деректердің көпшілігін шектейді. Электрондық пошта, хабар алмасу және синхрондауға негізделген басқа қолданбалар ашқанша жаңартылмауы мүмкін.\n\nБатарея үнемдегіш құрылғы зарядталып жатқанда автоматты түрде өшеді."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Тасалау"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Мазаламауыңызды сұраймын"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Бос тұру уақыты"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Жұмыс күндерінің түндері"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Демалыс күндері"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> үнін өшірген"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"There\'s an internal problem with your device, and it may be unstable until you factory data reset."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"There\'s an internal problem with your device. Contact your manufacturer for details."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index dbe510454b0a..c0ea05960517 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"បិទ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"គួរប្រើ Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"គួរប្រើប្រព័ន្ធទូរស័ព្ទ"</string> @@ -1460,8 +1461,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"សួររកលំនាំដោះសោមុនពេលផ្ដាច់"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"សួររកពាក្យសម្ងាត់មុនពេលផ្ដាច់"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"បានដំឡើងដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"បានធ្វើបច្ចុប្បន្នភាពដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"បានលុបដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ដើម្បីជួយឲ្យថាមពលថ្មប្រសើរឡើង កម្មវិធីសន្សំសំចៃថាមពលថ្មកាត់បន្ថយប្រតិបត្តិការឧបករណ៍របស់អ្នក និងកម្រិតភាពញ័រ សេវាកម្មទីតាំង និងទិន្នន័យផ្ទៃខាងក្រោយស្ទើរតែទាំងអស់។ ការផ្ញើសារអ៊ីម៉ែល និងកម្មវិធីផ្សេងទៀតដែលពឹងផ្អែកលើការធ្វើសមកាលកម្មអាចនឹងមិនធ្វើបច្ចុប្បន្នភាពទេ លុះត្រាតែអ្នកបើកពួកវា។\n\nកម្មវិធីសន្សំសំចៃបិទដោយស្វ័យប្រវត្តិ នៅពេលដែលឧបករណ៍របស់អ្នកកំពុងសាកថ្ម។"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1486,8 +1486,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"បង្រួម"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"កុំរំខាន"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ពេលមិនដំណើរការ"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"យប់ថ្ងៃធ្វើការ"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ចុងសប្តាហ៍"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"បានបិទសំឡេងដោយ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ហើយវាអ្នកមិនមានស្ថេរភាព រហូតទាល់តែអ្នកកំណត់ដូចដើមវិញទាំងស្រុង។"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"មានបញ្ហាខាងក្នុងឧបករណ៍របស់អ្នក ទំនាក់ទំនងក្រុមហ៊ុនផលិតឧបករណ៍របស់អ្នកសម្រាប់ព័ត៌មានបន្ថែម។"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index 9631a65ef9ec..41fe302789ee 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ಆಫ್"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ವೈ-ಫೈಗೆ ಆದ್ಯತೆ ನೀಡಲಾಗಿದೆ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"ಸೆಲ್ಯುಲಾರ್ಗೆ ಆದ್ಯತೆ ನೀಡಲಾಗಿದೆ"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಅನ್ಲಾಕ್ ನಮೂನೆಯನ್ನು ಕೇಳಿ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ಅನ್ಪಿನ್ ಮಾಡುವುದಕ್ಕೂ ಮೊದಲು ಪಾಸ್ವರ್ಡ್ ಕೇಳಿ"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಸ್ಥಾಪಿಸಲಾಗಿದೆ"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ನವೀಕರಿಸಲಾಗಿದೆ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರಿಂದ ಅಳಿಸಲಾಗಿದೆ"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ನಿಮ್ಮ ಬ್ಯಾಟರಿಯ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಲು, ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತದೆ ಮತ್ತು ವೈಬ್ರೇಷನ್, ಸ್ಥಳ ಸೇವೆಗಳು ಹಾಗೂ ಹೆಚ್ಚಿನ ಹಿನ್ನೆಲೆ ಡೇಟಾವನ್ನು ಮಿತಿಗೊಳಿಸುತ್ತದೆ. ಸಿಂಕ್ ಮಾಡುವುದನ್ನು ಅವಲಂಬಿಸಿರುವ ಇಮೇಲ್, ಸಂದೇಶ ಕಳುಹಿಸುವಿಕೆ, ಮತ್ತು ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳು ನೀವು ತೆರೆಯದ ಹೊರತು ನವೀಕರಣಗೊಳ್ಳುವುದಿಲ್ಲ.\n\nನಿಮ್ಮ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿರುವ ಸಮಯದಲ್ಲಿ ಬ್ಯಾಟರಿ ಉಳಿಕೆಯು ಆಫ್ ಆಗುತ್ತದೆ."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ಸಂಕುಚಿಸು"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ಸ್ಥಗಿತಕಾಲ"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ವಾರದ ರಾತ್ರಿಗಳು"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ವಾರಾಂತ್ಯಗಳು"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ಅವರಿಂದ ಮ್ಯೂಟ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ ಹಾಗೂ ನೀವು ಫ್ಯಾಕ್ಟರಿ ಡೇಟಾವನ್ನು ಮರುಹೊಂದಿಸುವರೆಗೂ ಅದು ಅಸ್ಥಿರವಾಗಬಹುದು."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಆಂತರಿಕ ಸಮಸ್ಯೆಯಿದೆ. ವಿವರಗಳಿಗಾಗಿ ನಿಮ್ಮ ತಯಾರಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index d6f9ed6e1980..7b5aec8d65a6 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"꺼짐"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi를 기본으로 설정"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"데이터 네트워크를 기본으로 설정"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"고정 해제 이전에 잠금해제 패턴 요청"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"고정 해제 이전에 비밀번호 요청"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"관리자가 설치함"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"관리자에 의해 업데이트됨"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"관리자가 삭제함"</string> <string name="battery_saver_description" msgid="1960431123816253034">"배터리 수명 개선을 위해, 배터리 세이버는 기기의 성능을 줄이고 진동, 위치 서비스 및 대부분의 백그라운드 데이터를 제한합니다. 이메일, 메시지 및 동기화에 의존하는 기타 앱은 앱을 열 때까지 업데이트되지 않을 수 있습니다.\n\n배터리 세이버는 기기를 충전 중일 때는 자동으로 사용 중지됩니다."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"접기"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"알림 일시중지"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"다운타임"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"평일 밤"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"주말"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>에서 알림음 음소거"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"사용 중인 기기 내부에 문제가 발생했습니다. 초기화할 때까지 불안정할 수 있습니다."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"사용 중인 기기 내부에 문제가 발생했습니다. 자세한 내용은 제조업체에 문의하세요."</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index 5e5948e7d3c8..3776ef2b6015 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -197,6 +197,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Өчүк"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi тандалган"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Уюлдук тармак тандалган"</string> @@ -1430,22 +1431,14 @@ <string name="ext_media_init_action" msgid="8317198948634872507">"Орнотуу"</string> <string name="ext_media_unmount_action" msgid="1121883233103278199">"Чыгаруу"</string> <string name="ext_media_browse_action" msgid="8322172381028546087">"Изилдөө"</string> - <!-- no translation found for ext_media_missing_title (620980315821543904) --> - <skip /> - <!-- no translation found for ext_media_missing_message (5761133583368750174) --> - <skip /> - <!-- no translation found for ext_media_move_specific_title (1471100343872375842) --> - <skip /> - <!-- no translation found for ext_media_move_title (1022809140035962662) --> - <skip /> - <!-- no translation found for ext_media_move_success_title (8575300932957954671) --> - <skip /> - <!-- no translation found for ext_media_move_success_message (4199002148206265426) --> - <skip /> - <!-- no translation found for ext_media_move_failure_title (7613189040358789908) --> - <skip /> - <!-- no translation found for ext_media_move_failure_message (1978096440816403360) --> - <skip /> + <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> табылбай жатат"</string> + <string name="ext_media_missing_message" msgid="5761133583368750174">"Түзмөктү кайра сайыңыз"</string> + <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулууда"</string> + <string name="ext_media_move_title" msgid="1022809140035962662">"Дайындар ооштурулууда…"</string> + <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ооштуруу аяктады"</string> + <string name="ext_media_move_success_message" msgid="4199002148206265426">"Дайындар <xliff:g id="NAME">%s</xliff:g> сактагычына ооштурулду"</string> + <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Дайындар ооштурулбай калды"</string> + <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Дайындар баштапкы ордунда калды"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Туура келген аракеттер табылбады."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"Медиа чыгарылышын багыттоо"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"Колдонмого медиа мазмунду башка тышкы түзмөктөргө багыттоо уруксатын берет."</string> @@ -1883,8 +1876,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Бошотуудан мурун кулпуну ачкан үлгү суралсын"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Бошотуудан мурун сырсөз суралсын"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Администраторуңуз тарабынан орнотулган"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Администраторуңуз жаңырткан"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Администраторуңуз тарабынан жок кылынган"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Батареянын өмүрүн узартуу үчүн, батареяны үнөмдөгүч түзмөгүңүздүн ишинин майнаптуулугун азайтып, дирилдөө, жайгашкан жерди аныктоо кызматтары жана фондук дайындардын көпчүлүгүн чектеп коёт. Электрондук почта, билдирүү жазышуу жана башка шайкештештирүүгө байланыштуу колдонмолор ачылмайынча жаңыртылбай калышы мүмкүн.\n\nБатарея үнөмдөгүч түзмөгүңүз кубатталып жатканда автоматтык түрдө өчүп калат."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1909,8 +1901,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Жыйнап коюу"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Тынчымды алба"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Аракетсиз убакыт"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Иш түндөрү"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Дем алыш күндөрү"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> тарабынан үнсүздөлдү"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Түзмөгүңүздө ички көйгөй бар жана ал баштапкы абалга кайтарылмайынча туруктуу иштебей коюшу мүмкүн."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Түзмөгүңүздө ички көйгөй бар. Анын чоо-жайын билүү үчүн өндүрүүчүңүзгө кайрылыңыз."</string> diff --git a/core/res/res/values-land/dimens.xml b/core/res/res/values-land/dimens.xml index 640ca1ef97e2..4f0c0fbc4835 100644 --- a/core/res/res/values-land/dimens.xml +++ b/core/res/res/values-land/dimens.xml @@ -67,4 +67,7 @@ <!-- width of ImmersiveModeConfirmation (-1 for match_parent) --> <dimen name="immersive_mode_cling_width">380dp</dimen> + <!-- Floating toolbar dimensions --> + <dimen name="floating_toolbar_preferred_width">544dp</dimen> + </resources> diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml index e8104fc162fe..3a598002f09b 100644 --- a/core/res/res/values-lo-rLA/strings.xml +++ b/core/res/res/values-lo-rLA/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ປິດ"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ເລືອກໃຊ້ Wi-Fi ກ່ອນ"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"ເລືອກໃຊ້ເຊລລູລາກ່ອນ"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ຖາມຫາຮູບແບບປົດລັອກກ່ອນຍົກເລີກການປັກໝຸດ"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ຖາມຫາລະຫັດຜ່ານກ່ອນຍົກເລີກການປັກໝຸດ"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"ຜູ້ຄວບຄຸມຂອງທ່ານຕິດຕັ້ງໃສ່ແລ້ວ"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"ອັບເດດໂດຍຜູ້ຄວບຄຸມຂອງທ່ານແລ້ວ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"ຖືກຜູ້ຄວບຄຸມຂອງທ່ານລຶບໄປແລ້ວ"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ເພື່ອຊ່ວຍເພີ່ມອາຍຸແບັດເຕີຣີ, ຕົວປະຢັດໄຟແບັດເຕີຣີຫຼຸດປະສິດທິພາບການເຮັດວຽກຂອງອຸປະກອນຂອງທ່ານລົງ ແລະຈຳກັດການສັ່ນ, ການບໍລິການຫາທີ່ຕັ້ງ, ແລະຂໍ້ມູນພື້ນຫຼັງເກືອບທັງໝົດ. ອີເມວ, ການສົ່ງຂໍ້ຄວາມ, ແລະແອັບອື່ນໆທີ່ອາໄສການຊິງຄ໌ອາດຈະບໍ່ອັບເດດ ນອກຈາກວ່າທ່ານເປີດມັນ.\n\nຕົວປະຢັດໄຟແບັດເຕີຣີຈະປິດອັດຕະໂນມັດ ເມື່ອອຸປະກອນຂອງທ່ານກຳລັງສາກຢູ່."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ຫຍໍ້"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"ຫ້າມລົບກວນ"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ເວລາປິດເຮັດວຽກ"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ຄືນວັນຈັນຫາສຸກ"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ທ້າຍອາທິດ"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"ຖືກປິດສຽງໂດຍ <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ, ແລະມັນອາດຈະບໍ່ສະຖຽນຈົນກວ່າທ່ານຕັ້ງເປັນຂໍ້ມູນໂຮງງານຄືນແລ້ວ."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"ມີບັນຫາພາຍໃນກັບອຸປະກອນຂອງທ່ານ. ຕິດຕໍ່ຜູ້ຜະລິດຂອງທ່ານສຳລັບລາຍລະອຽດຕ່າງໆ."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3ebe6653b825..8bb6d1c784cc 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Išjungta"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Pageidautinas „Wi-Fi“ ryšys"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Pageidautinas mobilusis ryšys"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Prašyti atrakinimo piešinio prieš atsegant"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Prašyti slaptažodžio prieš atsegant"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Įdiegė administratorius"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Atnaujino administratorius"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Ištrynė administratorius"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Kad tausotų akumuliatoriaus energiją akumuliatoriaus tausojimo priemonė sumažina įrenginio veikimą ir apriboja vibravimą, vietovės paslaugas bei daugumą foninių duomenų. El. pašto, susirašinėjimo žinutėmis ir kitos programos, kurios veikia sinchronizavimo pagrindu, gali būti neatnaujintos, nebent jas atidarysite.\n\nAkumuliatoriaus tausojimo priemonė automatiškai išjungiama, kai įrenginys įkraunamas."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Sutraukti"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Netrukdyti"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Prastova"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Savaitgalių naktimis"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Savaitgaliais"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Nutildė <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Iškilo vidinė su jūsų įrenginiu susijusi problema, todėl įrenginys gali veikti nestabiliai, kol neatkursite gamyklinių duomenų."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Iškilo vidinė su jūsų įrenginiu susijusi problema. Jei reikia išsamios informacijos, susisiekite su gamintoju."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 788082a63ae1..cf758c0b24b1 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -130,6 +130,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izslēgts"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Vēlams Wi-Fi tīkls"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Vēlams mobilais tīkls"</string> @@ -1467,8 +1468,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pirms atspraušanas pieprasīt grafisko atslēgu"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pirms atspraušanas pieprasīt paroli"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalēja jūsu administrators"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Atjaunināja administrators"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Izdzēsa jūsu administrators"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Lai paildzinātu akumulatora darbību, akumulatora jaudas taupīšanas režīmā tiek samazināta ierīces veiktspēja un tiek ierobežota vibrācija, atrašanās vietu pakalpojumi un lielākā daļa fona datu. E-pasta, ziņojumapmaiņas un cita veida lietotnes, kuru darbības pamatā ir datu sinhronizācija, var netikt atjauninātas, ja tās neatverat.\n\nTiklīdz tiek sākta ierīces uzlāde, akumulatora jaudas taupīšanas režīms automātiski tiek izslēgts."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1497,8 +1497,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Sakļaut"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Netraucēt"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Dīkstāve"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Darbadienu naktīs"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Brīvdienās"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Skaņu izslēdza <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Jūsu ierīcē ir radusies iekšēja problēma, un ierīce var darboties nestabili. Lai to labotu, veiciet rūpnīcas datu atiestatīšanu."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Jūsu ierīcē ir radusies iekšēja problēma. Lai iegūtu plašāku informāciju, lūdzu, sazinieties ar ražotāju."</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index ee8e4cb9abf9..3937ee175d4b 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Исклучено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Се претпочита Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Се претпочита мобилна"</string> @@ -1460,8 +1461,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Прашај за шема за отклучување пред откачување"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Прашај за лозинка пред откачување"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Инсталирано од администраторот"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Ажурирано од администраторот"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Избришано од администраторот"</string> <string name="battery_saver_description" msgid="1960431123816253034">"За да ви помогне да ја подобрите трајноста на батеријата, штедачот на батеријата ја намалува изведбата на уредот и го ограничува вибрирањето, услугите за локација и повеќето податоци од заднина. Е-поштата, испраќањето пораки и другите апликации кои се потпираат на синхронизација можеби нема да се ажурираат доколку не ги отворите.\n\nШтедачот на батеријата автоматски се исклучува кога уредот се полни."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1486,8 +1486,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Собери"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не вознемирувај"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Пауза"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ноќите во неделата"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Викенди"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Звукот го исклучи <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Настана внатрешен проблем со уредот и може да биде нестабилен сè додека не ресетирате на фабричките податоци."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Настана внатрешен проблем со уредот. Контактирајте го производителот за детали."</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index a1d5bcb2cdce..93a3a0fbf383 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ഓഫ്"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi തിരഞ്ഞെടുത്തിരിക്കുന്നു"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"സെല്ലുലാർ തിരഞ്ഞെടുത്തിരിക്കുന്നു"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് അൺലോക്ക് പാറ്റേൺ ആവശ്യപ്പെടുക"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"അൺപിൻ ചെയ്യുന്നതിനുമുമ്പ് പാസ്വേഡ് ആവശ്യപ്പെടുക"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ ഇൻസ്റ്റാളുചെയ്തു"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ അപ്ഡേറ്റുചെയ്തു"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ ഇല്ലാതാക്കി"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ബാറ്ററി ആയുസ്സ് മെച്ചപ്പെടുത്താൻ സഹായിക്കുന്നതിന്, ബാറ്ററി സേവർ നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനത്തെ കുറയ്ക്കുകയും വൈബ്രേഷനെയും മിക്ക പശ്ചാത്തല വിവരത്തെയും പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു. ഇമെയിൽ, സന്ദേശമയയ്ക്കൽ, സമന്വയിപ്പിക്കലിനെ ആശ്രയിച്ചുള്ള മറ്റ് അപ്ലിക്കേഷനുകൾ എന്നിവ നിങ്ങൾ തുറക്കുന്നതുവരെ അപ്ഡേറ്റുചെയ്യാനിടയില്ല.\n\nനിങ്ങളുടെ ഉപകരണം ചാർജ്ജുചെയ്യുമ്പോൾ ബാറ്ററി സേവർ സ്വയം ഓഫാകും."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ചുരുക്കുക"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"ശല്യപ്പെടുത്തരുത്"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"പ്രവർത്തനരഹിതമായ സമയം"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ശനിയാഴ്ചയും ഞായറാഴ്ചയും അല്ലാത്ത ദിവസങ്ങളിലെ രാത്രികൾ"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"വാരാന്ത്യങ്ങൾ"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>, മ്യൂട്ടുചെയ്തു"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്, ഫാക്ടറി വിവര പുനഃസജ്ജീകരണം ചെയ്യുന്നതുവരെ ഇതു അസ്ഥിരമായിരിക്കാനിടയുണ്ട്."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"നിങ്ങളുടെ ഉപകരണത്തിൽ ഒരു ആന്തരിക പ്രശ്നമുണ്ട്. വിശദാംശങ്ങൾക്കായി നിർമ്മാതാവിനെ ബന്ധപ്പെടുക."</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 20d289bcea82..47ddb37d74c1 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Идэвхгүй"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi илүү эрхэмлэдэг"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Үүрэн сүлжээг илүү эрхэмлэдэг"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Тогтоосныг суллахаас өмнө түгжээ тайлах хээ асуух"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Тогтоосныг суллахаас өмнө нууц үг асуух"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Таны админ суулгасан байна"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Танай админ шинэчилсэн"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Таны админ устгасан байна"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Батарей хадгалах функц нь таны төхөөрөмжийн цэнэгийг хадгалахын тулд гүйцэтгэлийг багасгаж, чичрэлтийг бууруулж, байршлын үйлчилгээнүүд болон бусад өгөгдлийн хэмжээг багасгадаг юм. И-мэйл, мессеж болон бусад синхрон хийдэг апликейшнүүд дараа дахин нээгдэх хүртлээ автоматаар шинэчлэлт хийхгүй.\n\nМөн батарей хадгалах функц нь таныг төхөөрөмжөө цэнэглэх үед автоматаар унтрах юм."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1482,8 +1482,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Хумих"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Бүү саад бол"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Сул зогсолт"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ажлын өдрүүдэд орой"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Амралтын өдрүүд"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>-с хаасан"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Таны төхөөрөмжид дотоод алдаа байна.Та төхөөрөмжөө үйлдвэрээс гарсан төлөвт шилжүүлэх хүртэл таны төхөөрөмж чинь тогтворгүй байж болох юм."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Таны төхөөрөмжид дотоод алдаа байна. Дэлгэрэнгүй мэдээлэл авахыг хүсвэл үйлдвэрлэгчтэйгээ холбоо барина уу."</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index bf8a4e871e25..507d38c9d589 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"बंद"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"वाय-फाय प्राधान्यकृत"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"सेल्युलर प्राधान्यकृत"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"अनपिन करण्यापूर्वी अनलॉक नमुन्यासाठी विचारा"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"अनपिन करण्यापूर्वी संकेतशब्दासाठी विचारा"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"आपल्या प्रशासकाद्वारे स्थापित केले आहे"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"आपल्या प्रशासकाद्वारे अद्यतनित केले"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"आपल्या प्रशासकाद्वारे हटविले आहे"</string> <string name="battery_saver_description" msgid="1960431123816253034">"बॅटरीचे आयुष्य सुधारित करण्यात मदत करण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करतो आणि कंपन, स्थान सेवा आणि बराच पार्श्वभूमी डेटा मर्यादित करतो. संकालनावर अवलंबून असणारे ईमेल, संदेशन आणि इतर अॅप्स आपण उघडल्याशिवाय अद्यतनित होऊ शकत नाहीत.\n\nआपले डिव्हाइस चार्ज होत असते तेव्हा बॅटरी बचतकर्ता स्वयंचलितपणे बंद होतो."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त करा"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"व्यत्यय आणू नका"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"कार्य न करण्याचा कालावधी"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"आठवड्याच्या रात्री"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताह अखेर"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारे नि:शब्द केले"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे आणि आपला फॅक्टरी डेटा रीसेट होईपर्यंत ती अस्थिर असू शकते."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"आपल्या डिव्हाइसमध्ये अंतर्गत समस्या आहे. तपशीलांसाठी आपल्या निर्मात्याशी संपर्क साधा."</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index 65109a87d4b1..1900a8534d9a 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Mati"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi diutamakan"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Selular diutamakan"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Minta corak buka kunci sebelum menyahsemat"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Minta kata laluan sebelum menyahsemat"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Dipasang oleh pentadbir anda"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Dikemas kini oleh pentadbir anda"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Dipadamkan oleh pentadbir anda"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Untuk membantu memperbaik hayat bateri, penjimat bateri mengurangkan prestasi peranti anda dan menghadkan getaran, perkhidmatan lokasi dan kebanyakan data latar belakang. E-mel, pemesejan dan apl lain yang bergantung kepada penyegerakan mungkin tidak mengemas kini, melainkan anda membuka apl itu.\n\nPenjimat bateri dimatikan secara automatik semasa peranti anda sedang dicas."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Runtuhkan"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Jangan ganggu"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Waktu gendala"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Malam hari bekerja"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hujung minggu"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Diredam oleh <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Terdapat masalah dalaman dengan peranti anda. Peranti mungkin tidak stabil sehingga anda membuat tetapan semula data kilang."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Terdapat masalah dalaman dengan peranti anda. Hubungi pengilang untuk mengetahui butirannya."</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index e63f651d38ab..4ec9749d74a7 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ပိတ်ထားရသည်"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ဝိုင်ဖိုင်အား ပိုနှစ်သက်သော"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"ဆယ်လူလာအား ပိုနှစ်သက်သော"</string> @@ -1483,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ခေါက်ရန်"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"မနှောက်ယှက်ပါနှင့်"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ကျချိန်"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ရုံးရက်ညများ"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"စနေတနင်္ဂနွေများ"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> အသံပိတ်သည်"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေပြီး၊ မူလစက်ရုံထုတ်အခြေအနေအဖြစ် ပြန်လည်ရယူနိုင်သည်အထိ အခြေအနေမတည်ငြိမ်နိုင်ပါ။"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"သင့်ကိရိယာအတွင်းပိုင်းတွင် ပြဿနာရှိနေ၏။ အသေးစိတ်သိရန်အတွက် ပစ္စည်းထုတ်လုပ်သူအား ဆက်သွယ်ပါ။"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 1f0198d76db2..623df7b09a55 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi er foretrukket"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobil er foretrukket"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Krev bruk av opplåsningsmønster for å løsne apper"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Krev passord for å løsne apper"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Installert av administratoren"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Oppdatert av administratoren"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Slettet av administratoren"</string> <string name="battery_saver_description" msgid="1960431123816253034">"For å bidra til å forbedre batterilevetiden reduserer batterispareren ytelsen til enheten din og begrenser vibrering, posisjonstjenester og mesteparten av bakgrunnsdataene. E-post, sending av meldinger og andre apper som er avhengig av synkronisering oppdateres kanskje ikke med mindre du åpner dem.\n\nBatterisparing slås av automatisk når enheten lader."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Skjul"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"«Ikke forstyrr»"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nedetid"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Kvelder på ukedager"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helgedager"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har kuttet lyden"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Det har oppstått et internt problem på enheten din, og den kan være ustabil til du tilbakestiller den til fabrikkdata."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Det har oppstått et internt problem på enheten din. Ta kontakt med produsenten for mer informasjon."</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index 899d1cbf054d..8a72ae26febe 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"निष्क्रिय"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi मनपराइयो"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"सेलुलर मनपराइयो"</string> @@ -274,10 +275,8 @@ <string name="permdesc_receiveWapPush" msgid="748232190220583385">"WAP सन्देशहरू प्राप्त गर्न र प्रशोधन गर्न अनुप्रयोगलाई अनुमति दिन्छ। यो अनुमतिमा मोनिटर गर्ने वा तपाईँलाई पठाइएका सन्देशहरू तपाईँलाई नदेखाई मेट्ने क्षमता समावेश हुन्छ।"</string> <string name="permlab_getTasks" msgid="6466095396623933906">"चलिरहेका अनुप्रयोगहरू पुनःबहाली गर्नुहोस्"</string> <string name="permdesc_getTasks" msgid="7454215995847658102">"वर्तमानमा र भरखरै चलिरहेका कार्यहरू बारेको सूचना पुनःबहाली गर्न अनुप्रयोगलाई अनुमित दिन्छ। यसले उपकरणमा प्रयोग भएका अनुप्रयोगहरूको बारेमा सूचना पत्ता लगाउन अनुप्रयोगलाई अनुमति दिन सक्छ।"</string> - <!-- no translation found for permlab_manageProfileAndDeviceOwners (5979288447973722097) --> - <skip /> - <!-- no translation found for permdesc_manageProfileAndDeviceOwners (106894851498657169) --> - <skip /> + <string name="permlab_manageProfileAndDeviceOwners" msgid="5979288447973722097">"प्रोफाइल र यन्त्र मालिकहरू व्यवस्थापन गर्नुहोस्"</string> + <string name="permdesc_manageProfileAndDeviceOwners" msgid="106894851498657169">"अनुप्रयोगहरूलाई प्रोफाइल र यन्त्र मालिकहरू सेट गर्न अनुमति दिनुहोस्।"</string> <string name="permlab_reorderTasks" msgid="2018575526934422779">"चलिरहेका अनुप्रयोगहरूलाई पुनःक्रम गराउनुहोस्"</string> <string name="permdesc_reorderTasks" msgid="7734217754877439351">"कामहरूलाई अग्रभाग र पृष्ठभूमिमा सार्न अनुप्रयोगलाई अनुमति दिन्छ। अनुप्रयोगले यो तपाईँको इनपुट बिना नै गर्न सक्छ।"</string> <string name="permlab_enableCarMode" msgid="5684504058192921098">"कार मोड सक्षम गर्नुहोस्"</string> @@ -1087,13 +1086,13 @@ <string name="ext_media_unmount_action" msgid="1121883233103278199">"निकाल्नुहोस्"</string> <string name="ext_media_browse_action" msgid="8322172381028546087">"अन्वेषण गर्नुहोस्"</string> <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> हराइरहेको"</string> - <string name="ext_media_missing_message" msgid="5761133583368750174">"यो यन्त्र पुनःहाल्नुहोस्"</string> + <string name="ext_media_missing_message" msgid="5761133583368750174">"यो यन्त्र पुनःसम्मिलित गर्नुहोस्"</string> <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> सार्दै"</string> <string name="ext_media_move_title" msgid="1022809140035962662">"डेटा सार्दै..."</string> - <string name="ext_media_move_success_title" msgid="8575300932957954671">"सबै सार्नुहोस्"</string> + <string name="ext_media_move_success_title" msgid="8575300932957954671">"सार्ने कार्य सकियो"</string> <string name="ext_media_move_success_message" msgid="4199002148206265426">"डेटा <xliff:g id="NAME">%s</xliff:g> मा सारियो"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"डेटा सार्न सकिएन"</string> - <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा मूल स्थानबाट छुट्यो"</string> + <string name="ext_media_move_failure_message" msgid="1978096440816403360">"डेटा मूल स्थानबाट छाडियो"</string> <string name="activity_list_empty" msgid="1675388330786841066">"कुनै मिल्ने गतिविधि पाइएन।"</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"मिडिया परिणाम दिशानिर्देश गर्नुहोस्"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"मिडिया परिणामलाई अन्य बाहिरी उपकरणहरूसँग लैजानको लागि अनुप्रयोगलाई अनुमति दिन्छ।"</string> @@ -1466,8 +1465,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"पिन निकाल्नुअघि खोल्ने रूपरेखा सोध्नुहोस्"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"पिन निकाल्नुअघि पासवर्ड सोध्नुहोस्"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"तपाईँको प्रशासकद्वारा स्थापना गरिएको"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"तपाईँको प्रशासकद्वारा अद्यावधिक गरिएको"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"तपाईँको प्रशासकद्वारा हटाइएको"</string> <string name="battery_saver_description" msgid="1960431123816253034">"ब्याट्रीको आयु सुधार्न, ब्याट्री रक्षकले तपाईँको यन्त्रको कार्यसम्पादन घटाउँछ र भाइब्रेसन, स्थान सेवा र बहुसंख्यक पृष्ठभूमि डेटा सीमित गर्दछ। इमेल, सन्देश, र अन्य अनुप्रयोगहरू जुन सिङ्कमा भर पर्छन् अद्यावधिक नहुन सक्छन् जबसम्म तपाईँ तिनीहरूलाई खोल्नुहुन्न\n\n ब्याट्री रक्षक स्वत: निस्कृय हुन्छ जब तपाईँको यन्त्र चार्ज हुँदै हुन्छ।"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1492,8 +1490,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"संक्षिप्त पार्नुहोस्"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"अवरोध नपुर्याउँनुहोस्"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"डाउनटाइम"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"सप्ताह रातहरू"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"सप्ताहन्त"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> द्वारा मौन गरिएको"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ, र तपाईंले फ्याक्ट्री डाटा रिसेट नगर्दासम्म यो अस्थिर रहन्छ।"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"तपाईंको यन्त्रसँग आन्तरिक समस्या छ। विवरणहरूको लागि आफ्नो निर्मातासँग सम्पर्क गर्नुहोस्।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index c6de087e4540..ad2a49205bc9 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Uit"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Voorkeur voor wifi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Voorkeur voor mobiel"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vragen om ontgrendelingspatroon voordat items worden losgemaakt"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vragen om wachtwoord voordat items worden losgemaakt"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Geïnstalleerd door uw beheerder"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Geüpdatet door uw beheerder"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Verwijderd door uw beheerder"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Accubesparing beperkt de prestaties van uw apparaat, de trilstand, locatieservices en de meeste achtergrondgegevens om de gebruiksduur van de accu te verlengen.\n\nAccubesparing wordt automatisch uitgeschakeld terwijl uw apparaat wordt opgeladen."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Samenvouwen"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Niet storen"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Downtime"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Doordeweekse avonden"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekends"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Gedempt door <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Er is een intern probleem met uw apparaat. Het apparaat kan instabiel zijn totdat u het apparaat terugzet naar de fabrieksinstellingen."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Er is een intern probleem met uw apparaat. Neem contact op met de fabrikant voor meer informatie."</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index e71d9fec2f30..8aa5eaaeab43 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Wył."</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Preferuj Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Preferuj sieć komórkową"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Aby odpiąć, poproś o wzór odblokowania"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Aby odpiąć, poproś o hasło"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Zainstalowany przez administratora"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Zaktualizowane przez administratora"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Usunięty przez administratora"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Aby wydłużyć czas pracy baterii, Oszczędzanie baterii ogranicza aktywność urządzenia, w tym wibracje, usługi lokalizacyjne i przetwarzanie większości danych w tle. Poczta, czat i inne synchronizowane aplikacje mogą nie aktualizować swojej zawartości, dopóki ich nie otworzysz.\n\nOszczędzanie baterii wyłącza się automatycznie podczas ładowania urządzenia."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Zwiń"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nie przeszkadzać"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Powiadomienia wyłączone"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noce poza weekendem"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekendy"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Ściszone przez: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"W Twoim urządzeniu wystąpił problem wewnętrzny. Może być ono niestabilne, dopóki nie przywrócisz danych fabrycznych."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"W Twoim urządzeniu wystąpił problem wewnętrzny. Skontaktuj się z jego producentem, by otrzymać szczegółowe informacje."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5c624ce303bf..a7f9eb933766 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Rede Wi-Fi preferida"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Rede móvel preferida"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir sequência de desbloqueio antes de soltar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir palavra-passe antes de soltar"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalado pelo administrador"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Atualizado pelo administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Eliminado pelo administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ajudar a melhorar a autonomia da bateria, a poupança de bateria reduz o desempenho do seu dispositivo e limita a vibração, os serviços de localização e a maioria dos dados em segundo plano. O email, as mensagens e outras aplicações que dependem da sincronização não podem ser atualizados exceto se os abrir.\n\nA poupança de bateria desliga-se automaticamente quando o dispositivo está a carregar."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Reduzir"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Não incomodar"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Período de inatividade"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites de dias úteis"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Fins de semana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Existe um problema interno no seu dispositivo e pode ficar instável até efetuar uma reposição de dados de fábrica."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Existe um problema interno no seu dispositivo. Contacte o fabricante para obter mais informações."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 810d66e827f9..a64b1835d127 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Desativado"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi preferido"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Celular preferido"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir padrão de desbloqueio antes de liberar"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir senha antes de liberar"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalado pelo seu administrador"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Atualizado pelo administrador"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Excluído pelo seu administrador"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Para ajudar a melhorar a duração da bateria, o economizador de bateria reduz o desempenho e os limites de vibração do dispositivo, os serviços de localização e a maioria dos dados de segundo plano. E-mail, mensagens e outros aplicativos que dependem de sincronização não podem ser atualizados, a não ser que você os abra.\n\nO economizador de bateria é desligado automaticamente quando o dispositivo está sendo carregado."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Recolher"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Não perturbe"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Tempo de inatividade"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noites em dias úteis"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Finais de semana"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Som desativado por <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Há um problema interno com seu dispositivo. Ele pode ficar instável até que você faça a redefinição para configuração original."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Há um problema interno com seu dispositivo. Entre em contato com o fabricante para saber mais detalhes."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index b4497db1c2aa..e77e85f88de7 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -130,6 +130,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Dezactivată"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Se preferă conexiunea Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Se preferă conexiunea mobilă"</string> @@ -1467,8 +1468,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicită modelul pentru deblocare înainte de a anula fixarea"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicită parola înainte de a anula fixarea"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Instalat de administrator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Actualizat de un administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Șters de administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pentru a îmbunătăți autonomia bateriei, funcția de economisire a energiei reduce performanțele dispozitivului și limitează vibrațiile, serviciile de localizare și majoritatea datelor de fundal. Este posibil ca e-mailurile, mesageria și alte aplicații care depind de sincronizare să nu se actualizeze dacă nu le deschideți.\n\nFuncția de economisire a energiei se dezactivează automat când dispozitivul se încarcă."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1497,8 +1497,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Restrângeți"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nu deranja"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Inactivitate"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Serile zilelor lucrătoare"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Weekenduri"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Dezactivate de <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"A apărut o problemă internă pe dispozitiv, iar acesta poate fi instabil până la revenirea la setările din fabrică."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"A apărut o problemă internă pe dispozitiv. Pentru detalii, contactați producătorul."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index c8e093a1048c..9270d76fb61d 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Отключено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Приоритет Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Приоритет моб. сети"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запрашивать графический ключ для отключения блокировки"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запрашивать пароль для отключения блокировки"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Установлено администратором"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Обновлено администратором"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Удалено администратором"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Чтобы продлить время работы устройства от батареи, в режиме энергосбережения снижается производительность, а также ограничивается использование вибрации, геолокации и фоновой передачи данных. Данные, требующие синхронизации, могут обновляться только когда вы откроете приложение.\n\nРежим энергосбережения автоматически отключается во время зарядки устройства."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Свернуть"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не беспокоить"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Режим оповещения"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Будние вечера"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Выходные дни"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Звук отключен приложением \"<xliff:g id="THIRD_PARTY">%1$s</xliff:g>\""</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Произошла внутренняя ошибка, и устройство может работать нестабильно, пока вы не выполните сброс настроек."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Произошла внутренняя ошибка. Обратитесь к производителю устройства за подробными сведениями."</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index 831cadb45e83..0939f332ed14 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ක්රියාවිරහිතයි"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi වඩා කැමතියි"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"සෙලියුලර් වඩා කැමතියි"</string> @@ -1485,8 +1486,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"හකුළන්න"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"බාධා නොකරන්න"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"බිඳවැටුම් කාලය"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"සතියේ රාත්රි වල"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"සති අන්ත"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> විසින් නිශ්ශබ්ද කරන ලදි"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"ඔබේ උපාංගය සමගින් ගැටලුවක් ඇති අතර, ඔබේ කර්මාන්තශාලා දත්ත යළි සකසන තෙක් එය අස්ථායි විය හැකිය."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"ඔබේ උපාංගය සමගින් අභ්යන්තර ගැටලුවක් ඇත. විස්තර සඳහා ඔබේ නිෂ්පාදක අමතන්න."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index fa79ddac25a7..41d840951132 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Vypnuté"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Uprednostniť Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Uprednostniť mobilné pripojenie"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pred uvoľnením požiadať o bezpečnostný vzor"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred uvoľnením požiadať o heslo"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Inštalovaný správcom"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Aktualizované správcom"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Odstránený správcom"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Šetrič batérie znižuje výkonnosť vášho zariadenia a obmedzuje vibrovanie, služby určovania polohy a väčšinu údajov na pozadí, aby tak pomohol predĺžiť výdrž batérie. E-mailová aplikácia, aplikácia na odosielanie správ SMS a MMS a ďalšie aplikácie, ktoré sú založené na synchronizácii, sa pravdepodobne aktualizujú až po ich otvorení.\n\nŠetrič batérie sa automaticky vypne, keď zariadenie začnete nabíjať."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Zbaliť"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Nerušiť"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Doba pokoja"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noci cez týždeň"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Víkendy"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Stlmené aplikáciou <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Vo vašom zariadení došlo k internému problému. Môže byť nestabilné, kým neobnovíte jeho továrenské nastavenia."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Vo vašom zariadení došlo k internému problému. Ak chcete získať podrobné informácie, obráťte sa na jeho výrobcu."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index a79a0ecd2baf..234bd6a50634 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Izklopljeno"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Prednostno – Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Prednostno – mobilno omrežje"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pred odpenjanjem vprašaj za vzorec za odklepanje"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred odpenjanjem vprašaj za geslo"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Namestil skrbnik"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Posodobil skrbnik"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Izbrisal skrbnik"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Varčevanje z energijo akumulatorja podaljša čas njegovega delovanja tako, da zmanjša zmogljivost delovanja naprave in omeji vibriranje, lokacijske storitve ter prenos večine podatkov v ozadju. Aplikacije za e-pošto, sporočanje in drugo, ki uporabljajo sinhroniziranje, se morda ne posodabljajo, razen če jih odprete.\n\nVarčevanje z energijo akumulatorja se samodejno izklopi med polnjenjem akumulatorja naprave."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Strni"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ne moti"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Čas nedelovanja"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Noči med tednom"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Vikendi"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Izklop zvoka: <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Vaša naprava ima notranjo napako in bo morda nestabilna, dokler je ne ponastavite na tovarniške nastavitve."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Vaša naprava ima notranjo napako. Če želite več informacij, se obrnite na proizvajalca."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 738dccc288da..b5c17f9322b4 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -130,6 +130,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Искључено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Предност има Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Предност има мобилна мрежа"</string> @@ -1467,8 +1468,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Тражи шаблон за откључавање пре откачињања"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Тражи лозинку пре откачињања"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Инсталирао је ваш администратор"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Ажурирао је администратор"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Избрисао је ваш адмиистратор"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Да би продужила време трајања батерије, уштеда батерије смањује перформансе уређаја и ограничава вибрацију, услуге локације и већину позадинских података. Имејл, размена порука и друге апликације које се ослањају на синхронизацију можда неће да се ажурирају ако их не отворите.\n\nУштеда батерије се аутоматски искључује када се уређај пуни."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1497,8 +1497,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Скупи"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не узнемиравај"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Одмор"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Радним данима увече"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Викендима"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Звук је искључио/ла <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Дошло је до интерног проблема у вези са уређајем и можда ће бити нестабилан док не обавите ресетовање на фабричка подешавања."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Дошло је до интерног проблема у вези са уређајем. Потражите детаље од произвођача."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index dfaa97ac45db..57a833bf0818 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Av"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi i första hand"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobil i första hand"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Be om upplåsningsmönster innan skärmen slutar fästas"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Be om lösenord innan skärmen slutar fästas"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Paketet har installerats av administratören"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Uppdaterat av administratören"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Paketet har raderats av administratören"</string> <string name="battery_saver_description" msgid="1960431123816253034">"I batterisparläget reduceras enhetens prestanda så att batteriet ska räcka längre och vibration, platstjänster samt den mesta användningen av bakgrundsdata begränsas. Det kan hända att appar för e-post, sms och annat som kräver synkronisering inte uppdateras förrän du öppnar dem.\n\nBatterisparläget inaktiveras automatiskt när enheten laddas."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Komprimera"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Stör ej"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Avbrottstid"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Veckodagskvällar"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Helger"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> har stängt av ljudet"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Ett internt problem har uppstått i enheten, och det kan hända att problemet kvarstår tills du återställer standardinställningarna."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Ett internt problem har uppstått i enheten. Kontakta tillverkaren om du vill veta mer."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 13f6e9c60434..28d9429bf75f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -129,6 +129,9 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <!-- String.format failed for translation --> + <!-- no translation found for wfcDataSpnFormat (1118052028767666883) --> + <skip /> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Imezimwa"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi inapedelewa"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mitandao ya simu za mkononi inapendelewa"</string> @@ -1079,7 +1082,7 @@ <string name="ext_media_unmount_action" msgid="1121883233103278199">"Ondoa"</string> <string name="ext_media_browse_action" msgid="8322172381028546087">"Chunguza"</string> <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> haipo"</string> - <string name="ext_media_missing_message" msgid="5761133583368750174">"Weka tena kifaa hiki"</string> + <string name="ext_media_missing_message" msgid="5761133583368750174">"Weka kifaa hiki tena"</string> <string name="ext_media_move_specific_title" msgid="1471100343872375842">"Inahamisha <xliff:g id="NAME">%s</xliff:g>"</string> <string name="ext_media_move_title" msgid="1022809140035962662">"Inahamisha data"</string> <string name="ext_media_move_success_title" msgid="8575300932957954671">"Imekamilisha kuhamisha"</string> @@ -1458,8 +1461,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Omba mchoro wa kufungua kabla hujabandua"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Omba nenosiri kabla hujabandua"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Kilisakinishwa na msimamizi wako"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Kimesasiswa na msimamizi wako"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Kilifutwa na msimamizi wako"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Kusaidia kuboresha muda wa matumizi ya betri, inayookoa betri hupunguza utendaji wa kifaa chako na kupunguza mtetemo, huduma za utambuzi wa mahali, na data nyingi ya chini chini. Barua pepe, ujumbe na programu nyingine zinazotege,ea usawazishaji huenda zisisasishwe usipozifungua.\n\nInayookoa betri hujizima kiotomatiki kifaa chako kinapokuwa kinachaji."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1486,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Kunja"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Usinisumbue"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Wakati wa hali tuli"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Usiku wa siku za wiki"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Wikiendi"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Sauti imezimwa na <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Kuna hitilafu ya ndani ya kifaa chako, na huenda kisiwe thabiti mpaka urejeshe mipangilio ya kiwandani."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Kuna hitilafu ya ndani ya kifaa chako. Wasiliana na mtengenezaji wa kifaa chako kwa maelezo."</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index b8f8e7a25836..88a8b9129982 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"முடக்கப்பட்டுள்ளது"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"வைஃபைக்கு முன்னுரிமை"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"செல்லுலாருக்கு முன்னுரிமை"</string> @@ -1085,7 +1086,7 @@ <string name="ext_media_move_success_title" msgid="8575300932957954671">"நகர்த்தப்பட்டது"</string> <string name="ext_media_move_success_message" msgid="4199002148206265426">"<xliff:g id="NAME">%s</xliff:g>க்குத் தரவு நகர்த்தப்பட்டது"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"தரவை நகர்த்த முடியவில்லை"</string> - <string name="ext_media_move_failure_message" msgid="1978096440816403360">"அசல் இடத்திலிருந்து தரவு நகர்த்தப்பட்டது"</string> + <string name="ext_media_move_failure_message" msgid="1978096440816403360">"அசல் இடத்திலிருந்து தரவு நகர்த்தப்படவில்லை"</string> <string name="activity_list_empty" msgid="1675388330786841066">"பொருந்தும் செயல்பாடுகள் கண்டறியப்படவில்லை."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"மீடியா அவுட்புட்டை வழிசெலுத்துதல்"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"மீடியாவைப் பிற வெளிப்புறச் சாதனங்களுக்கு வெளியீடாக வழிகாட்ட பயன்பாட்டை அனுமதிக்கிறது."</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"அகற்றும் முன் திறத்தல் வடிவத்தைக் கேள்"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"அகற்றும் முன் கடவுச்சொல்லைக் கேள்"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"நிர்வாகி நிறுவினார்"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"உங்கள் நிர்வாகி புதுப்பித்துள்ளார்"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"நிர்வாகி நீக்கிவிட்டார்"</string> <string name="battery_saver_description" msgid="1960431123816253034">"பேட்டரி ஆயுளை மேம்படுத்த, பேட்டரி சேமிப்பான் உங்கள் சாதனத்தின் செயல்திறனைக் குறைத்து, அதிர்வு, இடச் சேவைகள் மற்றும் பெரும்பாலான பின்புலத் தரவு போன்றவற்றைக் கட்டுப்படுத்துகிறது. ஒத்திசைவைச் சார்ந்துள்ள மின்னஞ்சல், செய்தியிடல் மற்றும் பிற பயன்பாடுகளானது அவற்றைத் திறக்கும்வரையில் புதுப்பிக்கப்படாமல் போகக்கூடும்.\n\nஉங்கள் ஃபோன் சார்ஜ் செய்யப்படும்போது, பேட்டரி சேமிப்பான் தானாகவே முடங்கும்."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"சுருக்கு"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"தொந்தரவு செய்ய வேண்டாம்"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"செயலற்ற நேரம்"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"வார நாட்களின் இரவுகள்"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"வார இறுதி நாட்கள்"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ஒலியடக்கினார்"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது, அதனை ஆரம்பநிலைக்கு மீட்டமைக்கும் வரை நிலையற்று இயங்கலாம்."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"சாதனத்தில் அகச் சிக்கல் இருக்கிறது. விவரங்களுக்கு சாதன தயாரிப்பாளரைத் தொடர்புகொள்ளவும்."</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index af113ee3a26b..685d75f190d0 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ఆఫ్లో ఉంది"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fiకి ప్రాధాన్యత"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"సెల్యులార్కి ప్రాధాన్యత"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"అన్పిన్ చేయడానికి ముందు అన్లాక్ నమూనా కోసం అడుగు"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"అన్పిన్ చేయడానికి ముందు పాస్వర్డ్ కోసం అడుగు"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"మీ నిర్వాహకులు ఇన్స్టాల్ చేసారు"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"మీ నిర్వాహకుడు నవీకరించారు"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"మీ నిర్వాహకులు తొలగించారు"</string> <string name="battery_saver_description" msgid="1960431123816253034">"బ్యాటరీ జీవితకాలాన్ని మెరుగుపరచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది మరియు వైబ్రేషన్ను, స్థాన సేవలను మరియు ఎక్కువ నేపథ్య డేటాను పరిమితం చేస్తుంది. ఇమెయిల్, మెసేజింగ్ మరియు సమకాలీకరణపై ఆధారపడే ఇతర అనువర్తనాలు మీరు వాటిని తెరిస్తే మినహా నవీకరించబడవు.\n\nమీ పరికరం ఛార్జ్ అవుతున్నప్పుడు బ్యాటరీ సేవర్ స్వయంచాలకంగా ఆఫ్ అవుతుంది."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"కుదించండి"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"అంతరాయం కలిగించవద్దు"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ముఖ్యమైన పనిలో ఉన్నప్పుడు"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"వారపురాత్రులు"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"వారాంతాలు"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> ద్వారా మ్యూట్ చేయబడింది"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది మరియు మీరు ఫ్యాక్టరీ డేటా రీసెట్ చేసే వరకు అస్థిరంగా ఉంటుంది."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"మీ పరికరంతో అంతర్గత సమస్య ఏర్పడింది. వివరాల కోసం మీ తయారీదారుని సంప్రదించండి."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index e8cf5c253269..a658c193c454 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"ปิด"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"ต้องการใช้ Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"ต้องการใช้เครือข่ายมือถือ"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ขอรูปแบบการปลดล็อกก่อนเลิกตรึง"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ขอรหัสผ่านก่อนเลิกตรึง"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"ติดตั้งโดยผู้ดูแลระบบของคุณ"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"อัปเดตโดยผู้ดูแลระบบ"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"ลบโดยผู้ดูแลระบบของคุณ"</string> <string name="battery_saver_description" msgid="1960431123816253034">"เพื่อช่วยปรับปรุงอายุการใช้งานแบตเตอรี่ โหมดประหยัดแบตเตอรี่จะลดการทำงานของอุปกรณ์และจำกัดการสั่น บริการตำแหน่ง และข้อมูลแบ็กกราวด์ส่วนใหญ่ สำหรับอีเมล การรับส่งข้อความ และแอปอื่นๆ ที่ใช้การซิงค์จะไม่อัปเดตหากคุณไม่เปิดขึ้นมา\n\nโหมดประหยัดแบตเตอรี่จะปิดโดยอัตโนมัติขณะชาร์จอุปกรณ์"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"ยุบ"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"ห้ามรบกวน"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ช่วงเวลาเครื่องไม่ทำงาน"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"คืนวันจันทร์-ศุกร์"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"วันหยุดสุดสัปดาห์"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"ปิดเสียงโดย <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง อุปกรณ์อาจทำงานไม่เสถียรจนกว่าคุณจะรีเซ็ตข้อมูลเป็นค่าเริ่มต้น"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"อุปกรณ์ของคุณเกิดปัญหาภายในเครื่อง โปรดติดต่อผู้ผลิตเพื่อขอรายละเอียดเพิ่มเติม"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 87761bbe1054..343344a31ce8 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Naka-off"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Mas gusto ang Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mas gusto ang cellular"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Humingi ng pattern sa pag-unlock bago mag-unpin"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Humingi ng password bago mag-unpin"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Na-install ng iyong administrator"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Na-update ng iyong administrator"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Na-delete ng iyong administrator"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Upang matulungang pagbutihin ang tagal ng baterya, binabawasan ng pangtipid ng baterya ang pagganap ng iyong device at nililimitahan ang pag-vibrate, mga serbisyo ng lokasyon at karamihan sa data ng background. Maaaring hindi mag-update ang email, pagmemensahe at iba pang mga app na umaasa sa pagsi-sync maliban kung buksan mo ang mga iyon.\n\nAwtomatikong nag-o-off ang pangtipid ng baterya kapag nagcha-charge ang iyong device."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"I-collapse"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Huwag istorbohin"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Walang serbisyo"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Mga Weeknight"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Sabado at Linggo"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Na-mute ng <xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"May internal na problema sa iyong device, at maaaring hindi ito maging stable hanggang sa i-reset mo ang factory data."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"May internal na problema sa iyong device. Makipag-ugnayan sa iyong manufacturer upang malaman ang mga detalye."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index b5fc485a70fe..574e45ece7da 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Kapalı"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kablosuz bağlantı tercih edildi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Hücresel ağ tercih edildi"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Sabitlemeyi kaldırmadan önce kilit açma desenini sor"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Sabitlemeyi kaldırmadan önce şifre sor"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Yöneticiniz tarafından yüklendi"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Yöneticiniz tarafından güncellendi"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Yöneticiniz tarafından silindi"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Pil tasarrufu özelliği, pil ömrünü iyileştirmeye yardımcı olmak için cihazın performansını düşürür, titreşimi, konum hizmetlerini ve arka plan verilerinin çoğunu sınırlar. Senkronizasyona dayalı olarak çalışan e-posta, mesajlaşma uygulamaları ve diğer uygulamalar, bunları açmadığınız sürece güncellenmeyebilir.\n\nCihazınız şarj olurken pil tasarrufu otomatik olarak kapatılır."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Daralt"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Rahatsız etmeyin"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Bildirim istenmeyen zaman"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Hafta içi her gece"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Hafta sonu"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> tarafından kapatıldı"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Cihazınızla ilgili dahili bir sorun oluştu ve fabrika verilerine sıfırlama işlemi gerçekleştirilene kadar kararsız çalışabilir."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Cihazınızla ilgili dahili bir sorun oluştu. Ayrıntılı bilgi için üreticinizle iletişim kurun."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index f792619f2d6d..02114ec10f81 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -131,6 +131,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Вимкнено"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi за умовчанням"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Мобільна мережа за умовчанням"</string> @@ -1476,8 +1477,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запитувати ключ розблокування перед відкріпленням"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запитувати пароль перед відкріпленням"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Установив адміністратор"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Оновлено адміністратором"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Видалив адміністратор"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Щоб подовжити час роботи акумулятора, функція заощадження заряду акумулятора знижує продуктивність пристрою, а також обмежує вібрацію, функції служб локації та передавання більшості фонових даних. Електронна пошта, чати й інші додатки, які синхронізуються, можуть не оновлюватися, доки ви їх не відкриєте.\n\nФункція заощадження заряду акумулятора автоматично вимикається під час заряджання пристрою."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1510,8 +1510,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Згорнути"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Не турбувати"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Простій"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Увечері в робочі дні"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"У вихідні"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> вимикає звук"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Через внутрішню помилку ваш пристрій може працювати нестабільно. Відновіть заводські налаштування."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"На пристрої сталася внутрішня помилка. Зв’яжіться з виробником пристрою, щоб дізнатися більше."</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index 9a2ab9add953..f8acd34b91b8 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"آف"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi ترجیحی"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"سیلولر ترجیحی"</string> @@ -416,7 +417,7 @@ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"ایپ کو ٹیبلیٹ پر بلوٹوتھ کی ترتیب دیکھنے اور جوڑا بنائے ہوئے آلات کے ساتھ کنکشنز بنانے اور قبول کرنے کی اجازت دیتا ہے۔"</string> <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"ایپ کو TV پر بلوٹوتھ کی کنفیگریشن دیکھنے اور جوڑا بنائے ہوئے آلات کے ساتھ کنکشنز بنانے اور قبول کرنے کی اجازت دیتا ہے۔"</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"ایپ کو فون پر بلوٹوتھ کی ترتیب دیکھنے اور جوڑا بنائے ہوئے آلات کے ساتھ کنکشنز بنانے اور قبول کرنے کی اجازت دیتا ہے۔"</string> - <string name="permlab_nfc" msgid="4423351274757876953">"Near Field کمیونیکیشن کو کنٹرول کریں"</string> + <string name="permlab_nfc" msgid="4423351274757876953">"Near Field کمیونیکیشن کنٹرول کریں"</string> <string name="permdesc_nfc" msgid="7120611819401789907">"ایپ کو Near Field Communication (NFC) ٹیگز، کارڈز اور ریڈرز کے ساتھ مواصلت کرنے کی اجازت دیٹا ہے۔"</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"اپنے اسکرین لاک کو غیر فعال کریں"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"ایپ کو کلیدی لاک اور کسی بھی متعلقہ پاس ورڈ سیکیورٹی کو غیر فعال کرنے کی اجازت دیتا ہے۔ مثلاً، کوئی آنے والی فون کال موصول ہونے کے وقت فون کلیدی لاک کو غیر فعال کرتا ہے، پھر کال پوری ہوجانے پر کلیدی لاک کو دوبارہ فعال کردیتا ہے۔"</string> @@ -692,7 +693,7 @@ <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM کارڈ غیر مقفل ہو رہا ہے…"</string> <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"آپ نے اپنا پاس ورڈ <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> - <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"آپ نے اپنا PIN <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> + <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"آپ نے <xliff:g id="NUMBER_0">%d</xliff:g> بار اپنا PIN غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"آپ نے اپنے غیر مقفل کرنے کے پیٹرن کو <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے اپنے Google سائن ان کا استعمال کرکے اپنے ٹیبلٹ کو غیر مقفل کرنے کیلئے کہا جائے گا۔ \n\n <xliff:g id="NUMBER_2">%d</xliff:g> سیکنڈز بعد دوبارہ کوشش کریں۔"</string> <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے اپنا Google سائن ان استعمال کرکے اپنا TV غیر مقفل کرنے کو کہا جائے گا۔\n\n <xliff:g id="NUMBER_2">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"آپ نے اپنے غیر مقفل کرنے کے پیٹرن کو <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، آپ سے اپنے Google سائن ان کا استعمال کرکے اپنے فون کو غیر مقفل کرنے کیلئے کہا جائے گا۔ \n\n <xliff:g id="NUMBER_2">%d</xliff:g> سیکنڈز بعد دوبارہ کوشش کریں۔"</string> @@ -1309,7 +1310,7 @@ <string name="kg_login_invalid_input" msgid="5754664119319872197">"غلط صارف نام یا پاس ورڈ۔"</string> <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"اپنا صارف نام یا پاس ورڈ بھول گئے؟\n"<b>"google.com/accounts/recovery"</b>" ملاحظہ کریں۔"</string> <string name="kg_login_checking_password" msgid="1052685197710252395">"اکاؤنٹ چیک کیا جا رہا ہے…"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"آپ نے اپنا PIN <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"آپ نے <xliff:g id="NUMBER_0">%d</xliff:g> بار اپنا PIN غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"آپ نے اپنا پاس ورڈ <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"آپ نے ٹیبلیٹ کو غیر مقفل کرنے کیلئے <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے کوشش کی ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، ٹیبلیٹ فیکٹری ڈیفالٹ پر دوبارہ ترتیب دے دیا جائے گا اور صارف کا سبھی ڈیٹا ضائع ہو جائے گا۔"</string> @@ -1458,10 +1459,9 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"پن ہٹانے سے پہلے غیر مقفل کرنے کا پیٹرن طلب کریں"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"پن ہٹانے سے پہلے پاس ورڈ طلب کریں"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"آپ کے منتظم کی جانب سے انسٹال کر دیا گیا"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"آپ کے منتظم نے اپ ڈيٹ کر دیا"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"آپ کے منتظم کی جانب سے حذف کر دیا گیا"</string> - <string name="battery_saver_description" msgid="1960431123816253034">"بیٹری کی میعاد بہتر کرنے میں مدد کرنے کیلئے، بیٹری کی بچت آپ کے آلہ کی کارکردگی کم کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کا بیشتر ڈیٹا محدود کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر مبنی دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآپ کا آلہ چارج ہوتے وقت بیٹری کی بچت خود بخود آف ہو جاتی ہے۔"</string> + <string name="battery_saver_description" msgid="1960431123816253034">"بیٹری کی میعاد بہتر کرنے میں مدد کرنے کیلئے، بیٹری سیور آپ کے آلہ کی کارکردگی کم کر دیتی ہے اور وائبریشن، مقام کی سروسز اور پس منظر کا بیشتر ڈیٹا محدود کر دیتی ہے۔ ای میل، پیغام رسانی اور مطابقت پذیری پر منحصر دیگر ایپس ممکن ہے اس وقت تک اپ ڈیٹ نہ ہوں جب تک آپ انہیں نہ کھولیں۔\n\nآپ کا آلہ چارج ہوتے وقت بیٹری سیور خود بخود آف ہو جاتی ہے۔"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> <item quantity="other">%1$d منٹ کیلئے (<xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g> تک)</item> <item quantity="one">ایک منٹ کیلئے (تک <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"سکیڑیں"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"ڈسٹرب نہ کریں"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"ڈاؤن ٹائم"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"ہفتہ کی راتوں کو"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"ویک اینڈز کو"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"<xliff:g id="THIRD_PARTY">%1$s</xliff:g> کے ذریعے خاموش کردہ"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"آپ کے آلہ میں ایک داخلی مسئلہ ہے اور جب تک آپ فیکٹری ڈیٹا کو دوبارہ ترتیب نہیں دے دیتے ہیں، ہوسکتا ہے کہ یہ غیر مستحکم رہے۔"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"آپ کے آلہ میں ایک داخلی مسئلہ ہے۔ تفصیلات کیلئے اپنے مینوفیکچرر سے رابطہ کریں۔"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index c368d51f528a..6731d33be03e 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"O‘chirilgan"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi afzal ko‘rilsin"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Mobil tarmoq afzal ko‘rilsin"</string> @@ -240,21 +241,21 @@ <string name="permgroupdesc_phone" msgid="2016641188146068700">"qurilma telefon xizmatidan foydalanish"</string> <string name="permgrouplab_sensors" msgid="7416703484233940260">"Sensorlar"</string> <string name="permgroupdesc_sensors" msgid="2987451839455524494">"taqiladigan qurilmalar va sensorlarni ko‘rish"</string> - <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni ajratib olish"</string> - <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent ma’lumotlarini o‘rganib chiqish."</string> + <string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"Oynadagi kontentni o‘qiydi"</string> + <string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"Joriy oynadagi kontent mazmunini aniqlaydi."</string> <string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"Tegib o‘rganish xizmatini yoqish"</string> <string name="capability_desc_canRequestTouchExploration" msgid="5800552516779249356">"tegilgan elementlar ovoz chiqarib o‘qiladi va ekrandagi elementlarni barmoq harakatlari yordamida o‘rganish mumkin."</string> <string name="capability_title_canRequestEnhancedWebAccessibility" msgid="1739881766522594073">"Kengaytirilgan veb qulayligini yoqish"</string> <string name="capability_desc_canRequestEnhancedWebAccessibility" msgid="7881063961507511765">"Ilova dasturning qulayroq bo‘lishi uchun skriptlar o‘rnatilgan bo‘lishi mumkin."</string> - <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Terayotgan matningizni kuzatish"</string> - <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Kredit karta raqamlari va parollar kabi shaxsiy ma’lumotlarni o‘z ichiga oladi."</string> + <string name="capability_title_canRequestFilterKeyEvents" msgid="2103440391902412174">"Kiritilayotgan matnni kuzatadi"</string> + <string name="capability_desc_canRequestFilterKeyEvents" msgid="7463135292204152818">"Bunga kredit karta raqamlari va parollar kabi shaxsiy ma’lumotlar kiradi."</string> <string name="permlab_statusBar" msgid="7417192629601890791">"holat panelini o‘zgartirish yoki o‘chirish"</string> <string name="permdesc_statusBar" msgid="8434669549504290975">"Ilova holat panelini o‘chirib qo‘yishi hamda tizim ikonkalarini qo‘shishi yoki olib tashlashi mumkin."</string> <string name="permlab_statusBarService" msgid="7247281911387931485">"holat paneli"</string> <string name="permdesc_statusBarService" msgid="716113660795976060">"Ilova holat qatorining o‘rnini egallashi mumkin."</string> <string name="permlab_expandStatusBar" msgid="1148198785937489264">"holat panelini yoyish/yig‘ish"</string> <string name="permdesc_expandStatusBar" msgid="6917549437129401132">"Ilova holat panelini yoyishi va yig‘ishi mumkin."</string> - <string name="permlab_install_shortcut" msgid="4279070216371564234">"yorliqlar o‘rnatish"</string> + <string name="permlab_install_shortcut" msgid="4279070216371564234">"yorliqlarni yaratish"</string> <string name="permdesc_install_shortcut" msgid="8341295916286736996">"Dasturga foydalanuvchini aralashtirmasdan, Uy ekraniga yorliqlar qo‘shish imkonini beradi."</string> <string name="permlab_uninstall_shortcut" msgid="4729634524044003699">"yorliqlarni o‘chirish"</string> <string name="permdesc_uninstall_shortcut" msgid="6745743474265057975">"Dasturga foydalanuvchini aralashtirmasdan, uy ekranidagi yorliqlarni o‘chirishga ruxsat beradi."</string> @@ -282,7 +283,7 @@ <string name="permdesc_enableCarMode" msgid="4853187425751419467">"Ilova avtomobil rejimini yoqishi mumkin."</string> <string name="permlab_killBackgroundProcesses" msgid="3914026687420177202">"boshqa ilovalarni yopish"</string> <string name="permdesc_killBackgroundProcesses" msgid="4593353235959733119">"Ilovaga boshqa ilovalarning orqa fonda amalga oshirilayotgan jarayonlarini to‘xtatish uchun ruxsat beradi. Bu boshqa ilovalarning to‘xtatilishiga sabab bo‘lishi mumkin."</string> - <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"boshqa ilovalar ustiga chizish"</string> + <string name="permlab_systemAlertWindow" msgid="3543347980839518613">"interfeys elementlarini boshqa oynalar ustidan ko‘rsatish"</string> <string name="permdesc_systemAlertWindow" msgid="8584678381972820118">"Ilovaga foydalanuvchi interfeysining qismlariga yoki boshqa ilovalarning tepasiga chizish uchun ruxsat beradi. Ular har qanday ilova interfeysidan foydalanganingizda ishingizga xalaqit qilishi mumkin yoki boshqa ilovalarda siz ko‘ryapman deb o‘ylayotgan narsalarni o‘zgartirishlari mumkin."</string> <string name="permlab_persistentActivity" msgid="8841113627955563938">"ilovani doim ishlab turadigan qilish"</string> <string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va planshetni sekin ishlashiga sabab bo‘lishi mumkin."</string> @@ -368,7 +369,7 @@ <string name="permdesc_transmitIr" product="tablet" msgid="5358308854306529170">"Dasturga planshetdagi infraqizil antenadan foydalanish ruxsatini beradi."</string> <string name="permdesc_transmitIr" product="tv" msgid="3926790828514867101">"Ilovaga televizorning infraqizil uzatkichidan foydalanish huquqini beradi."</string> <string name="permdesc_transmitIr" product="default" msgid="7957763745020300725">"Dasturga telefondagi infraqizil antenadan foydalanish ruxsatini beradi."</string> - <string name="permlab_setWallpaper" msgid="6627192333373465143">"orqa fonga rasm o‘rnatish"</string> + <string name="permlab_setWallpaper" msgid="6627192333373465143">"fonga rasm o‘rnatish"</string> <string name="permdesc_setWallpaper" msgid="7373447920977624745">"Ilova tizim uchun orqa fon rasmlarini o‘rnatishi mumkin."</string> <string name="permlab_setWallpaperHints" msgid="3278608165977736538">"fon rasmi o‘lchamini moslash"</string> <string name="permdesc_setWallpaperHints" msgid="8235784384223730091">"Ilova tizimning orqa fon rasmlari uchun o‘lchamlarini ko‘rsatishi mumkin."</string> @@ -396,13 +397,13 @@ <string name="permdesc_changeTetherState" msgid="1524441344412319780">"Ilova modem rejimida tarmoqqa ulanish holatini o‘zgartirishi mumkin."</string> <string name="permlab_accessWifiState" msgid="5202012949247040011">"Wi-Fi ulanishlarini ko‘rish"</string> <string name="permdesc_accessWifiState" msgid="5002798077387803726">"Ilovaga ulangan Wi-Fi qurilmalari nomi va yoqilgan Wi-Fi kabi Wi-Fi tarmoqlari haqidagi ma’lumotni ko‘rish imkonini beradi."</string> - <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi’ga ulash va uni uzish"</string> + <string name="permlab_changeWifiState" msgid="6550641188749128035">"Wi-Fi tarmog‘iga ulanish va uzish"</string> <string name="permdesc_changeWifiState" msgid="7137950297386127533">"Ilovaga Wi-Fi ulanish nuqtalariga ulanish va ulardan uzilishga hamda Wi-Fi tarmoqlari uchun qurilmalar sozlamasiga o‘zgartirishlar kiritishga ruxsat beradi."</string> <string name="permlab_changeWifiMulticastState" msgid="1368253871483254784">"Wi-Fi Multicast qabul qilishga ruxsat berish"</string> <string name="permdesc_changeWifiMulticastState" product="tablet" msgid="7969774021256336548">"Ilovaga Wi-Fi tarmoq orqali guruh manzillardan foydalanib, faqat planshetingizga emas, balki barcha qurilmalarga yuborilgan paketlarni qabul qilishga ruxsat beradi. U oddiy rejimdagidan ko‘ra ko‘proq quvvat sarflaydi."</string> <string name="permdesc_changeWifiMulticastState" product="tv" msgid="9031975661145014160">"Ilovaga faqat televizoringizga emas, balki biror Wi-Fi tarmog‘iga ulangan barcha qurilmalarga ommaviy uzatish manzillari orqali yuborilgan paketlarni qabul qilish huquqini beradi."</string> <string name="permdesc_changeWifiMulticastState" product="default" msgid="6851949706025349926">"Ilovaga Wi-Fi tarmoq orqali guruh manzillardan foydalanib, faqat telefoningizga emas, balki barcha qurilmalarga yuborilgan paketlarni qabul qilishga ruxsat beradi. U oddiy rejimdagidan ko‘ra ko‘proq quvvat sarflaydi."</string> - <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth sozlamalariga ruxsat"</string> + <string name="permlab_bluetoothAdmin" msgid="6006967373935926659">"Bluetooth sozlamalariga kirish"</string> <string name="permdesc_bluetoothAdmin" product="tablet" msgid="6921177471748882137">"Ilova Bluetooth funksiyali mahalliy planshet sozlamalarini sozlashi hamda masofadan turib qurilmalarni aniqlash va ular bilan juftlashishni amalga oshirishi mumkin."</string> <string name="permdesc_bluetoothAdmin" product="tv" msgid="3373125682645601429">"Ilovaga mahalliy Bluetooth TV qurilmasini sozlash hamda masofadagi qurilmalarni aniqlash va ularga ulanish huquqini beradi."</string> <string name="permdesc_bluetoothAdmin" product="default" msgid="8931682159331542137">"Ilova Bluetooth funksiyali mahalliy telefon sozlamalarini sozlashi hamda masofadan turib qurilmalarni aniqlash va ular bilan juftlashishni amalga oshirishi mumkin."</string> @@ -416,7 +417,7 @@ <string name="permdesc_bluetooth" product="tablet" msgid="3480722181852438628">"Ilovaga planshetdagi Bluetooth‘ning sozlamasini ko‘rishga va bog‘langan qurilmalarga ulanish va ulardan ulanish so‘rovlarini qabul qulishga imkon beradi."</string> <string name="permdesc_bluetooth" product="tv" msgid="3974124940101104206">"Ilovaga televizordagi Bluetooth sozlamalarini ko‘rish hamda juftlashgan qurilmalar bilan aloqa o‘rnatish va ulanishlarni qabul qilish huquqini beradi."</string> <string name="permdesc_bluetooth" product="default" msgid="3207106324452312739">"Ilovaga telefondagi Bluetooth‘ning sozlamasini ko‘rishga va bog‘langan qurilmalarga ulanish va ulardan ulanish so‘rovlarini qabul qulishga imkon beradi."</string> - <string name="permlab_nfc" msgid="4423351274757876953">"yaqindagi aloqa radiuslarini boshqarish"</string> + <string name="permlab_nfc" msgid="4423351274757876953">"NFC modulini boshqarish"</string> <string name="permdesc_nfc" msgid="7120611819401789907">"Ilova qisqa masofali aloqa (NFC) texnologiyasi yordamida NFC yorliqlari, kartalar va o‘qish moslamalari bilan ma’lumot almashishi mumkin."</string> <string name="permlab_disableKeyguard" msgid="3598496301486439258">"ekran qulfini o‘chirib qo‘yish"</string> <string name="permdesc_disableKeyguard" msgid="6034203065077122992">"Ilovaga ekran qulfini va har qanday parol yordamidagi xavfsizlik himoyalarini o‘chirishga ruxsat beradi. Masalan, kirish qo‘ng‘irog‘ida telefon ekran qulfini o‘chiradi va qo‘ng‘iroq tugashi bilan qulfni yoqadi."</string> @@ -445,7 +446,7 @@ <string name="permdesc_writeSyncSettings" msgid="8956262591306369868">"Ilovaga hisobning sinxronlash sozlamalarini o‘zgartirish uchun ruxsat beradi. Masalan, bundan \"Odamlar\" ilovasini hisob bilan sinxronlanlash uchun foydalanish mumkin."</string> <string name="permlab_readSyncStats" msgid="7396577451360202448">"sinxronlash statistikasini o‘qish"</string> <string name="permdesc_readSyncStats" msgid="1510143761757606156">"Ilovaga hisobning sinxronlash statistikasini, shu jumladan, sinxronlangan hodisalar tarixi va qancha ma’lumot sinxronlanganligi haqidagi ma’lumotni o‘qishga ruxsat beradi."</string> - <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"obunalarga yozish"</string> + <string name="permlab_subscribedFeedsWrite" msgid="9015246325408209296">"obuna ma’lumotlarini o‘zgartirish"</string> <string name="permdesc_subscribedFeedsWrite" msgid="6928930188826089413">"Ilova hozirgi vaqtda sinxronlanayotgan elementlarni o‘zgartirishi mumkin. Zararli dasturlar uning yordamida sinxronlangan elementlarni o‘zgartirishi mumkin"</string> <string name="permlab_readDictionary" msgid="4107101525746035718">"lug‘atga qo‘shgan atamalaringizni o‘qish"</string> <string name="permdesc_readDictionary" msgid="659614600338904243">"Ilovaga foydalanuvchi lug‘atga zaxiralagan barcha so‘zlar, nomlar va so‘z birikmalarini o‘qish uchun ruxsat beradi."</string> @@ -536,36 +537,36 @@ <string name="policydesc_disableKeyguardFeatures" msgid="3980868516629887575">"Ekran qulfining ba’zi funksiyalaridan foydalanishni cheklaydi."</string> <string-array name="phoneTypes"> <item msgid="8901098336658710359">"Uy"</item> - <item msgid="869923650527136615">"Mobayl"</item> + <item msgid="869923650527136615">"Mobil"</item> <item msgid="7897544654242874543">"Ish"</item> <item msgid="1103601433382158155">"Faks (ish)"</item> <item msgid="1735177144948329370">"Faks (uy)"</item> <item msgid="603878674477207394">"Peyjer"</item> <item msgid="1650824275177931637">"Boshqa"</item> - <item msgid="9192514806975898961">"Boshqa"</item> + <item msgid="9192514806975898961">"Maxsus"</item> </string-array> <string-array name="emailAddressTypes"> <item msgid="8073994352956129127">"Uy"</item> <item msgid="7084237356602625604">"Ish"</item> <item msgid="1112044410659011023">"Boshqa"</item> - <item msgid="2374913952870110618">"Boshqa"</item> + <item msgid="2374913952870110618">"Maxsus"</item> </string-array> <string-array name="postalAddressTypes"> <item msgid="6880257626740047286">"Uy"</item> <item msgid="5629153956045109251">"Ish"</item> <item msgid="4966604264500343469">"Boshqa"</item> - <item msgid="4932682847595299369">"Boshqa"</item> + <item msgid="4932682847595299369">"Maxsus"</item> </string-array> <string-array name="imAddressTypes"> <item msgid="1738585194601476694">"Uy"</item> <item msgid="1359644565647383708">"Ish"</item> <item msgid="7868549401053615677">"Boshqa"</item> - <item msgid="3145118944639869809">"Boshqa"</item> + <item msgid="3145118944639869809">"Maxsus"</item> </string-array> <string-array name="organizationTypes"> <item msgid="7546335612189115615">"Ish"</item> <item msgid="4378074129049520373">"Boshqa"</item> - <item msgid="3455047468583965104">"Boshqa"</item> + <item msgid="3455047468583965104">"Maxsus"</item> </string-array> <string-array name="imProtocols"> <item msgid="8595261363518459565">"AIM"</item> @@ -577,9 +578,9 @@ <item msgid="2506857312718630823">"ICQ"</item> <item msgid="1648797903785279353">"Jabber"</item> </string-array> - <string name="phoneTypeCustom" msgid="1644738059053355820">"Boshqa"</string> + <string name="phoneTypeCustom" msgid="1644738059053355820">"Maxsus"</string> <string name="phoneTypeHome" msgid="2570923463033985887">"Uy"</string> - <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobayl"</string> + <string name="phoneTypeMobile" msgid="6501463557754751037">"Mobil"</string> <string name="phoneTypeWork" msgid="8863939667059911633">"Ish"</string> <string name="phoneTypeFaxWork" msgid="3517792160008890912">"Faks (ish)"</string> <string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faks (uy)"</string> @@ -598,24 +599,24 @@ <string name="phoneTypeWorkPager" msgid="649938731231157056">"Peyjer (ish)"</string> <string name="phoneTypeAssistant" msgid="5596772636128562884">"Yordamchi"</string> <string name="phoneTypeMms" msgid="7254492275502768992">"MMS"</string> - <string name="eventTypeCustom" msgid="7837586198458073404">"Boshqa"</string> + <string name="eventTypeCustom" msgid="7837586198458073404">"Maxsus"</string> <string name="eventTypeBirthday" msgid="2813379844211390740">"Tug‘ilgan kun"</string> <string name="eventTypeAnniversary" msgid="3876779744518284000">"Yubiley"</string> <string name="eventTypeOther" msgid="7388178939010143077">"Boshqa"</string> - <string name="emailTypeCustom" msgid="8525960257804213846">"Boshqa"</string> + <string name="emailTypeCustom" msgid="8525960257804213846">"Maxsus"</string> <string name="emailTypeHome" msgid="449227236140433919">"Uy"</string> <string name="emailTypeWork" msgid="3548058059601149973">"Ish"</string> <string name="emailTypeOther" msgid="2923008695272639549">"Boshqa"</string> - <string name="emailTypeMobile" msgid="119919005321166205">"Mobayl"</string> - <string name="postalTypeCustom" msgid="8903206903060479902">"Boshqa"</string> + <string name="emailTypeMobile" msgid="119919005321166205">"Mobil"</string> + <string name="postalTypeCustom" msgid="8903206903060479902">"Maxsus"</string> <string name="postalTypeHome" msgid="8165756977184483097">"Uy"</string> <string name="postalTypeWork" msgid="5268172772387694495">"Ish"</string> <string name="postalTypeOther" msgid="2726111966623584341">"Boshqa"</string> - <string name="imTypeCustom" msgid="2074028755527826046">"Boshqa"</string> + <string name="imTypeCustom" msgid="2074028755527826046">"Maxsus"</string> <string name="imTypeHome" msgid="6241181032954263892">"Uy"</string> <string name="imTypeWork" msgid="1371489290242433090">"Ish"</string> <string name="imTypeOther" msgid="5377007495735915478">"Boshqa"</string> - <string name="imProtocolCustom" msgid="6919453836618749992">"Boshqa"</string> + <string name="imProtocolCustom" msgid="6919453836618749992">"Maxsus"</string> <string name="imProtocolAim" msgid="7050360612368383417">"AIM"</string> <string name="imProtocolMsn" msgid="144556545420769442">"Windows Live"</string> <string name="imProtocolYahoo" msgid="8271439408469021273">"Yahoo"</string> @@ -627,23 +628,23 @@ <string name="imProtocolNetMeeting" msgid="8287625655986827971">"NetMeeting"</string> <string name="orgTypeWork" msgid="29268870505363872">"Ish"</string> <string name="orgTypeOther" msgid="3951781131570124082">"Boshqa"</string> - <string name="orgTypeCustom" msgid="225523415372088322">"Boshqa"</string> - <string name="relationTypeCustom" msgid="3542403679827297300">"Boshqa"</string> + <string name="orgTypeCustom" msgid="225523415372088322">"Maxsus"</string> + <string name="relationTypeCustom" msgid="3542403679827297300">"Maxsus"</string> <string name="relationTypeAssistant" msgid="6274334825195379076">"Yordamchi"</string> <string name="relationTypeBrother" msgid="8757913506784067713">"Aka/uka"</string> - <string name="relationTypeChild" msgid="1890746277276881626">"Bola"</string> - <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Ichki hamkor"</string> + <string name="relationTypeChild" msgid="1890746277276881626">"Farzand"</string> + <string name="relationTypeDomesticPartner" msgid="6904807112121122133">"Fuqarolik nikohida"</string> <string name="relationTypeFather" msgid="5228034687082050725">"Ota"</string> <string name="relationTypeFriend" msgid="7313106762483391262">"Do‘st"</string> <string name="relationTypeManager" msgid="6365677861610137895">"Menejer"</string> <string name="relationTypeMother" msgid="4578571352962758304">"Ona"</string> <string name="relationTypeParent" msgid="4755635567562925226">"Ota-ona"</string> <string name="relationTypePartner" msgid="7266490285120262781">"Hamkor"</string> - <string name="relationTypeReferredBy" msgid="101573059844135524">"Qarindoshligi:"</string> - <string name="relationTypeRelative" msgid="1799819930085610271">"Aloqasi bor"</string> - <string name="relationTypeSister" msgid="1735983554479076481">"Singlisi"</string> - <string name="relationTypeSpouse" msgid="394136939428698117">"Eri"</string> - <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Boshqa"</string> + <string name="relationTypeReferredBy" msgid="101573059844135524">"Tavsiya qilingan"</string> + <string name="relationTypeRelative" msgid="1799819930085610271">"Qarindosh"</string> + <string name="relationTypeSister" msgid="1735983554479076481">"Opa/singil"</string> + <string name="relationTypeSpouse" msgid="394136939428698117">"Turmush o‘rtog‘i"</string> + <string name="sipAddressTypeCustom" msgid="2473580593111590945">"Maxsus"</string> <string name="sipAddressTypeHome" msgid="6093598181069359295">"Uy"</string> <string name="sipAddressTypeWork" msgid="6920725730797099047">"Ish"</string> <string name="sipAddressTypeOther" msgid="4408436162950119849">"Boshqa"</string> @@ -663,7 +664,7 @@ <string name="lockscreen_instructions_when_pattern_enabled" msgid="46154051614126049">"Qulfdan chiqarish yoki favqulodda qo‘ng‘iroqni amalga oshirish uchun \"Menyu\"ni bosing."</string> <string name="lockscreen_instructions_when_pattern_disabled" msgid="686260028797158364">"Qulfni ochish uchun \"Menyu\"ga bosing."</string> <string name="lockscreen_pattern_instructions" msgid="7478703254964810302">"Qulfni ochish uchun namuna ustiga chizing"</string> - <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Tez yordam"</string> + <string name="lockscreen_emergency_call" msgid="5298642613417801888">"Favqulodda qo‘ng‘iroq"</string> <string name="lockscreen_return_to_call" msgid="5244259785500040021">"Qo‘ng‘iroqni qaytarish"</string> <string name="lockscreen_pattern_correct" msgid="9039008650362261237">"To‘g‘ri!"</string> <string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"Qaytadan urining"</string> @@ -690,11 +691,11 @@ <string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Foydalanuvchi qo‘llanmasiga qarang yoki Abonentlarni qo‘llab-quvvatlash markaziga murojaat qiling."</string> <string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"SIM karta qulflangan."</string> <string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"SIM karta qulfdan chiqarilmoqda…"</string> - <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Siz chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urining."</string> + <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urining."</string> <string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Siz parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urining."</string> <string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Siz PIN-kodni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urining."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Siz chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Telefon qulfini ochish uchun yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri urinish qilsangiz, sizdan Google hisobingizga kirish talab qilinadi. \n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qayta urining."</string> - <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Siz chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizni qulfdan chiqarish uchun Google hisobingizga kirish talab qilinadi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qaytadan urining."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Telefon qulfini ochish uchun yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri urinish qilsangiz, sizdan Google hisobingizga kirish talab qilinadi. \n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qayta urining."</string> + <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizni qulfdan chiqarish uchun Google hisobingizga kirish talab qilinadi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qaytadan urining."</string> <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Telefon qulfini ochish uchun yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri urinish qilsangiz, sizdan Google hisobingizga kirish talab qilinadi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qayta urining."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Planshet qulfini <xliff:g id="NUMBER_0">%d</xliff:g> marta ochishga urinib ko‘rdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishlardan so‘ng, planshet ishlab chiqarilgan holatiga tiklanadi va barcha foydalanuvchi ma’lumotlari yo‘qoladi."</string> <string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"Siz televizorni qulfdan chiqarish parolini <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizda zavod sozlamalari qayta tiklanadi hamda undagi barcha ma’lumotlaringiz o‘chib ketadi."</string> @@ -702,7 +703,7 @@ <string name="lockscreen_failed_attempts_now_wiping" product="tablet" msgid="280873516493934365">"Planshet qulfini <xliff:g id="NUMBER">%d</xliff:g> marta ochishga urinib ko‘rdingiz. Planshet hozir ishlab chiqarilgan holatiga tiklanadi."</string> <string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Siz televizorni qulfdan chiqarish parolini <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Endi, televizoringizda zavod sozlamalari qayta tiklanadi."</string> <string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Telefon qulfini <xliff:g id="NUMBER">%d</xliff:g> marta ochishga urinib ko‘rdingiz. Telefon hozir ishlab chiqarilgan holatiga tiklanadi."</string> - <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> soniyadan keyin qayta urinib ko‘ring."</string> + <string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"<xliff:g id="NUMBER">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Chizma namunasi yodingizdan chiqdimi?"</string> <string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Qulfni ochish hisobi"</string> <string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Chizmali parolni ochishga juda ko‘p urinildi"</string> @@ -944,22 +945,22 @@ <string name="volume_ringtone" msgid="6885421406845734650">"Qo‘ng‘iroq tovushi"</string> <string name="volume_music" msgid="5421651157138628171">"Media tovushi"</string> <string name="volume_music_hint_playing_through_bluetooth" msgid="9165984379394601533">"Bluetooth orqali ijro etilmoqda"</string> - <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Jiringlash ohangi ovozsiz"</string> + <string name="volume_music_hint_silent_ringtone_selected" msgid="8310739960973156272">"Ovozsiz rejim tanlandi"</string> <string name="volume_call" msgid="3941680041282788711">"Kiruvchi qo‘ng‘iroq balandligi"</string> <string name="volume_bluetooth_call" msgid="2002891926351151534">"Kiruvchi bluetooth tovushi"</string> - <string name="volume_alarm" msgid="1985191616042689100">"Uyg‘otgich tovushi"</string> + <string name="volume_alarm" msgid="1985191616042689100">"Signal balandligi"</string> <string name="volume_notification" msgid="2422265656744276715">"Eslatma tovushi"</string> <string name="volume_unknown" msgid="1400219669770445902">"Tovush"</string> <string name="volume_icon_description_bluetooth" msgid="6538894177255964340">"Bluetooth tovushi"</string> - <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Rington tovushi"</string> + <string name="volume_icon_description_ringer" msgid="3326003847006162496">"Rington balandligi"</string> <string name="volume_icon_description_incall" msgid="8890073218154543397">"Qo‘ng‘iroq tovushi balandligi"</string> <string name="volume_icon_description_media" msgid="4217311719665194215">"Media tovushi balandligi"</string> <string name="volume_icon_description_notification" msgid="7044986546477282274">"Eslatma tovushi"</string> - <string name="ringtone_default" msgid="3789758980357696936">"Standart musiqa"</string> - <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standart musiqa (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> - <string name="ringtone_silent" msgid="7937634392408977062">"Yo‘q"</string> - <string name="ringtone_picker_title" msgid="3515143939175119094">"Musiqalar"</string> - <string name="ringtone_unknown" msgid="5477919988701784788">"Noma’lum musiqa"</string> + <string name="ringtone_default" msgid="3789758980357696936">"Standart rington"</string> + <string name="ringtone_default_with_actual" msgid="8129563480895990372">"Standart rington (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string> + <string name="ringtone_silent" msgid="7937634392408977062">"Ovozsiz"</string> + <string name="ringtone_picker_title" msgid="3515143939175119094">"Ringtonlar"</string> + <string name="ringtone_unknown" msgid="5477919988701784788">"Noma’lum rington"</string> <plurals name="wifi_available" formatted="false" msgid="7900333017752027322"> <item quantity="other">Wi-Fi tarmoqlari mavjud emas</item> <item quantity="one">Wi-Fi tarmog‘i mavjud emas</item> @@ -1052,7 +1053,7 @@ <string name="extmedia_format_message" product="nosdcard" msgid="3934016853425761078">"USB xotiradagi barcha fayllar o‘chirib tashlanadi. Ushbu amalni ortga qaytarib bo‘lmaydi!"</string> <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Kartadagi barcha ma`lumotlar o‘chirib tashlanadi."</string> <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string> - <string name="adb_active_notification_title" msgid="6729044778949189918">"USB nosozlikni tuzatish ulandi"</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"USB orqali nosozlikni tuzatish"</string> <string name="adb_active_notification_message" msgid="1016654627626476142">"USB orqali sozlashni o‘chirib qo‘yish uchun bosing."</string> <string name="select_input_method" msgid="8547250819326693584">"Klaviaturani o‘zgartirish"</string> <string name="configure_input_methods" msgid="4769971288371946846">"Klaviaturani tanlash"</string> @@ -1078,14 +1079,14 @@ <string name="ext_media_init_action" msgid="8317198948634872507">"Sozlash"</string> <string name="ext_media_unmount_action" msgid="1121883233103278199">"Chiqarish"</string> <string name="ext_media_browse_action" msgid="8322172381028546087">"O‘rganish"</string> - <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> qurilmasi o‘rnatilmagan"</string> - <string name="ext_media_missing_message" msgid="5761133583368750174">"Ushbu qurilmani qayta kiriting"</string> - <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ilovasi ko‘chirilmoqda"</string> + <string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> topilmadi"</string> + <string name="ext_media_missing_message" msgid="5761133583368750174">"Qurilmani qaytadan joylang"</string> + <string name="ext_media_move_specific_title" msgid="1471100343872375842">"<xliff:g id="NAME">%s</xliff:g> ko‘chirib o‘tkazilmoqda"</string> <string name="ext_media_move_title" msgid="1022809140035962662">"Ma’lumotlar ko‘chirilmoqda"</string> - <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ko‘chirish tugadi"</string> - <string name="ext_media_move_success_message" msgid="4199002148206265426">"Ma’lumotlar <xliff:g id="NAME">%s</xliff:g> xotirasiga ko‘chirildi"</string> + <string name="ext_media_move_success_title" msgid="8575300932957954671">"Ko‘chirib o‘tkazish tugadi"</string> + <string name="ext_media_move_success_message" msgid="4199002148206265426">"Ma’lumotlar <xliff:g id="NAME">%s</xliff:g> xotirasiga ko‘chirib o‘tkazildi"</string> <string name="ext_media_move_failure_title" msgid="7613189040358789908">"Ma’lumotlar ko‘chirilmadi"</string> - <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Ma’lumotlar asl joyida qoldi"</string> + <string name="ext_media_move_failure_message" msgid="1978096440816403360">"Ma’lumotlar o‘z joyida qoldi"</string> <string name="activity_list_empty" msgid="1675388330786841066">"Hech qanday mos faoliyat topilmadi."</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"Media chiqishni yo‘naltirish"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"Ilovaga media chiqish ovozini boshqa tashqi qurilmalarga yo‘naltirish uchun ruxsat beradi."</string> @@ -1113,8 +1114,8 @@ <string name="forward_intent_to_work" msgid="621480743856004612">"Siz ushbu ilovadan ishchi profilingizda foydalanmoqdasiz"</string> <string name="input_method_binding_label" msgid="1283557179944992649">"Kiritish uslubi"</string> <string name="sync_binding_label" msgid="3687969138375092423">"Sinx"</string> - <string name="accessibility_binding_label" msgid="4148120742096474641">"Qulaylik"</string> - <string name="wallpaper_binding_label" msgid="1240087844304687662">"Orqa fon"</string> + <string name="accessibility_binding_label" msgid="4148120742096474641">"Maxsus imkoniyatlar"</string> + <string name="wallpaper_binding_label" msgid="1240087844304687662">"Orqa fon rasmi"</string> <string name="chooser_wallpaper" msgid="7873476199295190279">"Fon rasmini o‘zgartirish"</string> <string name="notification_listener_binding_label" msgid="2014162835481906429">"Bildirishnoma tinglovchisi"</string> <string name="condition_provider_service_binding_label" msgid="1321343352906524564">"Shartlarni taqdim etuvchi"</string> @@ -1122,9 +1123,9 @@ <string name="vpn_title_long" msgid="6400714798049252294">"VPN <xliff:g id="APP">%s</xliff:g> tomonidan faollashtirilgan"</string> <string name="vpn_text" msgid="3011306607126450322">"Tarmoqni boshqarish uchun bosing."</string> <string name="vpn_text_long" msgid="6407351006249174473">"<xliff:g id="SESSION">%s</xliff:g>ga ulandi. Tarmoqni boshqarish uchun bosing."</string> - <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Har doim faol VPN ulanmoqda…"</string> - <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Har doim faol VPN ulangan"</string> - <string name="vpn_lockdown_error" msgid="6009249814034708175">"Har doim faol VPN’dagi xato"</string> + <string name="vpn_lockdown_connecting" msgid="6443438964440960745">"Doimiy VPN ulanmoqda…"</string> + <string name="vpn_lockdown_connected" msgid="8202679674819213931">"Doimiy VPN ulandi"</string> + <string name="vpn_lockdown_error" msgid="6009249814034708175">"Xato"</string> <string name="vpn_lockdown_config" msgid="6415899150671537970">"Sozlash uchun bosing"</string> <string name="upload_file" msgid="2897957172366730416">"Faylni tanlash"</string> <string name="no_file_chosen" msgid="6363648562170759465">"Hech qanday fayl tanlanmadi"</string> @@ -1214,8 +1215,8 @@ <string name="action_bar_home_description_format" msgid="7965984360903693903">"%1$s, %2$s"</string> <string name="action_bar_home_subtitle_description_format" msgid="6985546530471780727">"%1$s, %2$s, %3$s"</string> <string name="storage_internal" msgid="4891916833657929263">"Ichki xotira"</string> - <string name="storage_sd_card" msgid="3282948861378286745">"SD xotira kartasi"</string> - <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD kartasi"</string> + <string name="storage_sd_card" msgid="3282948861378286745">"SD-karta"</string> + <string name="storage_sd_card_label" msgid="6347111320774379257">"<xliff:g id="MANUFACTURER">%s</xliff:g> SD-kartasi"</string> <string name="storage_usb_drive" msgid="6261899683292244209">"USB xotira"</string> <string name="storage_usb_drive_label" msgid="4501418548927759953">"<xliff:g id="MANUFACTURER">%s</xliff:g> USB xotira qurilmasi"</string> <string name="storage_usb" msgid="3017954059538517278">"USB xotira"</string> @@ -1266,7 +1267,7 @@ <string name="default_media_route_name_hdmi" msgid="2450970399023478055">"HDMI"</string> <string name="default_audio_route_category_name" msgid="3722811174003886946">"Tizim"</string> <string name="bluetooth_a2dp_audio_route_name" msgid="8575624030406771015">"Bluetooth audio"</string> - <string name="wireless_display_route_description" msgid="9070346425023979651">"Simsiz ekran"</string> + <string name="wireless_display_route_description" msgid="9070346425023979651">"Simsiz monitor"</string> <string name="media_route_button_content_description" msgid="591703006349356016">"Translatsiya qilish"</string> <string name="media_route_chooser_title" msgid="1751618554539087622">"Qurilmaga ulanish"</string> <string name="media_route_chooser_title_for_remote_display" msgid="3395541745872017583">"Ekrandagi tasvirni qurilmaga uzatish"</string> @@ -1284,10 +1285,10 @@ <string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g>x<xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string> <string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", xavfsiz"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Chizmali parol unutilgan"</string> - <string name="kg_wrong_pattern" msgid="1850806070801358830">"Xato chizma paroli"</string> - <string name="kg_wrong_password" msgid="2333281762128113157">"Xato parol"</string> - <string name="kg_wrong_pin" msgid="1131306510833563801">"Xato PIN kod"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> + <string name="kg_wrong_pattern" msgid="1850806070801358830">"Chizmali kalit noto‘g‘ri"</string> + <string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string> + <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-kod noto‘g‘ri"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%1$d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Chizmali parolni chizing"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM karta PIN kodini kiriting"</string> <string name="kg_pin_instructions" msgid="2377242233495111557">"PIN kodni tering"</string> @@ -1309,18 +1310,18 @@ <string name="kg_login_invalid_input" msgid="5754664119319872197">"Foydalanuvchi nomi yoki parol xato."</string> <string name="kg_login_account_recovery_hint" msgid="5690709132841752974">"Foydalanuvchi nomingiz yoki parolingizni unutdingizmi?\n "<b>"google.com/accounts/recovery"</b>"ga tashrif buyuring."</string> <string name="kg_login_checking_password" msgid="1052685197710252395">"Hisob tekshirilmoqda…"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Chizmali parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato chizdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Siz PIN-kodni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Siz parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Siz planshet qulfini ochish uchun <xliff:g id="NUMBER_0">%d</xliff:g> marta muvaffaqiyatsiz urindingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishlardan so‘ng planshetning zavod sozlamalari tiklanadi va barcha foydalanuvchi ma’lumotlari o‘chiriladi."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"Siz televizorni qulfdan chiqarish parolini <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizda zavod sozlamalari qayta tiklanadi hamda undagi barcha ma’lumotlaringiz o‘chib ketadi."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Siz telefon qulfini ochish uchun <xliff:g id="NUMBER_0">%d</xliff:g> marta muvaffaqiyatsiz urindingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishlardan so‘ng telefonning zavod sozlamalari tiklanadi va barcha foydalanuvchi ma’lumotlari o‘chiriladi."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Planshet qulfini ochish uchun <xliff:g id="NUMBER">%d</xliff:g> marta muvaffaqiyatsiz urinib ko‘rdingiz. Planshetning hozir zavod sozlamari tiklanadi."</string> <string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"Siz televizorni qulfdan chiqarish parolini <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Endi, televizoringizda zavod sozlamalari qayta tiklanadi."</string> <string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Telefon qulfini ochish uchun <xliff:g id="NUMBER">%d</xliff:g> marta muvaffaqiyatsiz urinib ko‘rdingiz. Telefonning hozir zavod sozlamari tiklanadi."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> - <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Siz chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizni qulfdan chiqarish uchun sizda e-pochta hisobingizga kirish talab qilinadi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qaytadan urining."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> + <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. Agar uni yana <xliff:g id="NUMBER_1">%d</xliff:g> marta noto‘g‘ri kiritsangiz, televizoringizni qulfdan chiqarish uchun sizda e-pochta hisobingizga kirish talab qilinadi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng qaytadan urining."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string> <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"O‘chirish"</string> <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Ovoz balandligi tavsiya etilgan darajadan ham yuqori ko‘tarilsinmi?\n\nUzoq vaqt davomida baland ovozda tinglash eshitish qobiliyatingizga salbiy ta’sir ko‘rsatishi mumkin."</string> @@ -1430,7 +1431,7 @@ <string name="restr_pin_enter_new_pin" msgid="5959606691619959184">"Yangi PIN kod"</string> <string name="restr_pin_confirm_pin" msgid="8501523829633146239">"Yangi PIN kodni tasdiqlash"</string> <string name="restr_pin_create_pin" msgid="8017600000263450337">"Cheklovlarni o‘zgartirish uchun PIN kod yaratish"</string> - <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN kodlar bir xil emas. Qaytadan urinib ko‘ring."</string> + <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"PIN kodlar bir xil emas. Qayta urinib ko‘ring."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"PIN kod juda qisqa. Kamida 4 raqamli bo‘lishi kerak."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688"> <item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring</item> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Bo‘shatishdan oldin chizmali parol so‘ralsin"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Bo‘shatishdan oldin parol so‘ralsin"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Administratoringiz tomonidan o‘rnatilgan"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Administratoringiz tomonidan yangilandi"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Administratoringiz tomonidan o‘chirilgan"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Batareya quvvatini uzoqroq vaqtga yetkazish uchun quvvat tejash funksiyasi qurilmangiz unumdorligini kamaytiradi hamda uning tebranishi va orqa fonda internetdan foydalanishini cheklaydi. Sinxronlanishni talab qiladigan e-pochta, xabar almashinuv va boshqa ilovalar esa qachonki ularni ishga tushirganingizda yangilanadi.\n\nQurilma quvvat olayotganda quvvat tejash funksiyasi avtomatik tarzda o‘chadi."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Yig‘ish"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Bezovta qilinmasin"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Nofaol vaqt"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ish kunlari kechasi"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Dam olish kunlari"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"“<xliff:g id="THIRD_PARTY">%1$s</xliff:g>” tomonidan ovozsiz qilingan"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. U zavod sozlamalari tiklanmaguncha barqaror ishlamasligi mumkin."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Qurilmangiz bilan bog‘liq ichki muammo mavjud. Tafsilotlar uchun qurilmangiz ishlab chiqaruvchisiga murojaat qiling."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 3aae936f5153..7450aeeb7f62 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Tắt"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Ưu tiên Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Ưu tiên mạng di động"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Hỏi hình mở khóa trước khi bỏ ghim"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Hỏi mật khẩu trước khi bỏ ghim"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"Được cài đặt bởi quản trị viên của bạn"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"Được cập nhật bởi quản trị viên của bạn"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"Đã bị xóa bởi quản trị viên của bạn"</string> <string name="battery_saver_description" msgid="1960431123816253034">"Để giúp tăng tuổi thọ pin, trình tiết kiệm pin sẽ giảm hiệu suất thiết bị của bạn và hạn chế rung, dịch vụ vị trí và hầu hết dữ liệu nền. Email, nhắn tin và các ứng dụng khác dựa trên đồng bộ hóa có thể không cập nhật nếu bạn không mở chúng.\n\nTrình tiết kiệm pin tự động tắt khi thiết bị của bạn đang sạc."</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Thu gọn"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Không làm phiền"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Thời gian ngừng hoạt động"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Đêm trong tuần"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Ngày cuối tuần"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Do <xliff:g id="THIRD_PARTY">%1$s</xliff:g> tắt tiếng"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Đã xảy ra sự cố nội bộ với thiết bị của bạn và thiết bị có thể sẽ không ổn định cho tới khi bạn thiết lập lại dữ liệu ban đầu."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Đã xảy ra sự cố nội bộ với thiết bị. Hãy liên hệ với nhà sản xuất của bạn để biết chi tiết."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 14c58f68c6da..41f7648dc61b 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"关闭"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首选 WLAN"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"首选移动网络"</string> @@ -1078,22 +1079,14 @@ <string name="ext_media_init_action" msgid="8317198948634872507">"设置"</string> <string name="ext_media_unmount_action" msgid="1121883233103278199">"弹出"</string> <string name="ext_media_browse_action" msgid="8322172381028546087">"浏览"</string> - <!-- no translation found for ext_media_missing_title (620980315821543904) --> - <skip /> - <!-- no translation found for ext_media_missing_message (5761133583368750174) --> - <skip /> - <!-- no translation found for ext_media_move_specific_title (1471100343872375842) --> - <skip /> - <!-- no translation found for ext_media_move_title (1022809140035962662) --> - <skip /> - <!-- no translation found for ext_media_move_success_title (8575300932957954671) --> - <skip /> - <!-- no translation found for ext_media_move_success_message (4199002148206265426) --> - <skip /> - <!-- no translation found for ext_media_move_failure_title (7613189040358789908) --> - <skip /> - <!-- no translation found for ext_media_move_failure_message (1978096440816403360) --> - <skip /> + <string name="ext_media_missing_title" msgid="620980315821543904">"缺少<xliff:g id="NAME">%s</xliff:g>"</string> + <string name="ext_media_missing_message" msgid="5761133583368750174">"重新插入此设备"</string> + <string name="ext_media_move_specific_title" msgid="1471100343872375842">"正在移动<xliff:g id="NAME">%s</xliff:g>"</string> + <string name="ext_media_move_title" msgid="1022809140035962662">"正在移动数据"</string> + <string name="ext_media_move_success_title" msgid="8575300932957954671">"数据移动完成"</string> + <string name="ext_media_move_success_message" msgid="4199002148206265426">"数据已移到<xliff:g id="NAME">%s</xliff:g>"</string> + <string name="ext_media_move_failure_title" msgid="7613189040358789908">"无法移动数据"</string> + <string name="ext_media_move_failure_message" msgid="1978096440816403360">"数据仍保存在原来的位置"</string> <string name="activity_list_empty" msgid="1675388330786841066">"未找到匹配的活动。"</string> <string name="permlab_route_media_output" msgid="1642024455750414694">"更改媒体输出线路"</string> <string name="permdesc_route_media_output" msgid="4932818749547244346">"允许该应用将媒体输出线路更改到其他外部设备。"</string> @@ -1466,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消时要求绘制解锁图案"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消时要求输入密码"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"已由管理员安装"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"由您单位的管理员更新"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"已被管理员删除"</string> <string name="battery_saver_description" msgid="1960431123816253034">"为了延长电池的续航时间,节电助手会降低设备的性能,并限制振动、位置信息服务和大部分后台流量。对于电子邮件、聊天工具等依赖于同步功能的应用,可能要打开这类应用时才能收到新信息。\n\n节电助手会在设备充电时自动关闭。"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1492,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"收起"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"勿扰"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"休息时间"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"工作日夜间"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"周末"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"已被<xliff:g id="THIRD_PARTY">%1$s</xliff:g>设为静音"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"您的设备内部出现了问题。如果不将设备恢复出厂设置,设备运行可能会不稳定。"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"您的设备内部出现了问题。请联系您的设备制造商了解详情。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 1635e27a6345..bf7d8caa3f50 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"首選 Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"首選流動數據"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消固定時必須畫出解鎖圖案"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消固定時必須輸入密碼"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"已由管理員安裝"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"已由您的管理員更新"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"已由管理員刪除"</string> <string name="battery_saver_description" msgid="1960431123816253034">"節約電池用量模式有助於延長電池壽命,但這會降低裝置效能,並限制震動、定位服務及大部分背景數據傳輸。除非您啟用,否則電郵、短訊及其他需要使用同步功能的應用程式均不會更新。\n\n當裝置充電時,節約電池用量模式會自動關閉。"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"請勿干擾"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"休息時間"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"星期一至星期五晚"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"靜音設定者:<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"您裝置的系統發生問題,回復原廠設定後即可解決該問題。"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"您裝置的系統發生問題,請聯絡您的製造商瞭解詳情。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 61d319b9a3f1..917748294824 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"關閉"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Wi-Fi 優先"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"行動通訊優先"</string> @@ -1458,8 +1459,7 @@ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消固定時必須畫出解鎖圖形"</string> <string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消固定時必須輸入密碼"</string> <string name="package_installed_device_owner" msgid="8420696545959087545">"已由管理員安裝"</string> - <!-- no translation found for package_updated_device_owner (8856631322440187071) --> - <skip /> + <string name="package_updated_device_owner" msgid="8856631322440187071">"由您的管理員更新"</string> <string name="package_deleted_device_owner" msgid="7650577387493101353">"已遭管理員刪除"</string> <string name="battery_saver_description" msgid="1960431123816253034">"節約耗電量模式會透過降低裝置效能、震動限制、定位服務限制和大多數背景資料運作限制等方式,延長電池續航力。此外,如果未開啟電子郵件、簡訊和其他需要使用同步功能的應用程式,系統將不會自動更新這些應用程式。\n\n當您為裝置充電時,節約耗電量模式會自動關閉。"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> @@ -1484,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"收合"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"零打擾"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"停機"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"週一至週五夜間"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"週末"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"由 <xliff:g id="THIRD_PARTY">%1$s</xliff:g> 設為靜音"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"您的裝置發生內部問題,必須將裝置恢復原廠設定才能解除不穩定狀態。"</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"您的裝置發生內部問題,詳情請洽裝置製造商。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index d3f84827c4e4..822d84269d05 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -129,6 +129,7 @@ <string-array name="wfcOperatorErrorNotificationMessages"> </string-array> <string name="wfcSpnFormat" msgid="8211621332478306568">"%s"</string> + <string name="wfcDataSpnFormat" msgid="1118052028767666883">"%s"</string> <string name="wifi_calling_off_summary" msgid="8720659586041656098">"Valiwe"</string> <string name="wfc_mode_wifi_preferred_summary" msgid="1994113411286935263">"Kuncanyelwa i-Wi-Fi"</string> <string name="wfc_mode_cellular_preferred_summary" msgid="5920549484600758786">"Kuncanyelwa iselula"</string> @@ -1483,8 +1484,12 @@ <string name="toolbar_collapse_description" msgid="2821479483960330739">"Goqa"</string> <string name="zen_mode_feature_name" msgid="5254089399895895004">"Ungaphazamisi"</string> <string name="zen_mode_downtime_feature_name" msgid="2626974636779860146">"Isikhathi sokuphumula"</string> - <string name="zen_mode_default_weeknights_name" msgid="2069189413656431610">"Ubusuku beviki"</string> - <string name="zen_mode_default_weekends_name" msgid="2377398437072017011">"Izimpelasonto"</string> + <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) --> + <skip /> + <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) --> + <skip /> + <!-- no translation found for zen_mode_default_events_name (8158334939013085363) --> + <skip /> <string name="muted_by" msgid="6147073845094180001">"Ithuliswe ngu-<xliff:g id="THIRD_PARTY">%1$s</xliff:g>"</string> <string name="system_error_wipe_data" msgid="6608165524785354962">"Kukhona inkinga yangaphakathi ngedivayisi yakho, futhi ingase ibe engazinzile kuze kube yilapho usetha kabusha yonke idatha."</string> <string name="system_error_manufacturer" msgid="8086872414744210668">"Kukhona inkinga yangaphakathi ngedivayisi yakho. Xhumana nomkhiqizi wakho ukuze uthole imininingwane."</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 1c4b5f7ec7c8..0b96d22eb495 100644 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -2347,11 +2347,6 @@ be saved. --> <attr name="saveEnabled" format="boolean" /> - <!-- If true, no {@link android.view.ViewAssistStructure} data will be collected from - this view or any of its children. The default is false, allowing assist structure - to be reported by it. --> - <attr name="assistBlocked" format="boolean" /> - <!-- Specifies whether to filter touches when the view's window is obscured by another visible window. When set to true, the view will not receive touches whenever a toast, dialog or other window appears above the view's window. @@ -5877,16 +5872,9 @@ </declare-styleable> <!-- @hide For internal use only. Use only as directed. --> - <declare-styleable name="EpicenterClipReveal"> - <attr name="centerClipBounds" format="boolean" /> + <declare-styleable name="EpicenterTranslateClipReveal"> <attr name="interpolatorX" format="reference" /> <attr name="interpolatorY" format="reference" /> - </declare-styleable> - - <!-- @hide For internal use only. Use only as directed. --> - <declare-styleable name="EpicenterTranslate"> - <attr name="interpolatorX" /> - <attr name="interpolatorY" /> <attr name="interpolatorZ" format="reference" /> </declare-styleable> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index b9825c534705..7f8c460bda4c 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -174,4 +174,6 @@ <color name="Pink_800">#ffad1457</color> <color name="Red_700">#ffc53929</color> <color name="Red_800">#ffb93221</color> + + <color name="chooser_service_row_background_color">#fff5f5f5</color> </resources> diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index bbba712c81a1..84747f13cbb4 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -391,7 +391,7 @@ <dimen name="floating_toolbar_overflow_side_padding">18dp</dimen> <dimen name="floating_toolbar_text_size">14sp</dimen> <dimen name="floating_toolbar_menu_button_minimum_width">48dp</dimen> - <dimen name="floating_toolbar_default_width">264dp</dimen> + <dimen name="floating_toolbar_preferred_width">328dp</dimen> <dimen name="floating_toolbar_minimum_overflow_height">144dp</dimen> <dimen name="floating_toolbar_horizontal_margin">16dp</dimen> <dimen name="floating_toolbar_vertical_margin">8dp</dimen> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 297b30272d7e..e403a166034c 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -2682,7 +2682,9 @@ <!-- NFC CardEmulation: dynamically load service resources --> <public type="attr" name="dynamicResources" /> - <public type="attr" name="assistBlocked" /> + <attr name="__reserved0" format="boolean" /> + <public type="attr" name="__reserved0" /> + <public type="attr" name="stylusButtonPressable" /> <public type="attr" name="supportsLaunchVoiceAssistFromKeyguard" /> <public type="attr" name="scrollIndicators" /> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 55b32e1e31ee..5b564e16711d 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -533,7 +533,7 @@ <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_contacts">Contacts</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_contacts">access and modify your contacts</string> + <string name="permgroupdesc_contacts">access your contacts</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_location">Location</string> @@ -548,12 +548,12 @@ <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_calendar">Calendar</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_calendar">access and modify your calendar</string> + <string name="permgroupdesc_calendar">access your calendar</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_sms">SMS</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_sms">access and modify SMS</string> + <string name="permgroupdesc_sms">view and manage SMS messages</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_dictionary">User Dictionary</string> @@ -568,22 +568,22 @@ <!-- Title of a category of application permissioncds, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_microphone">Microphone</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_microphone">use device microphone</string> + <string name="permgroupdesc_microphone">record audio</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_camera">Camera</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_camera">use device camera</string> + <string name="permgroupdesc_camera">take pictures and record video</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_phone">Phone</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_phone">use device telephony</string> + <string name="permgroupdesc_phone">make and manage phone calls</string> <!-- Title of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> <string name="permgrouplab_sensors">Sensors</string> <!-- Description of a category of application permissions, listed so the user can choose whether they want to allow the application to do this. --> - <string name="permgroupdesc_sensors">access sensors and wearables</string> + <string name="permgroupdesc_sensors">access data from sensors and wearable devices</string> <!-- Title for the capability of an accessibility service to retrieve window content. --> <string name="capability_title_canRetrieveWindowContent">Retrieve window content</string> @@ -4068,10 +4068,13 @@ <string name="zen_mode_downtime_feature_name">Downtime</string> <!-- Zen mode - name of default automatic schedule for weeknights. [CHAR LIMIT=40] --> - <string name="zen_mode_default_weeknights_name">Weeknights</string> + <string name="zen_mode_default_weeknights_name">Weeknight</string> <!-- Zen mode - name of default automatic schedule for weekends. [CHAR LIMIT=40] --> - <string name="zen_mode_default_weekends_name">Weekends</string> + <string name="zen_mode_default_weekends_name">Weekend</string> + + <!-- Zen mode - name of default automatic calendar event-based rule. [CHAR LIMIT=40] --> + <string name="zen_mode_default_events_name">Event</string> <!-- Indication that the current volume and other effects (vibration) are being suppressed by a third party, such as a notification listener. [CHAR LIMIT=30] --> <string name="muted_by">Muted by <xliff:g id="third_party">%1$s</xliff:g></string> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 28ffbfa18352..e54a0b2754ac 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2065,6 +2065,7 @@ <java-symbol type="string" name="zen_mode_downtime_feature_name" /> <java-symbol type="string" name="zen_mode_default_weeknights_name" /> <java-symbol type="string" name="zen_mode_default_weekends_name" /> + <java-symbol type="string" name="zen_mode_default_events_name" /> <java-symbol type="array" name="config_system_condition_providers" /> <java-symbol type="string" name="muted_by" /> @@ -2240,7 +2241,7 @@ <java-symbol type="dimen" name="floating_toolbar_overflow_side_padding" /> <java-symbol type="dimen" name="floating_toolbar_text_size" /> <java-symbol type="dimen" name="floating_toolbar_menu_button_minimum_width" /> - <java-symbol type="dimen" name="floating_toolbar_default_width" /> + <java-symbol type="dimen" name="floating_toolbar_preferred_width" /> <java-symbol type="dimen" name="floating_toolbar_minimum_overflow_height" /> <java-symbol type="dimen" name="floating_toolbar_horizontal_margin" /> <java-symbol type="dimen" name="floating_toolbar_vertical_margin" /> @@ -2256,4 +2257,8 @@ <java-symbol type="id" name="day_picker_view_pager" /> <java-symbol type="layout" name="day_picker_content_material" /> <java-symbol type="drawable" name="scroll_indicator_material" /> + + <java-symbol type="layout" name="chooser_row" /> + <java-symbol type="color" name="chooser_service_row_background_color" /> + <java-symbol type="id" name="target_badge" /> </resources> diff --git a/core/tests/coretests/src/android/util/FloatMathTest.java b/core/tests/coretests/src/android/util/FloatMathTest.java deleted file mode 100644 index f479e2b45f30..000000000000 --- a/core/tests/coretests/src/android/util/FloatMathTest.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2007 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.util; - -import junit.framework.TestCase; -import android.test.suitebuilder.annotation.SmallTest; - -public class FloatMathTest extends TestCase { - - @SmallTest - public void testSqrt() { - assertEquals(7, FloatMath.sqrt(49), 0); - assertEquals(10, FloatMath.sqrt(100), 0); - assertEquals(0, FloatMath.sqrt(0), 0); - assertEquals(1, FloatMath.sqrt(1), 0); - } - - @SmallTest - public void testFloor() { - assertEquals(78, FloatMath.floor(78.89f), 0); - assertEquals(-79, FloatMath.floor(-78.89f), 0); - } - - @SmallTest - public void testCeil() { - assertEquals(79, FloatMath.ceil(78.89f), 0); - assertEquals(-78, FloatMath.ceil(-78.89f), 0); - } - - @SmallTest - public void testSin() { - assertEquals(0.0, FloatMath.sin(0), 0); - assertEquals(0.8414709848078965f, FloatMath.sin(1), 0); - } - - @SmallTest - public void testCos() { - assertEquals(1.0f, FloatMath.cos(0), 0); - assertEquals(0.5403023058681398f, FloatMath.cos(1), 0); - } -} diff --git a/core/tests/coretests/src/com/android/internal/util/CallbackRegistryTest.java b/core/tests/coretests/src/com/android/internal/util/CallbackRegistryTest.java new file mode 100644 index 000000000000..c53f4cc7ee52 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/util/CallbackRegistryTest.java @@ -0,0 +1,305 @@ +/* + * Copyright (C) 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. + */ +package com.android.internal.util; + +import junit.framework.TestCase; + +import org.junit.Test; + +import java.util.ArrayList; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class CallbackRegistryTest extends TestCase { + + final Integer callback1 = 1; + final Integer callback2 = 2; + final Integer callback3 = 3; + CallbackRegistry<Integer, CallbackRegistryTest, Integer> registry; + int notify1; + int notify2; + int notify3; + int[] deepNotifyCount = new int[300]; + Integer argValue; + + private void addNotifyCount(Integer callback) { + if (callback == callback1) { + notify1++; + } else if (callback == callback2) { + notify2++; + } else if (callback == callback3) { + notify3++; + } + deepNotifyCount[callback]++; + } + + public void testAddListener() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg, Integer arg2) { + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + Integer callback = 0; + + assertNotNull(registry.copyListeners()); + assertEquals(0, registry.copyListeners().size()); + + registry.add(callback); + ArrayList<Integer> callbacks = registry.copyListeners(); + assertEquals(1, callbacks.size()); + assertEquals(callback, callbacks.get(0)); + + registry.add(callback); + callbacks = registry.copyListeners(); + assertEquals(1, callbacks.size()); + assertEquals(callback, callbacks.get(0)); + + Integer otherListener = 1; + registry.add(otherListener); + callbacks = registry.copyListeners(); + assertEquals(2, callbacks.size()); + assertEquals(callback, callbacks.get(0)); + assertEquals(otherListener, callbacks.get(1)); + + registry.remove(callback); + registry.add(callback); + callbacks = registry.copyListeners(); + assertEquals(2, callbacks.size()); + assertEquals(callback, callbacks.get(1)); + assertEquals(otherListener, callbacks.get(0)); + } + + public void testSimpleNotify() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + assertEquals(arg1, (int) arg); + addNotifyCount(callback); + argValue = arg; + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + registry.add(callback2); + Integer arg = 1; + registry.notifyCallbacks(this, arg, arg); + assertEquals(arg, argValue); + assertEquals(1, notify2); + } + + public void testRemoveWhileNotifying() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + if (callback == callback1) { + registry.remove(callback1); + registry.remove(callback2); + } + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + registry.add(callback1); + registry.add(callback2); + registry.add(callback3); + registry.notifyCallbacks(this, 0, null); + assertEquals(1, notify1); + assertEquals(1, notify2); + assertEquals(1, notify3); + + ArrayList<Integer> callbacks = registry.copyListeners(); + assertEquals(1, callbacks.size()); + assertEquals(callback3, callbacks.get(0)); + } + + public void testDeepRemoveWhileNotifying() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + registry.remove(callback); + registry.notifyCallbacks(CallbackRegistryTest.this, arg1, null); + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + registry.add(callback1); + registry.add(callback2); + registry.add(callback3); + registry.notifyCallbacks(this, 0, null); + assertEquals(1, notify1); + assertEquals(2, notify2); + assertEquals(3, notify3); + + ArrayList<Integer> callbacks = registry.copyListeners(); + assertEquals(0, callbacks.size()); + } + + public void testAddRemovedListener() { + + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + if (callback == callback1) { + registry.remove(callback2); + } else if (callback == callback3) { + registry.add(callback2); + } + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + + registry.add(callback1); + registry.add(callback2); + registry.add(callback3); + registry.notifyCallbacks(this, 0, null); + + ArrayList<Integer> callbacks = registry.copyListeners(); + assertEquals(3, callbacks.size()); + assertEquals(callback1, callbacks.get(0)); + assertEquals(callback3, callbacks.get(1)); + assertEquals(callback2, callbacks.get(2)); + assertEquals(1, notify1); + assertEquals(1, notify2); + assertEquals(1, notify3); + } + + public void testVeryDeepRemoveWhileNotifying() { + final Integer[] callbacks = new Integer[deepNotifyCount.length]; + for (int i = 0; i < callbacks.length; i++) { + callbacks[i] = i; + } + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + registry.remove(callback); + registry.remove(callbacks[callbacks.length - callback - 1]); + registry.notifyCallbacks(CallbackRegistryTest.this, arg1, null); + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + for (int i = 0; i < callbacks.length; i++) { + registry.add(callbacks[i]); + } + registry.notifyCallbacks(this, 0, null); + for (int i = 0; i < deepNotifyCount.length; i++) { + int expectedCount = Math.min(i + 1, deepNotifyCount.length - i); + assertEquals(expectedCount, deepNotifyCount[i]); + } + + ArrayList<Integer> callbackList = registry.copyListeners(); + assertEquals(0, callbackList.size()); + } + + public void testClear() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + for (int i = 0; i < deepNotifyCount.length; i++) { + registry.add(i); + } + registry.clear(); + + ArrayList<Integer> callbackList = registry.copyListeners(); + assertEquals(0, callbackList.size()); + + registry.notifyCallbacks(this, 0, null); + for (int i = 0; i < deepNotifyCount.length; i++) { + assertEquals(0, deepNotifyCount[i]); + } + } + + public void testNestedClear() { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg1, Integer arg) { + addNotifyCount(callback); + registry.clear(); + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + for (int i = 0; i < deepNotifyCount.length; i++) { + registry.add(i); + } + registry.notifyCallbacks(this, 0, null); + for (int i = 0; i < deepNotifyCount.length; i++) { + assertEquals(1, deepNotifyCount[i]); + } + + ArrayList<Integer> callbackList = registry.copyListeners(); + assertEquals(0, callbackList.size()); + } + + public void testIsEmpty() throws Exception { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg, Integer arg2) { + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + Integer callback = 0; + + assertTrue(registry.isEmpty()); + registry.add(callback); + assertFalse(registry.isEmpty()); + } + + public void testClone() throws Exception { + CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer> notifier = + new CallbackRegistry.NotifierCallback<Integer, CallbackRegistryTest, Integer>() { + @Override + public void onNotifyCallback(Integer callback, CallbackRegistryTest sender, + int arg, Integer arg2) { + } + }; + registry = new CallbackRegistry<Integer, CallbackRegistryTest, Integer>(notifier); + + assertTrue(registry.isEmpty()); + CallbackRegistry<Integer, CallbackRegistryTest, Integer> registry2 = registry.clone(); + Integer callback = 0; + registry.add(callback); + assertFalse(registry.isEmpty()); + assertTrue(registry2.isEmpty()); + registry2 = registry.clone(); + assertFalse(registry2.isEmpty()); + } +} diff --git a/docs/html/design/building-blocks/buttons.jd b/docs/html/design/building-blocks/buttons.jd deleted file mode 100644 index 713574a6cb49..000000000000 --- a/docs/html/design/building-blocks/buttons.jd +++ /dev/null @@ -1,99 +0,0 @@ -page.title=Buttons -page.tags=button,input -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/buttons.html"> - <div> - <h3>Material Design</h3> - <p>Buttons<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/button.html"> - <div> - <h3>Developer Docs</h3> - <p>Buttons</p> - </div> -</a> - -<p itemprop="description">A button consists of text and/or an image that clearly communicates what action - will occur when the user touches it. A button can have an image, text, or both. -</p> - -<div class="cols" style="margin-top:22px"> - <div class="col-3"> - <img src="{@docRoot}design/media/icon_magnifying_glass.png" style="height:64px;padding:20px 0 0 40px;"> - </div> - <div class="col-3"> - <img src="{@docRoot}design/media/buttons_text.png" style="height:94px;"> - </div> - <div class="col-7"> - <img src="{@docRoot}design/media/buttons_image_and_text.png" style="height:94px;"> - </div> -</div> - -<div class="cols" style="margin-top:0;"> - <div class="col-3"> - <p>An image alone works best when the action can be represented by a symbol that's well understood.</p> - </div> - <div class="col-3"> - <p>Text alone is most appropriate for actions that would be difficult to - represent visually, or are critical to convey in words to avoid any ambiguity.</p> - </div> - <div class="col-7"> - <p> - Both an icon and text is most appropriate when they complement each other: - each carrying its own bit of information, but together making a larger whole. - </p> - - <p> - For example, in a birthday reminder card in Google Now, the button's text - describes the action while its image indicates that the action will be done - in Google+. - </p> - </div> -</div> - -<h3>What about button backgrounds?</h3> - -<div class="cols"> - <div class="col-6"> - <p>For <strong>image-only</strong> buttons, a background isn't necessary because - users are accustomed to interacting with objects.</p> - - <div class="cols" style="margin-left:72px"> - <div class="col-2"> - <div class="do-dont-label bad emulate-content-left-padding" style="width:30px">Don't</div> - <img src="{@docRoot}design/media/buttons_image_bg_dont.png" style="padding-left:14px;"> - </div> - <div class="col-2" style="width:29px;margin-left:10px;"> - <div class="do-dont-label good"><strong>Do</strong></div> - <img src="{@docRoot}design/media/icon_alarm.png" style="width:31px;padding-top:7px;"> - </div> - </div> - </div> - -<div class="col-7"> -<p> - For buttons <strong>with text</strong>, a background is also usually - unnecessary. To invite users to touch, phrase it as a clear action (e.g. - "Start", "Sign in") and use different color and formatting than the screen's - usual body text. -</p> - -<p> - Use buttons with backgrounds sparingly. Because they have a heavy appearance, - they work best when there's only one or two of them on the screen. They're - most appropriate for: -</p> - -<ul> - <li>A call to action you really want users to pursue (e.g. "Sign up")</li> - <li>A key decision point (e.g. "Accept" / "Decline")</li> - <li>When the user is about to commit a significant action (e.g. "Erase - everything", "Buy now")</li> -</ul> -</div> -</div> - diff --git a/docs/html/design/building-blocks/dialogs.jd b/docs/html/design/building-blocks/dialogs.jd deleted file mode 100644 index 70460bac917a..000000000000 --- a/docs/html/design/building-blocks/dialogs.jd +++ /dev/null @@ -1,186 +0,0 @@ -page.title=Dialogs -page.tags=dialog,alert,popup,toast -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/dialogs.html"> - <div> - <h3>Material Design</h3> - <p>Dialogs<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/dialogs.html"> - <div> - <h3>Developer Docs</h3> - <p>Dialogs</p> - </div> -</a> - -<p itemprop="description">Dialogs prompt the user for decisions or additional information required by the app to continue a -task. Such requests can range from simple Cancel/OK decisions to more complex layouts asking the -user to adjust settings or enter text.</p> - -<img src="{@docRoot}design/media/dialogs_main.png"> - -<div class="with-callouts"> - -<ol> - <li> - <h4>Optional title region</h4> - <p>The title introduces the content of your dialog. It can, for example, identify the name of a - setting that the user is about to change, or request a decision.</p> - </li> - <li> - <h4>Content area</h4> - <p>Dialog content varies widely. For settings dialogs, a dialog may contain UI elements such as - sliders, text fields, checkboxes, or radio buttons that allow the user to change app or system - settings. In other cases, such as alerts, the content may consist solely of text that provides - further context for a user decision.</p> - </li> - - <li> - <h4>Action buttons</h4> - <p>Action buttons are typically Cancel and/or OK, with OK indicating the preferred or most likely action. However, if the options consist of specific actions such as Close or Wait rather than a confirmation or cancellation of the action described in the content, then all the buttons should be active verbs. Order actions following these rules:</p> - <ul> - - <li>The dismissive action of a dialog is always on the left. Dismissive actions return to the user to the previous state.</li> - <li>The affirmative actions are on the right. Affirmative actions continue progress toward the user goal that triggered the dialog.</li> - </ul> - </li> -</ol> -</div> - -<img src="{@docRoot}design/media/dialogs_examples.png"> -<div class="figure-caption"> - Samples of typical dialog use in Android. -</div> - -<h2 id="alerts">Alerts</h2> - -<p>Alerts inform the user about a situation that requires their confirmation or acknowledgement before -proceeding. They differ slightly in appearance based upon the severity and impact of the message -conveyed.</p> - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/dialogs_w_no_title.png"> - - </div> - <div class="col-5"> - -<h4>Alerts without title bars</h4> -<p>Most alerts don't need titles. Usually the decision doesn't have a severe impact and can be summed -up succinctly in a sentence or two. The content area should either ask a question (such as "Delete -this conversation?") or make a clear statement whose relationship to the action buttons is obvious.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/dialogs_w_title.png"> - - </div> - <div class="col-5"> - -<h4>Alerts with title bars</h4> -<p>Use alerts with title bars sparingly. They are appropriate only when a high-risk operation involving -potential loss of data, connectivity, extra charges, and so on requires a clear question or -statement (the title) and some additional explanation (in the content area).</p> -<p>Keep the question or statement short: for example, "Erase USB storage?" Avoid apologies. A user -should be able to skip the content completely and still have a clear idea of what choices are -available based on the title and the text of the action buttons.</p> - - </div> -</div> -<p>When crafting a confirmation dialog, make the title meaningful by echoing the requested action.</p> - -<div class="cols"> - <div class="col-4"> - <div class="do-dont-label bad">Don't</div> - <table class="ui-table bad"> - <thead> - <tr> - <th class="label"> - Are you sure? - </th> - </tr> - </thead> - </table> - </div> - <div class="col-4"> - <div class="do-dont-label bad">Don't</div> - <table class="ui-table bad"> - <thead> - <tr> - <th class="label"> - Warning! - </th> - </tr> - </thead> - </table> - </div> - <div class="col-5"> - <div class="do-dont-label good">Do</div> - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - Erase USB storage? - </th> - </tr> - </thead> - </table> - </div> -</div> - - -<h2 id="popups">Popups</h2> - -<p>Popups are lightweight version of dialogs that require a single selection from the user. Popups -don't have have explicit buttons that accept or cancel the operation. Instead, making a selection -advances the workflow, and simply touching outside the popup dismisses it.</p> - -<img src="{@docRoot}design/media/dialogs_popups_example.png"> - - -<h2 id="toasts">Toasts</h2> - - -<div class="cols"> - <div class="col-6"> - - <div class="vspace size-3"></div> - -<p>Toasts provide lightweight feedback about an operation in a small popup. For example, navigating -away from an email before you send it triggers a "Draft saved" toast to let you know that you can -continue editing later. Toasts automatically disappear after a timeout.</p> - -<a class="notice-designers-material left" - href="http://www.google.com/design/spec/components/snackbars-toasts.html"> - <div> - <h3>Material Design</h3> - <p>Toasts<p> - </div> -</a> - - -<a class="notice-developers left" href="{@docRoot}guide/topics/ui/notifiers/toasts.html"> - <div> - <h3>Developer Docs</h3> - <p>Toasts</p> - </div> -</a> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/dialogs_toasts.png"> - - </div> -</div> - diff --git a/docs/html/design/building-blocks/grid-lists.jd b/docs/html/design/building-blocks/grid-lists.jd deleted file mode 100644 index 7a1c65254a8c..000000000000 --- a/docs/html/design/building-blocks/grid-lists.jd +++ /dev/null @@ -1,96 +0,0 @@ -page.title=Grid Lists -page.tags=gridview,layout,listview -@jd:body - -<img src="{@docRoot}design/media/gridview_overview.png"> - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/grid-lists.html"> - <div> - <h3>Material Design</h3> - <p>Grid lists<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/layout/gridview.html"> - <div> - <h3>Developer Docs</h3> - <p>Grid View</p> - </div> -</a> - -<p itemprop="description">Grid lists are an alternative to standard list views. They are best suited for showing data sets -that represent themselves through images. In contrast to simple lists, grid lists may scroll either -vertically or horizontally.</p> - - - -<h2 id="generic_grid">Generic Grids</h2> - - -<p>The items in a grid list are arranged in two dimensions, one of which is fixed when scrolling -content. The scrolling direction dictates the ordering of the items within the grid list. Since the -scrolling direction is not deterministic, make it easy for the user to determine the orientation by -cutting off grid items to communicate where the overflow is located.</p> -<p>Avoid creating grid lists that scroll in two dimensions.</p> - - -<div class="cols"> - <div class="col-7"> - - <img src="{@docRoot}design/media/gridview_vertical.png"> - - </div> - <div class="col-6"> - -<h4>Vertical scrolling</h4> -<p>Vertically scrolling grid list items are sorted in traditional western reading direction: -left-to-right and top-down. When displaying the list, cut off the items in the bottom row to -communicate that the user can scroll the list down to show additional items. Be sure to retain this -scheme when the user rotates the screen.</p> - - </div> -</div> - -<div class="cols"> - <div class="col-7"> - - <img src="{@docRoot}design/media/gridview_horizontal.png"> - - </div> - <div class="col-6"> - -<h4>Horizontal scrolling</h4> -<p>Horizontally scrolling lists fix the vertical axis of the item grid. Compared to vertically -scrolling lists, the sorting changes slightly to a top-down and left-to-right arrangement. Employ -the same technique of cutting off the items in the rightmost column to indicate the scrolling -direction.</p> -<p>Don't use scrolling tabs as a means to switch views in conjunction with horizontally scrolling grid -lists, because the horizontal gesture for view and content navigation will conflict. If you show -scrolling tabs for view navigation together with a grid list, use vertical grid scrolling for list -navigation.</p> - - </div> -</div> - - -<h2 id="with-labels">Grid List with Labels</h2> - -<p>Use labels to display additional contextual information for your grid list items.</p> - - -<div class="cols"> - <div class="col-7"> - - <img src="{@docRoot}design/media/gridview_style.png"> - - </div> - <div class="col-6"> - -<h4>Style</h4> -<p>Use semi-transparent panels on top of the grid list items to display your labels. This allows you to -control the contrast and ensures legibility of the labels while letting the content "shine through".</p> - - </div> -</div> diff --git a/docs/html/design/building-blocks/index.jd b/docs/html/design/building-blocks/index.jd deleted file mode 100644 index 7fb0e553be37..000000000000 --- a/docs/html/design/building-blocks/index.jd +++ /dev/null @@ -1,30 +0,0 @@ -page.title=Building Blocks -header.justLinks=1 -footer.hide=1 -@jd:body - -<style> -#landing-graphic-container { - position: relative; -} - -#text-overlay { - position: absolute; - left: 0; - top: 520px; - width: 450px; -} -</style> - -<div id="landing-graphic-container"> - <div id="text-overlay"> - <span itemprop="description">Your inventory of ready-to-use elements for creating - outstanding apps.</span> - <br><br> - <a href="{@docRoot}design/building-blocks/tabs.html" class="landing-page-link">Tabs</a> - </div> - - <a href="{@docRoot}design/building-blocks/tabs.html"> - <img src="{@docRoot}design/media/building_blocks_landing.png"> - </a> -</div> diff --git a/docs/html/design/building-blocks/lists.jd b/docs/html/design/building-blocks/lists.jd deleted file mode 100644 index 85753c826abe..000000000000 --- a/docs/html/design/building-blocks/lists.jd +++ /dev/null @@ -1,56 +0,0 @@ -page.title=Lists -page.tags=listview,layout -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/lists.html"> - <div> - <h3>Material Design</h3> - <p>Lists<p> - </div> -</a> - -<p itemprop="description">Lists present multiple line items in a vertical arrangement. They can be used for data selection as -well as drilldown navigation.</p> - -<div class="vspace size-1"> </div> - -<div class="cols clearfix"> - <div class="col-9"> - - <img src="{@docRoot}design/media/lists_main.png"> - - </div> - <div class="col-4 with-callouts"> - -<ol style="margin-bottom: 60px;"> -<li> -<h4>Section Divider</h4> -<p>Use section dividers to organize the content of your list into groups and facilitate scanning.</p> -</li> -<li> -<h4>Line Items</h4> -<p>List items can accommodate a wide range of data types in different arrangements, including - simple single-line items, multi-line items, and custom items with icons, checkboxes, and action - buttons.</p> -</li> -</ol> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/layout/listview.html"> - <div> - <h3>Developer Docs</h3> - <p>List View</p> - </div> -</a> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/lists-controls.html"> - <div> - <h3>Material Design</h3> - <p>Lists: Controls<p> - </div> -</a> - - - </div> -</div> diff --git a/docs/html/design/building-blocks/pickers.jd b/docs/html/design/building-blocks/pickers.jd deleted file mode 100644 index 72da0f7fed4b..000000000000 --- a/docs/html/design/building-blocks/pickers.jd +++ /dev/null @@ -1,40 +0,0 @@ -page.title=Pickers -page.tags=datepicker,timepicker -@jd:body - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/pickers.html"> - <div> - <h3>Developer Docs</h3> - <p>Pickers</p> - </div> -</a> - -<p itemprop="description">Pickers provide a simple way to select a single value from a set. In addition to touching the -up/down arrow buttons, it's possible to set the desired value from the keyboard or via a swipe -gesture.</p> - -<div class="cols"> - <div class="col-6"> - - <img src="{@docRoot}design/media/picker_space.png"> - - </div> - <div class="col-6"> - -<h4>Space considerations</h4> -<p>Pickers can be used inline on a form, but their relatively large footprint is best suited for -display in a dialog. For inline display, consider using more compact controls such as text fields or -spinners.</p> - - </div> -</div> - -<h2 id="date-time">Date and time pickers</h2> - -<p>Android provides these as ready-to-use dialogs. Each picker is a dialog with a set of controls for -entering the parts of the date (month, day, year) or time (hour, minute, AM/PM). Using these in your -app helps ensure that a user's specification of a data or time input is valid and formatted -correctly. The format of a time and date picker adjusts automatically to the locale.</p> - -<img src="{@docRoot}design/media/picker_datetime.png"> - diff --git a/docs/html/design/building-blocks/progress.jd b/docs/html/design/building-blocks/progress.jd deleted file mode 100644 index ae81440fef1e..000000000000 --- a/docs/html/design/building-blocks/progress.jd +++ /dev/null @@ -1,105 +0,0 @@ -page.title=Progress & Activity -page.tags=progressbar,download,network -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/progress-activity.html"> - <div> - <h3>Material Design</h3> - <p>Progress and Activity<p> - </div> -</a> - -<p>Progress bars and activity indicators signal to users that something is happening that will take a moment.</p> -<h2 id="progress">Progress bars</h2> - -<p>Progress bars are for situations where the percentage completed can be determined. They give users a quick sense of how much longer an operation will take.</p> - -<img src="{@docRoot}design/media/progress_download.png"> - -<p>A progress bar should always fill from 0% to 100% and never move backwards to a lower value. If multiple operations are happening in sequence, use the progress bar to represent the delay as a whole, so that when the bar reaches 100%, it doesn't return back to 0%.</p> - -<div class="vspace size-2"> </div> - -<img src="{@docRoot}design/media/progress_themes.png"> -<div class="figure-caption"> - Progress bar in Holo Dark and Holo Light. -</div> - -<h2 id="activity">Activity indicators</h2> - -<p>Activity indicators are for operations of an indeterminate length. They ask users to wait a moment while something finishes up, without getting into specifics about what's happening behind the scenes.</p> - -<p>Two styles are available: a bar and a circle. Each is offered in a variety of sizes, in both Holo Light and Holo Dark themes. Choose the appropriate style and size for the surrounding context. For example, the largest activity circle works well when displayed in a blank content area, but not in a smaller dialog box. Each operation should only be represented by one activity indicator.</p> - -<div class="cols"> - <div class="col-6"> - - <img src="{@docRoot}design/media/progress_activity.png"> - - </div> - <div class="col-7 with-callouts"> - - <ol> - <li class="value-1"><h4>Activity bar</h4> - <p>In this example, an activity bar (in Holo Dark) appears when a user first requests a download. There's an unknown period of time when the download has not yet started. As soon as the download starts, this activity bar transforms into a progress bar.</p> - </li> - </ol> - - </div> -</div> - -<div class="cols"> - <div class="col-6"> - - <img src="{@docRoot}design/media/progress_activity2.png"> - - </div> - <div class="col-7 with-callouts"> - - <ol> - <li class="value-2"><h4>Activity circle</h4> - <p>In this example, an activity circle (in Holo Light) is used in the Gmail application when a message is being loaded because it's not possible to determine how long it will take to download the email.</p> - <p>When displaying an activity circle, do not include text to communicate what the app is doing. The moving circle alone provides sufficient feedback about the delay, and does so in an understated way that minimizes the impact.</p> - <p> - <div style="margin-left:0;margin-top:1em;"> - <img src="{@docRoot}design/media/progress_activity_do_dont.png"> - </div> - </p> - </li> - </ol> - - </div> -</div> - -<h2 id="custom-indicators">Custom indicators</h2> -<p>The standard progress bar and activity indicators work well for most situations and should be used whenever possible to provide a consistent experience across Android. However, some situations may call for something more custom.</p> - -<p>Here's an example:<br> -In all of the Google Play apps (Music, Books, Movies, Magazines), we wanted the current download state of each item to be visible at all times at the top-level screen. These states are: - <ul> - <li>Not downloaded</li> - <li>Temporarily downloaded (automatically cached by the app)</li> - <li>Permanently downloaded on the device at the user's request</li> - </ul> -</p> -<p>We also needed to indicate progress from one download state to another, because downloading is not instantaneous.</p> -<p>This presented a challenge, because the Google Play apps use a variety of different layouts, and some of them are highly space-constrained. We didn't want this information to clutter the top-level screens, or compete too much with the cover art.</p> -<p>So we designed a custom indicator that could show all of the information in a tiny footprint, with the flexibility to appear on top of content if necessary.</p> - -<img src="{@docRoot}design/media/progress_activity_custom.png"> - -<p>The color indicates whether it's downloaded (blue) or not (gray). The appearance of the pin indicates whether the download is permanent (white, upright) or temporary (gray, diagonal). And when state is in the process of changing, progress is indicated by a moving pie chart.</p> - -<div class="cols"> - <div class="col-9"> - <img src="{@docRoot}design/media/progress_activity_custom_app.png"> - </div> - <div class="col-4"> - <div class="figure-caption"> - Across Google Play apps with different layouts, the same custom indicator appears with each item. It communicates download state as well as progress, in a compact package that can be incorporated into any screen design. - </div> - </div> -</div> - -<p>If you find that the standard indicators aren't meeting your needs (due to space constraints, state complexities), by all means design your own. Make it feel like part of the Android family by injecting some of the visual characteristics of the standard indicators. In this example, we carried over the circular shape, the same shade of blue, and the flat and simple style.</p> diff --git a/docs/html/design/building-blocks/scrolling.jd b/docs/html/design/building-blocks/scrolling.jd deleted file mode 100644 index 04b1e4a1acb0..000000000000 --- a/docs/html/design/building-blocks/scrolling.jd +++ /dev/null @@ -1,39 +0,0 @@ -page.title=Scrolling -page.tags=scrollview,listview -@jd:body - - -<p>Scrolling allows the user to navigate to content in the overflow using a swipe gesture. The -scrolling speed is proportional to the speed of the gesture.</p> -<h2 id="indicator">Scroll Indicator</h2> - -<p>Appears during scrolling to indicate what portion of the content is currently in view.</p> - -<div class="framed-nexus5-land-span-13"> - <video class="play-on-hover" autoplay> - <source src="{@docRoot}design/media/scroll_indicator.mp4" type="video/mp4"> - <source src="{@docRoot}design/media/scroll_indicator.webm" type="video/webm"> - <source src="{@docRoot}design/media/scroll_indicator.ogv" type="video/ogg"> - </video> -</div> -<div class="figure-caption"> - <div class="video-instructions"> </div> -</div> - -<h2 id="index-scrolling">Index Scrolling</h2> - -<p>In addition to traditional scrolling, a long alphabetical list can also offer index scrolling: a way -to quickly navigate to the items that begin with a particular letter. With index scrolling, a scroll -indicator appears even when the user isn't scrolling. Touching or dragging it causes the current -letter to pop up in a prominent way.</p> - -<div class="framed-nexus5-land-span-13"> - <video class="play-on-hover" autoplay> - <source src="{@docRoot}design/media/scroll_index.mp4" type="video/mp4"> - <source src="{@docRoot}design/media/scroll_index.webm" type="video/webm"> - <source src="{@docRoot}design/media/scroll_index.ogv" type="video/ogg"> - </video> -</div> -<div class="figure-caption"> - <div class="video-instructions"> </div> -</div> diff --git a/docs/html/design/building-blocks/seek-bars.jd b/docs/html/design/building-blocks/seek-bars.jd deleted file mode 100644 index 04446d219051..000000000000 --- a/docs/html/design/building-blocks/seek-bars.jd +++ /dev/null @@ -1,45 +0,0 @@ -page.title=Seek Bars and Sliders -page.tags=seekbar,progressbar -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/sliders.html"> - <div> - <h3>Material Design</h3> - <p>Sliders<p> - </div> -</a> - -<p>Interactive sliders make it possible to select a value from a continuous or discrete range of values -by moving the slider thumb. The smallest value is to the left, the largest to the right. The -interactive nature of the slider makes it a great choice for settings that reflect intensity levels, -such as volume, brightness, or color saturation.</p> - -<div class="cols"> - <div class="col-9"> - - <img src="{@docRoot}design/media/seekbar_example.png"> - - </div> - <div class="col-4"> - -<div class="vspace size-2"> </div> - -<h4>Example</h4> -<p>Interactive slider to set the ringer volume. The value can either be set through the hardware volume controls or interactively via a gesture.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-9"> - - <img src="{@docRoot}design/media/seekbar_style.png"> - <div class="figure-caption"> - Seek bars in Holo Light & Dark - </div> - - </div> - <div class="col-4"> </div> -</div> diff --git a/docs/html/design/building-blocks/spinners.jd b/docs/html/design/building-blocks/spinners.jd deleted file mode 100644 index 31c55585838c..000000000000 --- a/docs/html/design/building-blocks/spinners.jd +++ /dev/null @@ -1,54 +0,0 @@ -page.title=Spinners -page.tags=spinner,dropdown -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/menus.html"> - <div> - <h3>Material Design</h3> - <p>Menus<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/spinner.html"> - <div> - <h3>Developer Docs</h3> - <p>Spinners</p> - </div> -</a> - -<p itemprop="description">Spinners provide a quick way to select one value from a set. In the default state, a spinner shows -its currently selected value. Touching the spinner displays a dropdown menu with all other available -values, from which the user can select a new one.</p> - - -<div class="cols"> - <div class="col-6"> - - <img src="{@docRoot}design/media/spinners_form.png"> - -<h4>Spinners in forms</h4> -<p>Spinners are useful for data picking in forms. They are compact and integrate nicely with other -components. Use spinners in forms for both simple data input and in combination with other input -fields. For example, a text field might let you edit an email address for a contact, while its -associated spinner allows you to select whether it's a Home or Work address.</p> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/spinners_actionbar.png"> - -<h4>Spinners in action bars</h4> -<p>Use spinners in action bars to switch views. For example, Gmail uses a spinner to permit switching -between accounts or commonly used labels. Spinners are useful when changing the view is important to -your app, but not necessarily a frequent occurrence. In cases where view switching is frequent, use -tabs.</p> - - </div> -</div> - -<img src="{@docRoot}design/media/spinners_hololightanddark.png"> -<div class="figure-caption"> - Spinners in the Holo Dark and Holo Light themes, in various states. -</div> - diff --git a/docs/html/design/building-blocks/switches.jd b/docs/html/design/building-blocks/switches.jd deleted file mode 100644 index 9dd09caac84b..000000000000 --- a/docs/html/design/building-blocks/switches.jd +++ /dev/null @@ -1,64 +0,0 @@ -page.title=Switches -page.tags=switch,checkbox,radiobutton,button -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/selection-controls.html"> - <div> - <h3>Material Design</h3> - <p>Selection Controls<p> - </div> -</a> - -<p>Switches allow the user to select options. There are three kinds of switches: checkboxes, radio -buttons, and on/off switches.</p> - - - -<h2 id="checkboxes">Checkboxes</h2> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/checkbox.html"> - <div> - <h3>Developer Docs</h3> - <p>Checkboxes</p> - </div> -</a> - -<p itemprop="description">Checkboxes allow the user to select multiple options from a set. Avoid using a single checkbox to -turn an option off or on. Instead, use an on/off switch.</p> - - <img src="{@docRoot}design/media/switches_checkboxes.png"> - - - -<h2 id="radio-buttons">Radio Buttons</h2> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/radiobutton.html"> - <div> - <h3>Developer Docs</h3> - <p>Radio Buttons</p> - </div> -</a> - -<p>Radio buttons allow the user to select one option from a set. Use radio buttons for exclusive -selection if you think that the user needs to see all available options side-by-side. Otherwise, -consider a spinner, which uses less space.</p> - - <img src="{@docRoot}design/media/switches_radios.png"> - - - -<h2 id="switches">On/off Switches</h2> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/togglebutton.html"> - <div> - <h3>Developer Docs</h3> - <p>Toggle Buttons</p> - </div> -</a> - -<p>On/off switches toggle the state of a single settings option.</p> - - <img src="{@docRoot}design/media/switches_switches.png"> - - diff --git a/docs/html/design/building-blocks/tabs.jd b/docs/html/design/building-blocks/tabs.jd deleted file mode 100644 index 1315a2fbd85e..000000000000 --- a/docs/html/design/building-blocks/tabs.jd +++ /dev/null @@ -1,65 +0,0 @@ -page.title=Tabs -page.tags=tabs,actionbar,navigation,viewpager -@jd:body - -<img src="{@docRoot}design/media/tabs_overview.png"> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/tabs.html"> - <div> - <h3>Material Design</h3> - <p>Tabs<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}training/implementing-navigation/lateral.html"> - <div> - <h3>Developer Docs</h3> - <p>Creating Swipe Views<br>with Tabs</p> - </div> -</a> - -<p itemprop="description">Tabs in the action bar make it easy to explore and switch between different views or functional -aspects of your app, or to browse categorized data sets.</p> - -<p>For details on using gestures to move between tabs, see the <a href="{@docRoot}design/patterns/swipe-views.html">Swipe Views</a> pattern.</p> - -<h2 id="scrollable">Scrollable Tabs</h2> - - -<div class="cols"> - <div class="col-6"> - -<p>Scrolling tab controls can contain a larger number of items than a standard tab control. To navigate -to the next/previous view, swipe left or right.</p> - - </div> - <div class="col-7"> - - <video width="400" class="with-shadow play-on-hover" autoplay> - <source src="{@docRoot}design/media/tabs_scrolly.mp4" type="video/mp4"> - <source src="{@docRoot}design/media/tabs_scrolly.webm" type="video/webm"> - <source src="{@docRoot}design/media/tabs_scrolly.ogv" type="video/ogg"> - </video> - <div class="figure-caption"> - Scrolling tabs in the Play Store app. - <div class="video-instructions-image"> </div> - </div> - - </div> -</div> - - -<h2 id="fixed">Fixed Tabs</h2> -<p>Fixed tabs display all items concurrently. To navigate to a different view, touch the tab, or swipe left or right.</p> -<p>Fixed tabs are displayed with equal width, based on the width of the widest tab label. If there is insufficient room to display all tabs, the tab labels themselves will be scrollable. For this reason, fixed tabs are best suited for displaying 3 or fewer tabs.</p> - -<img src="{@docRoot}design/media/tabs_standard.png"> -<div class="figure-caption"> - Tabs in Holo Dark & Light. -</div> - -<img src="{@docRoot}design/media/tabs_youtube.png"> -<div class="figure-caption"> - Tabs in the Google Play Movies app. -</div> diff --git a/docs/html/design/building-blocks/text-fields.jd b/docs/html/design/building-blocks/text-fields.jd deleted file mode 100644 index 9403679154c8..000000000000 --- a/docs/html/design/building-blocks/text-fields.jd +++ /dev/null @@ -1,88 +0,0 @@ -page.title=Text Fields -page.tags=text,edittext,input -@jd:body - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/components/text-fields.html"> - <div> - <h3>Material Design</h3> - <p>Text Fields<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/text.html"> - <div> - <h3>Developer Docs</h3> - <p>Text Fields</p> - </div> -</a> - -<p itemprop="description">Text fields allow the user to type text into your app. They can be either single line or multi-line. -Touching a text field places the cursor and automatically displays the keyboard. In addition to -typing, text fields allow for a variety of other activities, such as text selection (cut, copy, -paste) and data lookup via auto-completion.</p> - - -<div class="cols"> - <div class="col-12"> - - <img src="{@docRoot}design/media/text_input_singlevsmultiline.png"> - - </div> -</div> - -<h4>Single line and multi line</h4> -<p>Single-line fields automatically scroll their content to the left as the text input cursor reaches -the right edge of the input field. Multi-line text fields automatically break to a new line for -overflow text and scroll vertically when the cursor reaches the lower edge.</p> - -<img src="{@docRoot}design/media/text_input_typesandtypedown.png"> - -<div class="cols"> - <div class="col-6"> - -<h4>Text field types</h4> -<p>Text fields can have different types, such as number, message, or email address. The type determines -what kind of characters are allowed inside the field, and may prompt the virtual keyboard to -optimize its layout for frequently used characters.</p> - - </div> - <div class="col-6"> - -<h4>Auto-complete text fields</h4> -<p>Use auto-complete text fields to present real-time completions or search results in popups, so users -can enter information more accurately and efficiently.</p> - - </div> -</div> - -<h2 id="text-selection">Text Selection</h2> - -<p>Users can select any word in a text field with a long press. This action triggers a text selection -mode that facilitates extending the selection or choosing an action to perform on the selected text. -Selection mode includes:</p> - -<div class="cols"> - <div class="col-9"> - - <img src="{@docRoot}design/media/text_input_textselection.png"> - - </div> - <div class="col-4 with-callouts"> - -<ol> -<li> -<h4>Contextual action bar</h4> -<p>A contextual action bar (CAB) displays the actions available to perform on the selection: - typically cut, copy, and paste, but apps can insert additional commands as needed.</p> -</li> -<li> -<h4>Selection handles</h4> -<p>Selection handles can be dragged to select more or less text while remaining in selection mode.</p> -</li> -</ol> - - </div> -</div> - diff --git a/docs/html/design/design_toc.cs b/docs/html/design/design_toc.cs index 63f5cadbd56c..85569ef6e252 100644 --- a/docs/html/design/design_toc.cs +++ b/docs/html/design/design_toc.cs @@ -1,15 +1,15 @@ <ul id="nav"> <li class="nav-section"> - <div class="nav-section-header"><a href="<?cs var:toroot ?>design/index.html">Get Started</a></div> + <div class="nav-section-header"><a href="<?cs var:toroot ?>design/get-started/creative-vision.html">Creative Vision</a></div> <ul> - <li><a href="<?cs var:toroot ?>design/get-started/creative-vision.html">Creative Vision</a></li> <li><a href="<?cs var:toroot ?>design/get-started/principles.html">Design Principles</a></li> + <li><a href="<?cs var:toroot ?>design/patterns/new.html">New in Android</a></li> </ul> </li> <li class="nav-section"> - <div class="nav-section-header empty"><a href="<?cs var:toroot ?>design/material/index.html">Material Design</a></div> + <div class="nav-section-header empty"><a href="<?cs var:toroot ?>design/material/index.html">Material for Android</a></div> </li> <li class="nav-section"> @@ -43,59 +43,20 @@ </li> <li class="nav-section"> - <div class="nav-section-header"><a href="<?cs var:toroot ?>design/style/index.html">Style</a></div> + <div class="nav-section-header"><a href="<?cs var:toroot ?>design/style/index.html">Pure Android</a></div> <ul> <li><a href="<?cs var:toroot ?>design/style/devices-displays.html">Devices and Displays</a></li> - <li><a href="<?cs var:toroot ?>design/style/themes.html">Themes</a></li> - <li><a href="<?cs var:toroot ?>design/style/touch-feedback.html">Touch Feedback</a></li> - <li><a href="<?cs var:toroot ?>design/style/metrics-grids.html">Metrics and Grids</a></li> - <li><a href="<?cs var:toroot ?>design/style/typography.html">Typography</a></li> - <li><a href="<?cs var:toroot ?>design/style/color.html">Color</a></li> - <li><a href="<?cs var:toroot ?>design/style/iconography.html">Iconography</a></li> - <li><a href="<?cs var:toroot ?>design/style/branding.html">Your Branding</a></li> - <li><a href="<?cs var:toroot ?>design/style/writing.html" zh-cn-lang="写作风格">Writing Style</a></li> - </ul> - </li> - - <li class="nav-section"> - <div class="nav-section-header"><a href="<?cs var:toroot ?>design/patterns/index.html">Patterns</a></div> - <ul> - <li><a href="<?cs var:toroot ?>design/patterns/new.html">New in Android</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/gestures.html">Gestures</a></li> <li><a href="<?cs var:toroot ?>design/patterns/app-structure.html">App Structure</a></li> <li><a href="<?cs var:toroot ?>design/patterns/navigation.html">Navigation</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/actionbar.html">Action Bar</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/navigation-drawer.html">Navigation Drawer</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/multi-pane-layouts.html">Multi-pane Layouts</a></li> + <li><a href="<?cs var:toroot ?>design/patterns/notifications.html">Notifications</a></li> + <li><a href="<?cs var:toroot ?>design/patterns/widgets.html">Widgets</a></li> <li><a href="<?cs var:toroot ?>design/patterns/swipe-views.html">Swipe Views</a></li> <li><a href="<?cs var:toroot ?>design/patterns/fullscreen.html">Full Screen</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/selection.html">Selection</a></li> <li><a href="<?cs var:toroot ?>design/patterns/confirming-acknowledging.html">Confirming & Acknowledging</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/notifications.html">Notifications</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/widgets.html">Widgets</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/settings.html">Settings</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/help.html">Help</a></li> + <li><a href="<?cs var:toroot ?>design/patterns/pure-android.html">Pure Android</a></li> <li><a href="<?cs var:toroot ?>design/patterns/compatibility.html">Compatibility</a></li> <li><a href="<?cs var:toroot ?>design/patterns/accessibility.html">Accessibility</a></li> - <li><a href="<?cs var:toroot ?>design/patterns/pure-android.html">Pure Android</a></li> - </ul> - </li> - - <li class="nav-section"> - <div class="nav-section-header"><a href="<?cs var:toroot ?>design/building-blocks/index.html">Building Blocks</a></div> - <ul> - <li><a href="<?cs var:toroot ?>design/building-blocks/tabs.html">Tabs</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/lists.html">Lists</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/grid-lists.html">Grid Lists</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/scrolling.html">Scrolling</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/spinners.html">Spinners</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/buttons.html">Buttons</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/text-fields.html">Text Fields</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/seek-bars.html">Seek Bars</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/progress.html">Progress & Activity</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/switches.html">Switches</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/dialogs.html">Dialogs</a></li> - <li><a href="<?cs var:toroot ?>design/building-blocks/pickers.html">Pickers</a></li> + <li><a href="<?cs var:toroot ?>design/patterns/help.html">Help</a></li> </ul> </li> @@ -103,8 +64,8 @@ <div class="nav-section-header empty"><a href="<?cs var:toroot ?>design/downloads/index.html">Downloads</a></div> </li> - <li class="nav-section"> +<!-- <li class="nav-section"> <div class="nav-section-header empty"><a href="<?cs var:toroot ?>design/videos/index.html">Videos</a></div> - </li> + </li> --> </ul> diff --git a/docs/html/design/downloads/index.jd b/docs/html/design/downloads/index.jd index 0b9f59f8843d..089a4af6db95 100644 --- a/docs/html/design/downloads/index.jd +++ b/docs/html/design/downloads/index.jd @@ -3,107 +3,16 @@ page.tags=Icons,stencils,color swatches @jd:body -<p>You may use these materials without restriction to facilitate your app design -and implementation.</p> +<p>For icons, sticker sheets, and other downloadable resources, visit the +<a href="http://www.google.com/design">Design site</a> or use the links below. </p> - -<h2 id="stencils">Phone & Tablet Stencils</h2> - -<div class="cols"> - <div class="col-5"> - - -<p>Drag and drop your way to beautifully designed Android apps. The stencils feature the -rich typography, colors, interactive controls, and icons found throughout Android, along with -phone and tablet outlines to frame your creations. Source files for icons and controls are also -available.</p> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/downloads_stencils.png"> - - </div> - - <div class="col-4"> - <a class="notice-designers-material" - style="width:218px;" - href="http://www.google.com/design/spec/resources/layout-templates.html"> - <div> - <h3>Material Design</h3> - <p>Layout Templates<p> - </div> - </a> - </div> - - <div class="col-4"> - <a class="notice-designers-material" - style="width:218px;" - href="http://www.google.com/design/spec/resources/sticker-sheets-icons.html"> - <div> - <h3>Material Design</h3> - <p>Sticker Sheets<p> - </div> - </a> - </div> - - <div class="col-4"> -<p> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Photoshop Sources');" - href="{@docRoot}downloads/design/Android_Design_Stencils_Sources_20131106.zip">Adobe® Photoshop® Stencils and Sources</a> -</p> - - </div> -</div> - - - - - - -<h2 id="action-bar-icon-pack">Action Bar Icon Pack</h2> - -<div class="cols"> - <div class="col-5"> - -<p>Action bar icons are graphic buttons that represent the most important actions people can take -within your app. <a href="{@docRoot}design/style/iconography.html">More on Action Bar Iconography</a></p> -<p>The download package includes icons that are scaled for various screen densities and suitable for -use with the Holo Light and Holo Dark themes. The package also includes unstyled icons that you can -modify to match your theme, plus source files.</p> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_actionbar_style.png"> - - </div> - - <div class="col-4"> - <a class="notice-designers-material" - style="width:218px;" - href="http://www.google.com/design/spec/resources/sticker-sheets-icons.html"> - <div> - <h3>Material Design</h3> - <p>Sticker Sheets<p> - </div> - </a> - </div> - - <div class="col-4"> - -<p> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Action Bar Icons');" - href="{@docRoot}downloads/design/Android_Design_Icons_20131106.zip">Action Bar Icon Pack</a> -</p> - - </div> + <div class="resource-widget resource-flow-layout col-16" + data-query="collection:design/landing/resources" + data-cardSizes="6x2" + data-maxResults="6"></div> </div> - - - <h2 id="Wear">Android Wear Materials</h2> <div class="cols"> @@ -243,86 +152,4 @@ system indicators. <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Wear Watch Face Example Specifications');" href="{@docRoot}downloads/design/Slide_IconExample.psd">Adobe® Photoshop® Icon</a> </div> -</div> - - - - -<h2 id="style">Style</h2> - -<div class="cols"> - <div class="col-5"> - -<h4 id="roboto">Roboto</h4> -<p>Ice Cream Sandwich introduced a new type family named Roboto, created specifically for the -requirements of UI and high-resolution screens.</p> -<p>For Android Wear, Roboto Condensed is the system font and the Regular and Light variants should be used by all Wear apps.</p> -<p><a href="{@docRoot}design/style/typography.html">More on Roboto</a></p> -<p><a href="http://www.google.com/fonts/specimen/Roboto" class="external-link">Roboto on Google Fonts</a></p> -<p><a href="http://www.google.com/fonts/specimen/Roboto+Condensed" class="external-link">Roboto Condensed on Google Fonts</a></p> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/downloads_roboto_specimen_preview.png"> - - </div> - - <div class="col-4"> - <a class="notice-designers-material" - style="width:218px;" - href="http://www.google.com/design/spec/resources/roboto-noto-fonts.html"> - <div> - <h3>Material Design</h3> - <p>Roboto Font<p> - </div> - </a> - </div> - - <div class="col-4"> - -<p> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Roboto ZIP');" - href="{@docRoot}downloads/design/roboto-1.2.zip">Roboto</a> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Roboto Specemin Book');" - href="{@docRoot}downloads/design/Roboto_Specimen_Book_20131031.pdf">Specimen Book</a> -</p> - - </div> -</div> - -<div class="cols"> - <div class="col-5"> - -<h4>Color</h4> -<p>In Android's color palette, each color has a corresponding darker -shade that can be used as a complement when needed.</p> -<p><a href="{@docRoot}design/style/color.html">More on Color</a></p> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/downloads_color_swatches.png"> - - </div> - - <div class="col-4"> - <a class="notice-designers-material" - style="width:218px;" - href="http://www.google.com/design/spec/resources/color-palettes.html"> - <div> - <h3>Material Design</h3> - <p>Color Palettes<p> - </div> - </a> - </div> - - <div class="col-4"> - -<p> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Color Swatches');" - href="{@docRoot}downloads/design/Android_Design_Color_Swatches_20120229.zip">Color Swatches</a> -</p> - - </div> -</div> +</div>
\ No newline at end of file diff --git a/docs/html/design/get-started/creative-vision.jd b/docs/html/design/get-started/creative-vision.jd index 3955494e42ac..974d5d0386ad 100644 --- a/docs/html/design/get-started/creative-vision.jd +++ b/docs/html/design/get-started/creative-vision.jd @@ -7,10 +7,9 @@ page.image=images/cards/design-creative-vision_2x.jpg <div class="vspace size-1"> </div> <p itemprop="description"> - Starting with Ice Cream Sandwich, we focused the design of - Android around these three overarching goals, which apply - to our core apps as well as the system at large. - As you work with Android, consider these goals. + Android design is shaped by three overarching goals for users that apply + to apps as well as the system at large. As you work with Android, + keep these goals in mind. </p> <div class="vspace size-1"> </div> diff --git a/docs/html/design/index.jd b/docs/html/design/index.jd index 74af6e7c3d14..638f35b27929 100644 --- a/docs/html/design/index.jd +++ b/docs/html/design/index.jd @@ -14,17 +14,14 @@ footer.hide=1 <img class="dac-hero-image" src="/design/media/hero-material-design.png"> </div> <div class="col-1of2 col-pull-1of2"> - <h1 class="dac-hero-title">Up and running with Material Design</h1> + <h1 class="dac-hero-title">Up and running with material design</h1> <p class="dac-hero-description"> - Android 5.0 introduces a design metaphor inspired by paper and ink that provides a reassuring sense of tactility. + Android uses a new design metaphor inspired by paper and ink that provides a reassuring + sense of tactility. Visit the <a href="http://www.google.com/design/spec/material-design/introduction">material design</a> site for more resources. </p> <a class="dac-hero-cta" href="https://www.google.com/design/spec/material-design/introduction.html"> <span class="dac-sprite dac-auto-chevron"></span> - Introducing Material Design - </a><br> - <a class="dac-hero-cta" href="/design/material/index.html"> - <span class="dac-sprite dac-auto-chevron"></span> - Material Design for Android + Introducing material design </a><br> <a class="dac-hero-cta" href="https://www.google.com/design/spec/resources/color-palettes.html"> <span class="dac-sprite dac-auto-chevron"></span> @@ -56,7 +53,7 @@ footer.hide=1 <section class="dac-section dac-light"><div class="wrap"> <h1 class="dac-section-title">Pure Android</h1> <div class="dac-section-subtitle"> - This is a place holder paragraph. Some text here would povide some context. + Design around Android's capabilities and conventions to give users the best experience. </div> <div class="resource-widget resource-flow-layout col-16" data-query="collection:design/landing/pureandroid" @@ -67,7 +64,7 @@ footer.hide=1 <section class="dac-section dac-gray"><div class="wrap"> <h1 class="dac-section-title">Resources</h1> <div class="dac-section-subtitle"> - This is a place holder paragraph. Some text here would povide some context. + Essential downloads, stencils, and tools to help you create your design. </div> <div class="resource-widget resource-flow-layout col-16" data-query="collection:design/landing/resources" diff --git a/docs/html/design/patterns/gestures.jd b/docs/html/design/patterns/gestures.jd deleted file mode 100644 index b471ee3e5521..000000000000 --- a/docs/html/design/patterns/gestures.jd +++ /dev/null @@ -1,135 +0,0 @@ -page.title=Gestures -page.tags=gesture,input,touch -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/patterns/gestures.html"> - <div> - <h3>Material Design</h3> - <p>Gestures<p> - </div> -</a> - -<p>Gestures allow users to interact with your app by manipulating the screen objects you provide. The -following table shows the core gesture set that is supported in Android.</p> - -<div class="vspace size-2"> </div> - -<div class="cols"> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_touch.png"> - <h4>Touch</h4> - <p>Triggers the default functionality for a given item.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>Press, lift</p></li> - </ul> - </div> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_longtouch.png"> - <h4>Long press</h4> - <p>Enters data selection mode. Allows you to select one or more items in a view and act upon - the data using a contextual action bar. Avoid using long press for showing contextual menus.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>Press, wait, lift</p></li> - </ul> - </div> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_swipe.png"> - <h4>Swipe or drag</h4> - <p>Scrolls overflowing content, or navigates between views in the same hierarchy. Swipes are - quick and affect the screen even after the finger is picked up. Drags are slower and more precise, - and the screen stops responding when the finger is picked up.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>Press, move, lift</p></li> - </ul> - </div> - -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_drag.png"> - <h4>Long press drag</h4> - <p>Rearranges data within a view, or moves data into a container (e.g. folders on Home Screen).</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>Long press, move, lift</p></li> - </ul> - </div> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_doubletouch.png"> - <h4>Double touch </h4> - <p> Scales up a standard amount around the target with each repeated gesture until reaching - maximum scale. For nested views, scales up the smallest targetable view, or returns it to - its original scale. Also used as a secondary gesture for text selection.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>Two touches in quick succession</p> - </li> - </ul> - </div> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_doubletouchdrag.png"> - <h4>Double touch drag</h4> - <p>Scales content by pushing away or pulling closer, centered around gesture.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>A single touch followed in quick succession by a drag up or down:</p> - <ul style="padding-left:1.5em;list-style-type:disc;"> - <li>Dragging up decreases content scale</li> - <li>Dragging down increases content scale</li> - <li>Reversing drag direction reverses scaling.</li> - </ul> - </li> - </ul> - </div> - -</div> - - -<div class="vspace size-2"> </div> - -<div class="cols"> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_pinchopen.png" style="margin-left:-4px"> - <h4>Pinch open</h4> - <p>Zooms into content.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>2-finger press, move outwards, lift</p></li> - </ul> - </div> - - <div class="col-4"> - <img src="{@docRoot}design/media/gesture_pinchclose.png"> - <h4>Pinch close</h4> - <p>Zooms out of content.</p> - <ul> - <li class="no-bullet with-icon action"> - <h4>Action</h4> - <p>2-finger press, move inwards, lift</p> - </li> - </ul> - </div> - -</div> - diff --git a/docs/html/design/patterns/index.jd b/docs/html/design/patterns/index.jd deleted file mode 100644 index e091a29ca5e8..000000000000 --- a/docs/html/design/patterns/index.jd +++ /dev/null @@ -1,30 +0,0 @@ -page.title=Patterns -header.justLinks=1 -footer.hide=1 -@jd:body - -<style> -#landing-graphic-container { - position: relative; -} - -#text-overlay { - position: absolute; - left: 0; - top: 492px; - width: 200px; -} -</style> - -<div id="landing-graphic-container"> - <div id="text-overlay"> - <span itemprop="description">Design apps that behave in a consistent, predictable - fashion.</span> - <br><br> - <a href="{@docRoot}design/patterns/new.html" class="landing-page-link">New in Android</a> - </div> - - <a href="{@docRoot}design/patterns/new.html"> - <img src="{@docRoot}design/media/patterns_landing.png"> - </a> -</div> diff --git a/docs/html/design/patterns/multi-pane-layouts.jd b/docs/html/design/patterns/multi-pane-layouts.jd deleted file mode 100644 index c9d3d841d946..000000000000 --- a/docs/html/design/patterns/multi-pane-layouts.jd +++ /dev/null @@ -1,130 +0,0 @@ -page.title=Multi-pane Layouts -page.tags="tablet","navigation","layout","fragment" -page.metaDescription=Design guide with examples of how to flatten navigation and provide improved layout across the range of Android devices. - -@jd:body - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/layout/structure.html#structure-ui-regions"> - <div> - <h3>Material Design</h3> - <p>UI Regions and Guidance<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}training/basics/fragments/index.html"> - <div> - <h3>Developer Docs</h3> - <p>Building a Dynamic UI with Fragments</p> - </div> -</a> - -<p>When writing an app for Android, keep in mind that Android devices -come in many different screen sizes and types. Make sure that your app consistently provides a -balanced and aesthetically pleasing layout by adjusting its content to varying screen sizes and -orientations.</p> - -<p><em>Panels</em> are a great way for your app to achieve this. They allow you to combine multiple views into -one compound view when a lot of horizontal screen real estate is available and by splitting them up -when less space is available.</p> -<h2 id="combining-views">Combining Multiple Views Into One</h2> - -<p>On smaller devices your content is typically divided into a master grid or list view and a detail -view. Touching an item in the master view opens a different screen showing that item's detail -information.</p> - -<img src="{@docRoot}design/media/multipane_views.png"> - -<p>Because tablets have more screen real estate than phones, you can use panels to combine the related -list and detail views into a single compound view. This uses the additional space more efficiently -and makes navigating the app easier. </p> - -<img src="{@docRoot}design/media/multipane_view_tablet.png"> - -<p>In general, use the pane on the right to present more information about the item you selected in the -left pane. Make sure to keep the item in the left pane selected in order to establish the -relationship between the panels.</p> -<h2 id="orientation">Compound Views and Orientation Changes</h2> - -<p>Screens should strive to have the same functionality regardless of orientation. If you use a compound view in -one orientation, try not to split it up when the user rotates the screen. There are several techniques -you can use to adjust the layout after orientation change while keeping functional parity intact.</p> - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/multipane_stretch.png"> - - </div> - <div class="col-5"> - -<h4>Stretch/compress</h4> -<p>Adjust the column width of your left pane to achieve a balanced layout in both orientations.</p> - - </div> -</div> - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/multipane_stack.png"> - - </div> - <div class="col-5"> - -<h4>Stack</h4> -<p>Rearrange the panels on your screen to match the orientation.</p> - - </div> -</div> - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/multipane_expand.png"> - - </div> - <div class="col-5"> - -<h4>Expand/collapse</h4> -<p>When the device rotates, collapse the left pane view to only show the most important information.</p> - - </div> -</div> - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/multipane_show.png"> - - </div> - <div class="col-5"> - -<h4>Show/hide</h4> -<p>If your screen cannot accommodate the compound view on rotation show the right pane in full screen view on rotation to portrait. Use the Up icon in action bar to show the parent screen.</p> - - </div> -</div> - - - - -<h2 id="checklist">Checklist</h2> - -<ul> -<li> -<p>Plan in advance on how your app scales to different screen sizes and screen orientations.</p> -</li> -<li> -<p>Identify the most appropriate method for the panels in your compound views to reorganize - themselves when screen orientation changes.</p> -</li> -<li> -<p>Look for opportunities to consolidate your views into multi-panel compound views.</p> -</li> -<li> -<p>Make sure that your screens try to provide functional parity after the screen orientation - changes.</p> -</li> -</ul> diff --git a/docs/html/design/patterns/navigation-drawer.jd b/docs/html/design/patterns/navigation-drawer.jd deleted file mode 100644 index b359470140d3..000000000000 --- a/docs/html/design/patterns/navigation-drawer.jd +++ /dev/null @@ -1,346 +0,0 @@ -page.title=Navigation Drawer -page.tags=DrawerLayout,SlidingPaneLayout -@jd:body - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/layout/structure.html#structure-side-nav"> - <div> - <h3>Material Design</h3> - <p>Side Nav<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}training/implementing-navigation/nav-drawer.html"> - <div> - <h3>Developer Docs</h3> - <p>Creating a Navigation Drawer</p> - </div> -</a> - - -<p>The navigation drawer is a panel that transitions in from the left edge of the screen and -displays the app’s main navigation options.</p> - - -<h4>Displaying the navigation drawer</h4> - -<p>The user can bring the navigation drawer onto the screen by swiping from the left edge of the -screen or by touching the application icon on the action bar.</p> - -<p>As the navigation drawer expands, it overlays the content but not the action bar. When the -drawer is fully extended, the action bar adjusts its content by replacing the current action -bar title with the app name and removing all actions that are contextual to the view underneath -the navigation drawer. The overflow menu with the standard action items for Settings and Help -remains visible.</p> - -<img src="{@docRoot}design/media/navigation_drawer_overview.png"> -<div class="figure-caption"> - The user can open the drawer panel by touching the navigation drawer indicator. -</div> - -<p>Because they are transient, navigation drawers make views less cluttered. You can also use -them at deeper levels in the navigation hierarchy, allowing users to switch to your app's most -important screens from anywhere in the app.</p> - -<img src="{@docRoot}design/media/navigation_drawer_open_from_lower.png"> -<div class="figure-caption"> - Open the drawer from anywhere in your app by swiping from the left edge of the screen. -</div> - - -<h4>Dismissing the navigation drawer</h4> - -<p> When the navigation drawer is expanded, the user can dismiss it in one of four ways: </p> -<ul> - <li>Touching the content outside the navigation drawer</li> - <li>Swiping to the left anywhere on the screen (including edge swipe from right)</li> - <li>Touching the app icon/title in the action bar</li> - <li>Pressing Back</li> -</ul> - - -<h2 id="WhenToUse"> When to Use the Navigation Drawer </h2> - -<p> The navigation drawer is not a general replacement for top-level navigation via spinners -or tabs. The structure of your app should guide your choice of which pattern to use for -top-level switching. For more information on top-level switching mechanisms, see the -<a href="{@docRoot}design/patterns/app-structure.html">Application Structure</a> design pattern.</p> -<p> Here are some examples of where navigation drawers work best:</p> - -<h4>More than 3 top-level views</h4> -<p> Navigation drawers are great for displaying a large number of navigation targets -concurrently. Use the navigation drawer if you have more than 3 unique top-level views. -If not, use fixed tabs for top-level organization to ease discovery and interaction.</p> - -<h4>Cross-navigation from lower levels</h4> -<p> If your app requires cross-navigating between lower-level screens, consider using the -navigation drawer. Because it is accessible from anywhere in the app, the drawer enables -efficient navigation from lower-level screens to other important places in your app.</p> - -<img src="{@docRoot}design/media/navigation_drawer_cross_nav.png"> -<div class="figure-caption"> - The navigation drawer makes cross-navigation at lower levels possible. -</div> - - -<h4>Deep navigation branches</h4> -<p> If you have particularly deep branches, navigating to the top-level of your app can become -repetitive and cumbersome with Up and Back alone. Since navigation drawers are accessible from -anywhere in the app, navigation up to the top level is faster and more efficient.</p> - -<img src="{@docRoot}design/media/navigation_drawer_quick_to_top.png"> -<div class="figure-caption"> - The navigation drawer allows for quick jumps to the top-level of your app, removing the need - for repetitive Back or Up sequences. -</div> - - -<h2 id="Hubs">Navigation Hubs</h2> - -<p>The navigation drawer is a reflection of your app’s structure and displays its major -navigation hubs. Think of navigation hubs as those places in your app that a user will want -to visit frequently or use as a jumping-off point to other parts of the app. -At a minimum, the navigation hubs are the top-level views, since they correspond to your app’s -major functional areas.</p> -<p> If your app’s structure is deep, you can add screens from lower levels that your users will -likely visit often and make those navigation hubs as well.</p> - -<img src="{@docRoot}design/media/navigation_drawer_navigation_hubs.png"> -<div class="figure-caption"> - The navigation drawer contains all of your app's navigation hubs. Include your top level - screens as well as important lower-level screens. -</div> - -<div class="cols"> - <div class="col-8"> - <p> To facilitate access to the navigation drawer on navigation hubs, all screens that - correspond to an entry in your navigation drawer should show the navigation drawer indicator - next to the application icon in the action bar. Touching the app icon causes the navigation - drawer to slide in from the left. </p> - <p> All other lower-level screens show the traditional Up indicator next to the application - icon. The drawer is still accessible with an edge-swipe, but is not featured in the action bar.</p> - </div> - <div class="col-5"> - <img src="{@docRoot}design/media/navigation_drawer_indicator_big.png"> - <div class="figure-caption"> - App icon with navigation drawer indicator. - </div> - </div> -</div> - - -<h2 id="Content">Content of the Navigation Drawer</h2> - -<p> Keep the content of the navigation drawer focused on app navigation. Expose the navigation -hubs of your app as list items inside the navigation drawer - one item per row. - -<div class="cols"> - <div class="col-8"> - <h4>Titles, icons, and counters</h4> - <p> You can structure navigation targets by adding titles. The titles are not interactive, - but just organize navigation targets into functional topics. If you have many navigation - targets, use titles to orient the user within the drawer.</p> - <p> Navigation targets can have optional leading icons as well as trailing counters. Use - the counters to inform users about a changed state of data in the corresponding view.</p> - </div> - <div class="col-5"> - <img src="{@docRoot}design/media/navigation_drawer_titles_icons.png"> - <div class="figure-caption"> - Use titles and icons to organize your drawer. - </div> - </div> -</div> - -<div class="cols"> - <div class="col-8"> - <img src="{@docRoot}design/media/navigation_drawer_collapse.png"> - <div class="figure-caption"> - Collapsible navigation items are split. Use the left side for navigation and the right - to collapse and expand items. - </div> - </div> - <div class="col-5"> - <h4>Collapsible navigation items</h4> - <p>If you have many views with some subordinate to others, consider collapsing them into one - expandable item to conserve space. - The parent in the navigation drawer then turns into a split item. The left side allows - navigation to the parent item’s view, and the right side collapses or expands the list of - child items. </p> - <p> At launch, the initial state of the collapsible items is up to you. As a rule, all - top-level view entries of the navigation drawer should be visible. If you have many collapsible - items, consider collapsing all items to allow the user to see the top-level views in their - entirety.</p> - <p> When the user opens the drawer from a lower-level screen, expand the associated branch - of the top-level view to give a stronger sense of place and highlight navigation opportunities - close to the user’s current - location in the app.</p> - </div> -</div> - - -<h2 id="ActionBar">Navigation Drawers and Action Bars</h2> - -<p> When the user expands the navigation drawer, the task focus switches to selecting an item -from the drawer. Because the drawer does not overlay the action bar, users may not realize that -the items in the action bar do not pertain to the navigation drawer. </p> -<p> To reduce confusion, adjust the content of the action bar to the following, once the drawer -is fully expanded:</p> -<ul> - <li>App icon</li> - <li>App name</li> - <li>Remove actions from the action bar that are contextual to the underlying view (such as - Create new, Refresh). You may retain actions with global scope, such as “Search”.</li> - <li>Overflow menu with expected navigation targets, such as Settings and Help.</li> -</ul> - -<img src="{@docRoot}design/media/navigation_drawer_open_overflow.png"> -<div class="figure-caption"> - Clean up the action bar when the drawer is fully expanded. Remove actions that are not needed - and display your app's name in the title area. -</div> - -<h4>Actions</h4> -<div class="cols"> - <div class="col-6"> - <img src="{@docRoot}design/media/navigation_drawer_nav_and_actions.png"> - <div class="figure-caption"> - Keep actions on the right side of the action bar and in the overflow - </div> - </div> - <div class="col-6"> - <p> Don’t place actions in the navigation drawer. Actions belong in the action bar, and the - user expects to see them there. Keep in mind that not all applications use the navigation - drawer pattern. It may be tempting to expose all your app’s capabilities in a single place, - but keep the bigger picture in mind. Place your actions where all apps display them.</p> - </div> -</div> -<div class="cols"> - <div class="col-6"> - <p> This also applies to common navigation targets, such as access to Help or the app’s - Settings. As per style guide convention Help and Settings are always located in the action - overflow.</p> - </div> - <div class="col-6"> - <img src="{@docRoot}design/media/navigation_drawer_settings_help.png"> - <div class="figure-caption"> - Keep Help and Settings in the overflow. - </div> - </div> -</div> - - -<h4>Contextual action bars</h4> -<p> Sometimes the user will be in a state where a contextual action bar (CAB) appears instead -of the app’s action bar. This typically happens when the user selects text or selects multiple -items after a press-and-hold gesture. While the CAB is visible, you should still allow the -user to open the navigation drawer using an edge swipe. However, replace the CAB with the -standard action bar while the navigation drawer is open. When the user dismisses the drawer, -re-display the CAB.</p> - -<img src="{@docRoot}design/media/navigation_drawer_CAB.png"> -<div class="figure-caption"> - Hide contextual action bars while the drawer is visible. -</div> - -<p>If the user navigates away from a view with selected content, deselect the content before -before navigating to the new view.</p> - - -<h2 id="Interaction">Interaction Details</h2> - -<h4>Introduce the user to the drawer at first use</h4> -<p> Upon first launch of your app, introduce the user to the navigation drawer by -automatically opening it. This ensures that users know about the navigation drawer and prompts -them to learn about the structure of your app by exploring its content. Continue showing the -drawer upon subsequent launches until the user actively expands the navigation drawer manually. -Once you know that the user understands how to open the drawer, launch the app with the -navigation drawer closed. </p> - -<img src="{@docRoot}design/media/navigation_drawer_first_run.png"> -<div class="figure-caption"> - At first use, show the navigation drawer automatically to help the user learn the - functionality and structure of your app. -</div> - -<h4>Give the user a quick peek</h4> -<p> If the user touches the very left edge of the screen (within 20 dp from the left), have the -drawer peek out as soon as the finger makes contact with the display. This promotes accidental -discovery and provides richer feedback. </p> - -<img src="{@docRoot}design/media/navigation_drawer_peek.png"> -<div class="figure-caption"> - The navigation drawer peeks out when the user touches the very left edge of the screen. -</div> - -<h4>Highlights</h4> -<p> When you open the navigation drawer from a screen that is represented inside the drawer, -highlight its entry in the drawer. Vice versa, if you open the drawer from a screen that is -not listed in the drawer, none of the items of the drawer should be highlighted.</p> - - -<h2 id="ImpactOnNav">Impact of Drawer on Overall App Navigation</h2> - -<p>The navigation drawer is an alternative to other top-level navigation patterns. To make apps -with navigation drawers work consistently with apps that use a tab or spinner pattern, remember -that all navigation requirements for system Back and Up apply.</p> -<p>Pay special attention to the following situations:</p> - -<h4>System Back at the top level of the app</h4> -<p>Touching System Back at the app’s top level never opens the navigation drawer. Instead, -System Back behaves according to the navigation rules for the top level, such as navigating -to the previous app within the task or navigating to the Home screen.</p> - -<img src="{@docRoot}design/media/navigation_drawer_top_out.png"> -<div class="figure-caption"> - System Back does not show the drawer, but behaves according to the navigation rules for - the top level. -</div> - -<h4>System Back after cross navigation to lower hierarchy levels</h4> -<p>If the user navigates to a lower hierarchy screen from the navigation drawer and the screen -has a direct parent, then the Back stack is reset and Back points to the target screen’s parent. -This Back behavior is the same as when a user navigates into an app from a notification.</p> - -<img src="{@docRoot}design/media/navigation_drawer_reset_backstack.png"> -<div class="figure-caption"> - Reset the Back stack if your lower-level navigation target has direct parents. -</div> - - -<h2 id="Style">Style</h2> - -<p>The width of the navigation drawer depends on the content you want to display, but should be -between a minimum of 240 dp and a maximum of 320 dp. The height of the individual line items -should not fall below 48 dp. See the layout guideline below for recommendations on padding and -spacing.</p> - -<img src="{@docRoot}design/media/navigation_drawer_layout.png"> -<div class="figure-caption"> - Layout guidelines for the navigation drawer. -</div> - - -<p>Pick the drawer background to best match your app’s theme. See the following examples -for a Holo light and a Holo dark themed drawer.</p> - -<img src="{@docRoot}design/media/navigation_drawer_holo_dark_light.png"> -<div class="figure-caption"> - Navigation drawers in Holo light and Holo dark themed apps. -</div> - - -<h2 id="Checklist">Navigation Drawer Checklist</h2> - -<p>Even if you already support a similar navigation drawer, update your drawer to this -pattern to make sure that:</p> -<ul> - <li>The action bar remains in place and adjusts its content.</li> - <li>Your navigation drawer overlays the content.</li> - <li>Any view represented in the drawer has a navigation drawer indicator in its action bar - that allows the drawer to be opened by touching the app icon.</li> - <li>You take advantage of the new visual drawer transition.</li> - <li>Any view not represented in the drawer maintains the traditional Up indicator in its action bar.</li> - <li>You stay in sync with the general navigation patterns for Up and Back.</li> -</ul> - diff --git a/docs/html/design/patterns/selection.jd b/docs/html/design/patterns/selection.jd deleted file mode 100644 index e00f726b920c..000000000000 --- a/docs/html/design/patterns/selection.jd +++ /dev/null @@ -1,123 +0,0 @@ -page.title=Selection -page.tags=actionmode,navigation,contextual -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/patterns/selection.html"> - <div> - <h3>Material Design</h3> - <p>Selection<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/menus.html#context-menu"> - <div> - <h3>Developer Docs</h3> - <p>Menus: Creating Contextual Menus</p> - </div> -</a> - - -<p>Android 3.0 changed the <em>long press</em> gesture—that is, a touch that's held in the same position for a moment—to be the global gesture to select data.. This affects the way you should -handle multi-select and contextual actions in your apps.</p> - -<div class="vspace size-1"> </div> - -<div class="cols"> - <div class="col-6"> - -<h4>What has changed?</h4> -<p>In previous versions of Android, the long press gesture was universally used to display contextual -actions for a given data item in a contextual menu.</p> -<p>This pattern changed with Android 3.0. The long press gesture is now used to select data, combining -contextual actions and selection management functions for selected data into a new element called -the contextual action bar (CAB).</p> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/selection_context_menu.png"> - <div class="figure-caption"> - Traditional use of the long press gesture to show contextual menus. - </div> - - </div> -</div> - -<h4>Using the contextual action bar</h4> -<p itemprop="description">The contextual action bar (CAB) is a temporary action bar that overlays your app's current action bar while data -is selected. It appears after the user long-presses on a selectable data item.</p> - -<img src="{@docRoot}design/media/selection_cab_big.png"> - -<div class="vspace size-1"> </div> - -<div class="cols"> - <div class="col-6"> - -<p>From here the user can:</p> -<ul> -<li>Select additional data items by touching them.</li> -<li>Trigger an action from the CAB that applies to all highlighted data items. The CAB then - automatically dismisses itself.</li> -<li>Dismiss the CAB via the navigation bar's Back button or the CAB's checkmark button. This removes - the CAB along with all selection highlights.</li> -</ul> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/selection_cab_example.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-6"> - -<h4>Selecting CAB actions</h4> -<p>You can decide which actions and elements appear in the CAB. Use the guidelines in the <a href="actionbar.html">Action Bar -pattern</a> to decide which items to surface at the top level and which to move to the -action overflow.</p> -<h4>Dynamically adjust CAB actions</h4> -<p>In most cases you need to adjust the actions in the CAB dynamically as the user adds more items to -the selection. Actions that apply to a single selected data item don't necessarily apply to multiple -selected data items of the same kind.</p> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/selection_adjusting_actions.png"> - <div class="figure-caption"> - Adjusting actions in the CAB as additional items are selected. - </div> - - </div> -</div> - -<div class="note develop"> -<p><strong>Developer Guide</strong></p> - <p>For information about how to create a contextual action bar, read - <a href="{@docRoot}guide/topics/ui/menus.html#CAB">Using the contextual action mode</a>.</p> -</div> - - -<h2 id="checklist">Checklist</h2> - -<ul> -<li> -<p>Whenever your app supports the selection of multiple data items, make use of the contextual action - bar (CAB).</p> -</li> -<li> -<p>Reserve the long press gesture for selection exclusively. Don't use it to display traditional - contextual menus.</p> -</li> -<li> -<p>If you don't support multi-selection within a list, long press should do nothing.</p> -</li> -<li> -<p>Plan the actions you want to display inside of a CAB in the same way you would plan the actions - inside your app's action bar.</p> -</li> -</ul> diff --git a/docs/html/design/patterns/settings.jd b/docs/html/design/patterns/settings.jd deleted file mode 100644 index 9ba837af0635..000000000000 --- a/docs/html/design/patterns/settings.jd +++ /dev/null @@ -1,708 +0,0 @@ -page.title=Settings -page.tags=preferences,sharedpreferences -@jd:body - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/patterns/settings.html"> - <div> - <h3>Material Design</h3> - <p>Settings<p> - </div> -</a> - -<a class="notice-developers" href="{@docRoot}guide/topics/ui/settings.html"> - <div> - <h3>Developer Docs</h3> - <p>Settings</p> - </div> -</a> - - -<p itemprop="description">Settings is a place in your app where users indicate their preferences for how your app should -behave. This benefits users because:</p> - -<ul> -<li>You don't need to interrupt them with the same questions over and over when certain situations -arise. The settings predetermine what will always happen in those situations (see design -principle: <a href="{@docRoot}design/get-started/principles.html#decide-for-me">Decide for me but -let me have the final say</a>).</li> -<li>You help them feel at home and in control (see design principle: -<a href="{@docRoot}design/get-started/principles.html#make-it-mine">Let me make it mine</a>).</li> -</ul> - -<h2 id="flow-structure">Flow and Structure</h2> - -<h4 id="settings-access">Provide access to Settings in the action overflow</h4> - -<p>Settings is given low prominence in the UI because it's not frequently needed. Even if there's -room in the <a href="{@docRoot}design/patterns/actionbar.html">action bar</a>, never make Settings -an action button. Always keep it in the action overflow and label it "Settings". Place it below -all other items except "Help".</p> - -<img src="{@docRoot}design/media/settings_overflow.png"> - -<div class="vspace size-2"> </div> - -<h4 id="what-to-make-a-setting">Avoid the temptation to make everything a setting</h4> - -<p>Because Settings is a few navigational steps away, no matter how many items you have, they'll -never clutter up the core part of your UI. This may seem like good news, but it also poses a -challenge.</p> - -<p>Settings can be a tempting place to keep a lot of stuff—like a hall closet where things -get stashed when you tidy up before company comes over. It's not a place where you spend lots of -time, so it's easy to rationalize and ignore its cluttered condition. But when users visit -Settings—however infrequently—they'll have the same expectations for the experience as -they do everywhere else in your app. More settings means more choices to make, and too many are -overwhelming.</p> - -<p>So don't punt on the difficult product decisions and debates that can bring on the urge to -"just make it a setting". For each control you're considering adding to Settings, make sure it -meets the bar:</p> - -<img src="{@docRoot}design/media/settings_flowchart.png"> - -<div class="vspace size-3"> </div> - -<div class="cols"> - <div class="col-5 with-callouts"> - -<h4 id="group-settings">If you still have lots of settings, group related settings together</h4> - -<p>The number of items an average human can hold in short-term memory is 7±2. If you -present a list of 10 or more settings (even after applying the criteria above), users will have -more difficulty scanning, comprehending, and processing them.</p> - -<p>You can remedy this by dividing some or all of the settings into groups, effectively turning -one long list into multiple shorter lists. A group of related settings can be presented in one of -two ways:</p> - -<ol> -<li><h4>Under a section divider</h4></li> -<li><h4>In a separate subscreen</h4></li> -</ol> - -<p>You can use one or both these grouping techniques to organize your app's settings.</p> - -<p>For example, in the main screen of the Android Settings app, each item in the list navigates -to a subscreen of related settings. In addition, the items themselves are grouped under section -dividers.</p> - - </div> - <div class="col-8"> - - <img src="{@docRoot}design/media/settings_grouping.png"> - - </div> -</div> - -<p>Grouping settings is not an exact science, but here's some advice for how to approach it, based -on the total number of settings in your app.</p> - -<div class="vspace size-1"> </div> - -<div class="cols"> - <div class="col-2"> - -<h4>7 or fewer</h4> - - </div> - <div class="col-11"> - -<p>Don't group them at all. It won't benefit users and will seem like overkill.</p> - - </div> -</div> - -<div class="cols"> - <div class="col-2"> - -<h4>8 to 10</h4> - - </div> - <div class="col-11"> - -<p>Try grouping related settings under 1 or 2 section dividers. If you have any "singletons" -(settings that don't relate to any other settings and can't be grouped under your section -dividers), treat them as follows:</p> - -<ul> -<li>If they include some of your most important settings, list them at the top without a section -divider.</li> -<li>Otherwise, list them at the bottom with a section divider called "OTHER", in order of -importance.</li> -</ul> - - </div> -</div> - -<div class="cols"> - <div class="col-2"> - -<h4>11 to 15</h4> - - </div> - <div class="col-11"> - -<p>Same advice as above, but try 2 to 4 section dividers.</p> - -<p>Also, try the following to reduce the list:</p> - -<ul> -<li>If 2 or more of the settings are mainly for power users, move them out of your main Settings -screen and into an "Advanced" subscreen. Place an item in the action overflow called "Advanced" to -navigate to it.</li> -<li>Look for "doubles": two settings that relate to one another, but not to any other settings. -Try to combine them into one setting, using the design patterns described later in this section. -For example, you might be able to redesign two related checkbox settings into one multiple choice -setting.</li> -</ul> - - </div> -</div> - -<div class="cols"> - <div class="col-2"> - -<h4>16 or more</h4> - - </div> - <div class="col-11"> - -<p>If you have any instances of 4 or more related settings, group them under a subscreen. Then use -the advice suggested above for the reduced list size.</p> - - </div> -</div> - - -<h2 id="patterns">Design Patterns</h2> - -<div class="cols"> - <div class="col-3"> - -<h4>Checkbox</h4> -<p>Use this pattern for a setting that is either selected or not selected.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_checkbox.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Multiple choice</h4> -<p>Use this pattern for a setting that needs to present a discrete set of options, from which the -user can choose only one.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_multiple_choice.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Slider</h4> -<p>Use this pattern for a setting where the range of values are not discrete and fall along a -continuum.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_slider.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Date/time</h4> -<p>Use this pattern for a setting that needs to collect a date and/or time from the user.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_date_time.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Subscreen navigation</h4> -<p>Use this pattern for navigating to a subscreen or sequence of subscreens that guide the user -through a more complex setup process.</p> -<ul> -<li>If navigating to a single subscreen, use the same title in both the subscreen and the label -navigating to it.</li> -<li>If navigating to a sequence of subscreens (as in this example), use a title that describes the -first step in the sequence.</li> -</ul> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_subscreen_navigation.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>List subscreen</h4> -<p>Use this pattern for a setting or category of settings that contains a list of equivalent items. -</p> -<p>The label provides the name of the item, and secondary text may be used for status. (In this -example, status is reinforced with an icon to the right of the label.) Any actions associated with -the list appear in the action bar rather than the list itself.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_list_subscreen.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Master on/off switch</h4> -<p>Use this pattern for a category of settings that need a mechanism for turning on or off as a -whole.</p> -<p>An on/off switch is placed as the first item in the action bar of a subscreen. When the switch -is turned off, the items in the list disappear, replaced by text that describes why the list is -empty. If any actions require the switch to be on, they become disabled.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_master_on_off.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<div class="vspace size-2"> </div> - -<p>You can also echo the master on/off switch in the menu item that leads to the subscreen. -However, you should only do this in cases where users rarely need to access the subscreen once -it's initially set up and more often just want to toggle the switch.</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_master_on_off_2.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Individual on/off switch</h4> -<p>Use this pattern for an individual setting that requires a more elaborate description than can -be provided in checkbox form.</p> -<p>The on/off switch only appears in the subscreen so that users aren't able to toggle it without -also being exposed to the descriptive text. Secondary text appears below the setting label to -reflect the current selection.</p> -<p>In this example, Android Beam is on by default. Since users might not know what this setting -does, we made the status more descriptive than just "On".</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_individual_on_off.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-3"> - -<h4>Dependency</h4> -<p>Use this pattern for a setting that changes availability based on the value of another setting. -</p> -<p>The disabled setting appears below its dependency, without any indentation. If the setting -includes a status line, it says "Unavailable", and if the reason isn't obvious, a brief -explanation is included in the status.</p> -<p>If a given setting is a dependency to 3 or more settings, consider using a subscreen with a -master on/off switch so that your main settings screen isn't cluttered by lots of disabled items. -</p> - - </div> - <div class="col-10"> - -<img src="{@docRoot}design/media/settings_dependency.png"> - - </div> -</div> - -<h2 id="defaults">Defaults</h2> - -<p>Take great care in choosing default values for each of your settings. Because settings -determine app behavior, your choices will contribute to users' first impressions of your app. Even -though users can change settings, they'll expect the initial states to be sensible. The following -questions (when applicable) may help inform your decisions:</p> - -<ul> -<li>Which choice would most users be likely to choose on their own if there were no default?</li> -<li>Which choice is the most neutral or middle-of-the-road?</li> -<li>Which choice is the least risky, controversial, or over-the-top?</li> -<li>Which choice uses the least amount of battery or mobile data?</li> -<li>Which choice best supports the design principle -<a href="{@docRoot}design/get-started/principles.html#never-lose-my-stuff">Never lose my stuff</a>?</li> -<li>Which choice best supports the design principle -<a href="{@docRoot}design/get-started/principles.html#interrupt-only-if-important">Only interrupt -me if it's important</a>? -</li> -</ul> - -<h2 id="writing">Writing Guidelines</h2> - -<h4>Label clearly and concisely</h4> - -<p>Writing a good label for a setting can be challenging because space is very limited. You only -get one line, and it's incredibly short on the smallest of devices. Follow these guidelines to -make your labels brief, meaningful, and scannable:</p> - -<ul> -<li>Write each label in sentence case (i.e. only the first word and proper nouns are capitalized). -</li> -<li>Don't start a label with an instructional verb like "Set", "Change", "Edit", "Modify", -"Manage", "Use", "Select", or "Choose". Users already understand that they can do these things to -settings.</li> -<li>Likewise, don't end a label with a word like "setting" or "settings". It's already implied. -</li> -<li>If the setting is part of a grouping, don't repeat the word(s) used in the section divider or -subscreen title.</li> -<li>Avoid starting a label with a negative word like "Don't" or "Never". For example, "Don't -allow" could be rephrased to "Block".</li> -<li>Steer clear of technical jargon as much as possible, unless it's a term widely understood by -your target users. Use common verbs and nouns to convey the setting's purpose rather than its -underlying technology.</li> -<li>Don't refer to the user. For example, for a setting allowing the user to turn notifications on -or off, label it "Notifications" instead of "Notify me".</li> -</ul> - -<p>Once you've decided on labels for your settings, be sure to preview them on an -<a href="{@docRoot}design/style/metrics-grids.html">LDPI handset</a> in portrait to make sure -they'll fit everywhere.</p> - -<h4>Secondary text below is for status, not description…</h4> - -<p>Before Ice Cream Sandwich, we often displayed secondary text below a label to further describe -it or provide instructions. Starting in Ice Cream Sandwich, we're using secondary text for status. -</p> - -<div class="cols"> - <div class="col-4"> - - <div class="do-dont-label bad emulate-content-left-padding">Before</div> - - <table class="ui-table bad emulate-content-left-padding"> - <thead> - <tr> - <th class="label"> - Screen timeout - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Adjust the delay before the screen automatically turns off - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-4"> - - <div class="do-dont-label good">After</div> - - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - Sleep - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - After 10 minutes of inactivity - </td> - </tr> - </tbody> - </table> - - </div> -</div> - -<p>Status in secondary text has the following benefits:</p> -<ul> -<li>Users can see at a glance what the current value of a setting is without having to navigate -any further.</li> -<li>It applies the design principle -<a href="{@docRoot}design/get-started/principles.html#keep-it-brief">Keep it brief</a>, which -users greatly appreciate.</li> -</ul> - -<h4>…unless it's a checkbox setting</h4> -<p>There's one important exception to the using secondary text for status: checkbox settings. -Here, use secondary text for description, not status. Status below a checkbox is unnecessary -because the checkbox already indicates it. The reason why it's appropriate to have a description -below a checkbox setting is because—unlike other controls—it doesn't display a dialog -or navigate to another screen where additional information can be provided.</p> - -<p>That said, if a checkbox setting's label is clear enough on its own, there's no need to also -provide a description. Only include one if necessary.</p> - -<p>Follow these guidelines to write checkbox setting descriptions:</p> -<ul> -<li>Keep it to one sentence and don't use ending punctuation.</li> -<li>Convey what happens when the setting is checked, phrased in the form of a command. Example: -"Allow data exchange", not "Allows data exchange".</li> -<li>Avoid repetition by choosing words that don't already appear in the label.</li> -<li>Don't refer to the user unless it's necessary for understanding the setting.</li> -<li>If you must refer to the user, do so in the second person ("you") rather than the first person -("I"). Android speaks to users, not on behalf of them.</li> -</ul> - -<h4>Writing examples</h4> - -<p>The following are examples of changes we made to labels and secondary text in the Settings app -in Ice Cream Sandwich.</p> - -<div class="cols"> - <div class="col-4"> - - <div class="do-dont-label bad emulate-content-left-padding">Before</div> - - <table class="ui-table bad emulate-content-left-padding"> - <thead> - <tr> - <th class="label"> - Use tactile feedback - </th> - </tr> - </thead> - </table> - - </div> - <div class="col-4"> - - <div class="do-dont-label good">After</div> - - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - Vibrate on touch - </th> - </tr> - </thead> - </table> - - </div> - <div class="col-5"> - -<p>In this checkbox setting, we eliminated the throwaway word "Use" and rephrased the label to be -more direct and understandable.</p> - - </div> - -</div> - -<div class="cols"> - <div class="col-4"> - - <div class="do-dont-label bad emulate-content-left-padding">Before</div> - - <table class="ui-table bad emulate-content-left-padding"> - <thead> - <tr> - <th class="label"> - Screen timeout - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Adjust the delay before the screen automatically turns off - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-4"> - - <div class="do-dont-label good">After</div> - - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - Sleep - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - After 10 minutes of inactivity - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-5"> - -<p>In this multiple choice setting, we changed the label to a friendlier term and also replaced -the description with status. We put some descriptive words around the selected value, "10 -minutes", because on its own, the meaning could be misinterpreted as "sleep for 10 minutes".</p> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <div class="do-dont-label bad emulate-content-left-padding">Before</div> - - <table class="ui-table bad emulate-content-left-padding"> - <thead> - <tr> - <th class="label"> - Change screen lock - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Change or disable pattern, PIN, or password security - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-4"> - - <div class="do-dont-label good">After</div> - - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - Screen lock - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Pattern - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-5"> - -<p>This setting navigates to a a sequence of subscreens that allow users to choose a type of -screen lock and then set it up. We eliminated the throwaway word "Change" in the label, and -replaced the description with the current type of screen lock set up by the user. If the user -hasn't set up a screen lock, the secondary text says "None".</p> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <div class="do-dont-label bad emulate-content-left-padding">Before</div> - - <table class="ui-table bad emulate-content-left-padding"> - <thead> - <tr> - <th class="label"> - NFC - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Use Near Field Communication to read and exchange tags - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-4"> - - <div class="do-dont-label good">After</div> - - <table class="ui-table good"> - <thead> - <tr> - <th class="label"> - NFC - </th> - </tr> - </thead> - <tbody> - <tr> - <td class="secondary-text"> - Allow data exchange when the phone touches another device - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-5"> - -<p>In this checkbox setting—although it's technical jargon—we kept the "NFC" label -because: (1) we couldn't find a clear, concise alternative, and (2) user familiarity with the -acronym is expected to increase dramatically in the next couple of years.</p> -<p>We did, however, rewrite the description. It's far less technical than before and does a better -job of conveying how and why you'd use NFC. We didn't include what the acronym stands for because -it doesn't mean anything to most users and would have taken up a lot of space.</p> - - </div> -</div> - - - -<h2 id="checklist">Checklist</h2> -<ul> -<li><p>Make sure each item in Settings meets the criteria for belonging there.</p></li> -<li><p>If you have more than 7 items, explore ways to group related settings.</p></li> -<li><p>Use design patterns wherever applicable so users don't face a learning curve.</p></li> -<li><p>Choose defaults that are safe, neutral, and fit the majority of users.</p></li> -<li><p>Give each setting a clear, concise label and use secondary text appropriately.</p></li> -</ul> diff --git a/docs/html/design/style/branding.jd b/docs/html/design/style/branding.jd deleted file mode 100644 index 5995d03d589d..000000000000 --- a/docs/html/design/style/branding.jd +++ /dev/null @@ -1,128 +0,0 @@ -page.title=Your Branding -page.tags=branding,logo -@jd:body - -<p>Following Android design patterns doesn't mean that your app has to look the same as -everyone else's. In Android, your app can shine as an extension of your brand. </p> - -<h2 id="color">Color</h2> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/color.html#color-ui-color-application"> - <div> - <h3>Material Design</h3> - <p>UI Color Application<p> - </div> -</a> - -<p>Use your brand color for accent by overriding the Android framework's default blue in UI elements like checkboxes, progress bars, radio buttons, sliders, tabs, and scroll indicators.</p> - -<p>Look for opportunities to use high-contrast color for emphasis, for example, as the background color of the action bar or a primary button. But don't go overboard: not all actions are equal, so use it only for the one or two most important things.</p> -<p>When customizing colors, <a href="{@docRoot}design/style/touch-feedback.html">touch feedback</a> - should be subtle — just slightly lighter or darker than the untouched color.</p> - -<div class="vspace size-1"> </div> - -<div class="cols"> - <div class="col-6"> - <img src="{@docRoot}design/media/branding_wallet.png" style="width:94%"> - <div class="figure-caption"> - The four colors of the Google Wallet logo provide a playful accent to the four dots - that appear as the user enters a PIN. - </div> - </div> - <div class="col-6"> - <img src="{@docRoot}design/media/branding_googlemusic.png" style="width:94%"> - <div class="figure-caption"> - The Google Play Music app has an orange theme color, which is used for emphasis - in the action bar and for accent in the selected tab, scroll indicator, and - hyperlinks. - </div> - </div> -</div> - -<h2 id="logo">Logo</h2> - -<p>Your app's <a href="{@docRoot}design/style/iconography.html#launcher">launcher icon</a> is - a key place to incorporate your logo, because it's what - users will look for and touch to begin using your app. You can carry the launcher - icon through to all the screens in your app by showing it in the - <a href="{@docRoot}design/patterns/actionbar.html">action bar</a> along - with the name of the app.</p> - -<p>Another approach to consider is to have your logo take the place of the launcher icon -and app name in the action bar.</p> - - -<div class="vspace size-1"> </div> - -<div class="cols"> - <div class="col-6" style="padding-top:24px;"> - <img src="{@docRoot}design/media/branding_launcher_icon.png" style="width:60px;float:left;padding-right:1em;"> - <div class="figure-caption" style="width:290px;margin-left:20px;"> - Google+ reinforces its brand by carrying its launcher icon through to the action bar. - </div> - <img src="{@docRoot}design/media/branding_logo_icon_action_bar.png" style="width:320px;float:left;padding-right:1em;"> - </div> - <div class="col-6"> - <img src="{@docRoot}design/media/yourbranding_app.png" style="width:320px;"> - <div class="figure-caption" style="width:320px;"> - Example of a the logo in the action bar. This works well in cases where the brand's logo matches the name of the app. - </div> - </div> -</div> - -<h2 id="logo">Icons</h2> - -<a class="notice-designers-material" href="http://www.google.com/design/spec/style/icons.html"> - <div> - <h3>Material Design</h3> - <p>Icons<p> - </div> -</a> - -<p>If you have icons that you're already using for your app on other platforms -and they have a distinctive look intended to fit your brand, use them on your -Android app as well. <strong>If you take this approach, make sure your brand styling is -applied to every single icon in your app.</strong></p> - - -<div class="cols"> - <div class="col-6"> - <p>One exception: For any icon in your existing set where the symbol is different from - Android's, use Android's symbol but give it your brand's styling. That way, users will - understand what the purpose of the icon is based on what they've learned in other - Android apps (Design principle: - <a href="{@docRoot}design/get-started/principles.html#give-me-tricks">Give me tricks that - work everywhere</a>). But the icon will still look like it belongs with all of - your other icons as a part of your brand.</p> - - </div> - - <div class="col-6"> - <img src="{@docRoot}design/media/yourbranding_in-app-icons.png" style="width:300px;margin:12px 48px 0 16px;"> - </div> - </div> -</div> - -<div class="cols"> - <div class="col-6"> - <p><strong>Example</strong>:<br /> - </p> - <p>The brand's normal icon for sharing on other platforms is a right arrow. - </div> - - <div class="col-6 lasyout-with-list-item-margins"> - - <div style="margin-bottom:1em;"> - <span class="do-dont-label bad" style="margin-left:12px">Don't</span> - <span style="margin-left: 64px;" class="do-dont-label good"><strong>Do</strong></span> - </div> - <img src="{@docRoot}design/media/yourbranding_sharing.png" style="width:180px;"> - </div> -</div> - -<p>What if you don't already have your own icons — for example, if you're creating a -brand new app only for Android? In this case, use Android's standard icons and rely -more on color and logo for branding. Get the Action Bar Icon Pack, available for free -in <a href="{@docRoot}design/downloads/index.html">Downloads</a>.</p> diff --git a/docs/html/design/style/color.jd b/docs/html/design/style/color.jd deleted file mode 100644 index 4c5f5abb3b6c..000000000000 --- a/docs/html/design/style/color.jd +++ /dev/null @@ -1,141 +0,0 @@ -page.title=Color -@jd:body - -<style> - .color-row { - width: 760px; - margin:0; - - display: -webkit-box; - display: -moz-box; - display: box; - - -webkit-box-orient: horizontal; - -moz-box-orient: horizontal; - box-orient: horizontal; - - cursor: pointer; - - -webkit-user-select: none; - user-select: none; - /* nested user-select in FF is broken as of Jan 2012, don't use it */ - } - - .color-row-container { - line-height: 0; /* to remove more top space in FF for -moz-box elements */ - } - - .color-row-container + .color-row-container { - margin-top: -10px !important; - } - - .color-row li { - margin-left: 0 !important; - position: relative; - list-style-type: none; - height: 80px; - display: block; - - -webkit-box-flex: 1; - -moz-box-flex: 1; - box-flex: 1; - } - - .color-row li:before { - display: none; - } - - .color-row li.thin { - height: 40px; - } - - .color-row li span { - display: none; - position: absolute; - top: -30px; - left: 50%; - margin-left: -2.5em; - width: 5em; - background-color: #fff; - padding: 10px; - font-weight: 600; - line-height: 20px; - text-align: center; - box-shadow: 0 5px 5px rgba(0,0,0,0.1); - cursor: text; - - -webkit-user-select: text; - user-select: text; - /* nested user-select in FF is broken as of Jan 2012, don't use it */ - } - - .color-row li:hover span { - display: block; - } - - /* triangle callout */ - .color-row li span:after { - content: ''; - display: block; - position: absolute; - left: 50%; - bottom: -16px; - border: 8px solid transparent; - border-top-color: #fff; - width: 0; - height: 0; - margin-left: -8px; - } -</style> - -<a class="notice-designers-material" href="http://www.google.com/design/spec/style/color.html"> - <div> - <h3>Material Design</h3> - <p>Color<p> - </div> -</a> - -<p>Use color primarily for emphasis. Choose colors that fit with your brand and provide good contrast -between visual components. Note that red and green may be indistinguishable to color-blind users.</p> - - <div class="color-row-container"> - <ul class="color-row"> - <li><span>#33b5e5</span></li> - <li><span>#aa66cc</span></li> - <li><span>#99cc00</span></li> - <li><span>#ffbb33</span></li> - <li><span>#ff4444</span></li> - </ul> - </div> - - <div class="color-row-container"> - <ul class="color-row"> - <li class="thin"><span>#0099cc</span></li> - <li class="thin"><span>#9933cc</span></li> - <li class="thin"><span>#669900</span></li> - <li class="thin"><span>#ff8800</span></li> - <li class="thin"><span>#cc0000</span></li> - </ul> - </div> - -<h2 id="palette">Palette</h2> - -<p>Blue is the standard accent color in Android's color palette. Each color has a corresponding darker -shade that can be used as a complement when needed.</p> -<p><a onClick="ga('send', 'event', 'Design', 'Download', 'Color Swatches (@color page)');" - href="{@docRoot}downloads/design/Android_Design_Color_Swatches_20120229.zip">Download the swatches</a></p> - -<img src="{@docRoot}design/media/color_spectrum.png"> - -<script> - $(document).ready(function() { - $('.color-row li').each(function() { - var color = $(this).text(); - $(this).css('background-color', color); - $(this).find('span') - .css('color', color) - .text(color.toUpperCase()); - }); - - }); -</script> diff --git a/docs/html/design/style/iconography.jd b/docs/html/design/style/iconography.jd deleted file mode 100644 index 8b6f3abc1fd7..000000000000 --- a/docs/html/design/style/iconography.jd +++ /dev/null @@ -1,601 +0,0 @@ -page.title=Iconography -page.tags="icons" -meta.tags="icons, googleplay, listing, branding" -page.titleFriendly=Guidelines for creating your app's icons -@jd:body - -<img src="{@docRoot}design/media/iconography_overview.png"> - - -<p>An icon is a graphic that takes up a small portion of screen real estate and provides a quick, -intuitive representation of an action, a status, or an app.</p> - -<p>When you design icons for your app, it's important to keep in mind that your -app may be installed on a variety of devices that offer a range of -pixel densities, as mentioned in -<a href="{@docRoot}design/style/devices-displays.html">Devices -and Displays</a>. But you can make your icons look great on all devices -by providing each icon in multiple sizes. When your app runs, Android checks the characteristics of -the device screen and loads the appropriate density-specific assets for your app. </p> - -<p>Because you will deliver each icon in multiple sizes to support different densities, -the design guidelines below -refer to the icon dimensions in <acronym title="density-independent pixels">dp</acronym> -units, which are based on the pixel dimensions of a medium-density (MDPI) screen.</p> - -<img src="{@docRoot}design/media/devices_displays_density@2x.png" alt="" height="160" /> - -<p>So, to create an icon for different densities, you should follow the <strong>2:3:4:6:8 -scaling ratio</strong> between the five primary densities (medium, high, x-high, xx-high, and -xxx-high respectively). For example, consider that the size for a launcher icon is specified to be -48x48 dp. This means the baseline (MDPI) asset is 48x48 px, and the -high-density(HDPI) asset should be 1.5x the baseline at 72x72 px, and the x-high -density (XHDPI) asset should be 2x the baseline at 96x96 px, and so on.</p> - -<p class="note"><strong>Note:</strong> Android also supports low-density (LDPI) screens, -but you normally don't need to create custom assets at this size because Android -effectively down-scales your HDPI assets by 1/2 to match the expected size.</p> - - - - -<h2 id="launcher">Launcher</h2> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/icons.html#icons-product-icons"> - <div> - <h3>Material Design</h3> - <p>Product Icons<p> - </div> -</a> - -<p>The launcher icon is the visual representation of your app on the Home or All Apps screen. Since the -user can change the Home screen's wallpaper, make sure that your launcher icon is clearly visible on -any type of background.</p> - -<div class="cols"> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_launcher_size.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_launcher_focal.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_launcher_style.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <h4>Sizes & scale</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Launcher icons on a mobile device must be <strong>48x48 <acronym title="Density-independent pixels. One dp is one pixel on a 160 dpi screen.">dp</acronym></strong>.</p></li> - <li class="no-bullet with-icon web"> - <p>Launcher icons for display on Google Play must be <strong>512x512 pixels</strong>.</p></li> - </ul> - - </div> - <div class="col-4"> - - <h4>Proportions</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Full asset, <strong>48x48 dp</strong></p> - </li> - </ul> - - </div> - <div class="col-4"> - -<h4>Style</h4> -<p>Use a distinct silhouette. Three-dimensional, front view, with a slight perspective as if viewed -from above, so that users perceive some depth.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-4"> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/iconography_launcher_example.png"> - - </div> - <!-- 2 free columns --> -</div> - -<div class="cols"> - <div class="col-12"> - - <img src="{@docRoot}design/media/iconography_launcher_example2.png"> - - <div class="vspace size-2"> </div> - - </div> - <!-- 1 free columns --> -</div> - - -<h2 id="action-bar">Action Bar</h2> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/icons.html#icons-system-icons"> - <div> - <h3>Material Design</h3> - <p>System Icons<p> - </div> -</a> - -<p> - -Action bar icons are graphic buttons that represent the most important actions people can take -within your app. Each one should employ a simple metaphor representing a single concept that most -people can grasp at a glance. - -</p> -<p> - -Pre-defined glyphs should be used for certain common actions such as "refresh" and "share." The -download link below provides a package with icons that are scaled for various screen densities and -are suitable for use with the Holo Light and Holo Dark themes. The package also includes unstyled -icons that you can modify to match your theme, in addition to Adobe® Illustrator® source -files for further customization. - -</p> -<p> -<a onClick="ga('send', 'event', 'Design', 'Download', 'Action Bar Icons (@iconography page)');" - href="{@docRoot}downloads/design/Android_Design_Icons_20131106.zip">Download the Action Bar Icon Pack</a> -</p> - -<div class="cols"> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_actionbar_size.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_actionbar_focal.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_actionbar_style.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <h4>Sizes & scale</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Action bar icons for phones should be <strong>32x32 <acronym title="Density-independent pixels. One dp is one pixel on a 160 dpi screen.">dp</acronym></strong>.</p></li> - </ul> - - </div> - <div class="col-4"> - - <h4>Focal area & proportions</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Full asset, <strong>32x32 dp</strong></p> - <p>Optical square, <strong>24x24 dp</strong></p> - </li> - </ul> - - </div> - <div class="col-4"> - -<h4>Style</h4> -<p>Pictographic, flat, not too detailed, with smooth curves or sharp shapes. If the graphic is thin, -rotate it 45° left or right to fill the focal space. The thickness of the strokes and negative -spaces should be a minimum of 2 dp.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-3"> - -<h4>Colors</h4> -<p>Colors: <strong>#333333</strong><br /> -Enabled: <strong>60%</strong> opacity<br /> -Disabled: <strong>30%</strong> opacity</p> -<div class="vspace size-1"> </div> - -<p>Colors: <strong>#FFFFFF</strong><br /> -Enabled: <strong>80%</strong> opacity<br /> -Disabled: <strong>30%</strong> opacity</p> - - </div> - <div class="col-9"> - - <img src="{@docRoot}design/media/iconography_actionbar_colors.png"> - - </div> -</div> - - -<h2 id="small-contextual">Small / Contextual Icons</h2> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/icons.html#icons-system-icons"> - <div> - <h3>Material Design</h3> - <p>System Icons<p> - </div> -</a> - -<p>Within the body of your app, use small icons to surface actions and/or provide status for specific -items. For example, in the Gmail app, each message has a star icon that marks the message as -important.</p> - - -<div class="cols"> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_small_size.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_small_focal.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_small_style.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <h4>Sizes & scale</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Small icons should be <strong>16x16 <acronym title="Density-independent pixels. One dp is one pixel on a 160 dpi screen.">dp</acronym></strong>.</p></li> - </ul> - - </div> - <div class="col-4"> - - <h4>Focal area & proportions</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Full asset, <strong>16x16 dp</strong></p> - <p>Optical square, <strong>12x12 dp</strong></p> - </li> - </ul> - - </div> - <div class="col-4"> - -<h4>Style</h4> -<p>Neutral, flat, and simple. Filled shapes are easier to see than thin strokes. Use a single visual -metaphor so that a user can easily recognize and understand its purpose.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_small_colors.png"> - - <div class="vspace size-2"> </div> - -<h4>Colors</h4> -<p>Use non-neutral colors sparingly and with purpose. For example, Gmail uses yellow in the star icon -to indicate a bookmarked message. If an icon is actionable, choose a color that contrasts well with -the background.</p> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/iconography_small_example.png"> - - </div> - <!-- 2 free columns --> -</div> - - -<h2 id="notification">Notification Icons</h2> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/icons.html#icons-system-icons"> - <div> - <h3>Material Design</h3> - <p>System Icons<p> - </div> -</a> - - -<p>If your app generates notifications, provide an icon that the system can display in the status bar -whenever a new notification is available.</p> - - -<div class="cols"> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_notification_size.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_notification_focal.png"> - - </div> - <div class="col-4"> - - <img src="{@docRoot}design/media/iconography_notification_style.png"> - - </div> -</div> - -<div class="cols"> - <div class="col-4"> - - <h4>Sizes & scale</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Notification icons must be <strong>24x24 <acronym title="Density-independent pixels. One dp is one pixel on a 160 dpi screen.">dp</acronym></strong>.</p></li> - </ul> - - </div> - <div class="col-4"> - - <h4>Focal area & proportions</h4> - - <ul> - <li class="no-bullet with-icon tablet"> - <p>Full asset, <strong>24x24 dp</strong></p> - <p>Optical square, <strong>22x22 dp</strong></p> - </li> - </ul> - - </div> - <div class="col-4"> - -<h4>Style</h4> -<p>Keep the style flat and simple, using the same single, visual metaphor as your launcher icon.</p> - - </div> -</div> - - -<div class="cols"> - <div class="col-4"> - -<h4>Colors</h4> -<p>Notification icons must be entirely white. Also, the system may scale down and/or darken the icons.</p> - - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/iconography_notification_example.png"> - - </div> - <!-- 2 free columns --> -</div> - - - - - - - - - - -<h2 id="DesignTips">Design Tips</h2> - -<p>Here are some tips you might find useful as you create icons or other -drawable assets for your application. These tips assume you are using -Adobe® Photoshop® or a similar raster and vector image-editing program.</p> - - - - -<h3>Use vector shapes where possible</h3> - -<p>Many image-editing programs such as Adobe® Photoshop® allow you to use a -combination of vector shapes and raster layers and effects. When possible, -use vector shapes so that if the need arises, assets can be scaled up without -loss of detail and edge crispness.</p> - -<p>Using vectors also makes it easy to align edges and corners to pixel -boundaries at smaller resolutions.</li> - - - -<h3>Start with large artboards</h3> - -<p>Because you will need to create assets for different screen densities, -it is best to start your icon -designs on large artboards with dimensions that are multiples of the target icon -sizes. For example, launcher icons are 48, 72, 96, or 144 pixels wide, -depending on screen density (mdpi, hdpi, xhdpi, and xxhdpi, respectively). If you -initially draw launcher icons on an 864x864 artboard, it will be easier and -cleaner to adjust the icons when you scale the artboard down to the target -sizes for final asset creation.</p> - - - -<h3>When scaling, redraw bitmap layers as needed</h3> - -<p>If you scaled an image up from a bitmap layer, rather than from a vector -layer, those layers will need to be redrawn manually to appear crisp at higher -densities. For example if a 60x60 circle was painted as a bitmap for -mdpi it will need to be repainted as a 90x90 circle for hdpi.</p> - - - -<h3>Use common naming conventions for icon assets</h3> - -<p>Try to name files so that related assets will group together inside a -directory when they are sorted alphabetically. In particular, it helps to use a -common prefix for each icon type. For example:</p> - -<table> -<tr> -<th>Asset Type</th> -<th>Prefix</th> -<th>Example</th> -</tr> -<tr> -<td>Icons</td> -<td><code>ic_</code></td> -<td><code>ic_star.png</code></td> -</tr> -<tr> -<td>Launcher icons</td> -<td><code>ic_launcher</code></td> -<td><code>ic_launcher_calendar.png</code></td> -</tr> -<tr> -<td>Menu icons and Action Bar icons</td> -<td><code>ic_menu</code></td> -<td><code>ic_menu_archive.png</code></td> -</tr> -<tr> -<td>Status bar icons</td> -<td><code>ic_stat_notify</code></td> -<td><code>ic_stat_notify_msg.png</code></td> -</tr> -<tr> -<td>Tab icons</td> -<td><code>ic_tab</code></td> -<td><code>ic_tab_recent.png</code></td> -</tr> -<tr> -<td>Dialog icons</td> -<td><code>ic_dialog</code></td> -<td><code>ic_dialog_info.png</code></td> -</tr> -</table> - -<p>Note that you are not required to use a shared prefix of any -type—doing so is for your convenience only.</p> - - -<h3>Set up a working space that organizes files by density</h3> - -<p>Supporting multiple screen densities means you must create multiple versions -of the same icon. To help keep the multiple copies of files safe and easier to -find, we recommend creating a directory structure in your working space that -organizes asset files based on the target density. For example:</p> - -<pre> -art/... - mdpi/... - _pre_production/... - <em>working_file</em>.psd - <em>finished_asset</em>.png - hdpi/... - _pre_production/... - <em>working_file</em>.psd - <em>finished_asset</em>.png - xhdpi/... - _pre_production/... - <em>working_file</em>.psd - <em>finished_asset</em>.png - xxhdpi/... - _pre_production/... - <em>working_file</em>.psd - <em>finished_asset</em>.png -</pre> - -<p>Because the structure in your working space is similar to that of the application, you -can quickly determine which assets should be copied to each -resources directory. Separating assets by density also helps you detect any -variances in filenames across densities, which is important because -corresponding assets for different densities must share the same filename.</p> - -<p>For comparison, here's the resources directory structure of a typical -application: </p> - -<pre>res/... - drawable-ldpi/... - <em>finished_asset</em>.png - drawable-mdpi/... - <em>finished_asset</em>.png - drawable-hdpi/... - <em>finished_asset</em>.png - drawable-xhdpi/... - <em>finished_asset</em>.png - drawable-xxhdpi/... - <em>finished_asset</em>.png - - mipmap-ldpi/... - <em>finished_launcher_asset</em>.png - mipmap-mdpi/... - <em>finished_launcher_asset</em>.png - mipmap-hdpi/... - <em>finished_launcher_asset</em>.png - mipmap-xhdpi/... - <em>finished_launcher_asset</em>.png - mipmap-xxhdpi/... - <em>finished_launcher_asset</em>.png - mipmap-xxxhdpi/... - <em>finished_launcher_asset</em>.png -</pre> - -<p>For more information about how to save resources in the application project, -see <a href="{@docRoot}guide/topics/resources/providing-resources.html">Providing Resources</a>. -</p> - -<p> For more information about using the mipmap folders, see -<a href="{@docRoot}tools/projects/index.html#mipmap">Managing Projects Overview</a>.</p> - -<h3 id="xxxhdpi-launcher">Provide an xxx-high-density launcher icon</h3> - -<p>Some devices scale-up the launcher icon by as much as 25%. For example, if your highest density -launcher icon image is already extra-extra-high density, the scaling process will make it appear -less crisp. So you should provide a higher density launcher icon in the <code>mipmap-xxxhdpi -</code> directory, which the system uses instead of scaling up a smaller version of the icon.</p> - -<p class="note"><strong>Note:</strong> The <code>mipmap-xxxhdpi</code> qualifier is necessary -only to provide a launcher icon that can appear larger than usual on an xxhdpi device. It is best -practice to place all your launcher icons in the <code>res/mipmap-[density]/</code> folders. This -enables your app to display launcher icons that have a higher density than the device, without -scaling up a lower density version of the icon. You do not need to provide xxxhdpi assets for all -your app's images.</p> - -<p>See <a href="{@docRoot}guide/practices/screens_support.html">Supporting Multiple Screens</a> for -more information.</p> - - -<h3>Remove unnecessary metadata from final assets</h3> - -<p>Although the Android SDK tools will automatically compress PNGs when packaging -application resources into the application binary, a good practice is to remove -unnecessary headers and metadata from your PNG assets. Tools such as <a -href="http://optipng.sourceforge.net/">OptiPNG</a> or <a -href="http://pmt.sourceforge.net/pngcrush/">Pngcrush</a> can ensure that this -metadata is removed and that your image asset file sizes are optimized.</p> - - diff --git a/docs/html/design/style/metrics-grids.jd b/docs/html/design/style/metrics-grids.jd deleted file mode 100644 index 97915b85e460..000000000000 --- a/docs/html/design/style/metrics-grids.jd +++ /dev/null @@ -1,90 +0,0 @@ -page.title=Metrics and Grids -page.metaDescription=Optimize your app's UI by designing layouts based on density-independent grids. -page.tags="layout","screens" -meta.tags="multiple screens, layout, tablets" -page.image=/design/media/metrics_closeup.png -@jd:body - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/layout/metrics-keylines.html"> - <div> - <h3>Material Design</h3> - <p>Metrics and Keylines<p> - </div> -</a> - - -<p>Devices vary not only in physical size, but also in screen density (<acronym title="Dots per -inch">DPI</acronym>). To simplify the way you design for multiple screens, think of each device as -falling into a particular size bucket and density bucket:</p> -<ul> - <li>The size buckets are <em>handset</em> (smaller than -600<acronym title="Density-independent pixels: One dp is one pixel on a 160 dpi (mdpi) -screen.">dp</acronym>) and <em>tablet</em> (larger than or equal 600dp).</li> - <li>The density buckets are <acronym -title="Low density (120 dpi)">LDPI</acronym>, <acronym title="Medium density (160 -dpi)">MDPI</acronym>, <acronym title="High density (240 dpi)">HDPI</acronym>, <acronym title -="Extra-high density (320 dpi)">XHDPI</acronym>, <acronym title -="Extra-extra!-high density (480 dpi)">XXHDPI</acronym>, and <acronym title -="Extra-extra-extra!-high density (640 dpi)">XXXHDPI</acronym>.</li> -</ul> - -<p>Optimize your application's UI by designing -alternative layouts for some of the different size buckets, and provide alternative bitmap images -for different density buckets.</p> - -<p>Because it's important that you design and implement your layouts for multiple densities, -the guidelines below and throught the documentation -refer to layout dimensions with <acronym title="Density-independent pixels: One dp is one pixel -on a 160 dpi (mdpi) screen.">dp</acronym> measurements instead of pixels.</p> - - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/metrics_diagram.png"> - - </div> - <div class="col-5"> - -<h4>Space considerations</h4> -<p>Devices vary in the amount of density-independent pixels (dp) they can display.</p> -<p>To see more, visit the -<a href="http://developer.android.com/resources/dashboard/screens.html" target="_blank"> -Screen Sizes and Densities Device Dashboard</a>.</p> - - </div> -</div> - - -<h2 id="48dp-rhythm">48dp Rhythm</h2> - -<p>Touchable UI components are generally laid out along 48dp units.</p> - -<img src="{@docRoot}design/media/metrics_48.png"> - -<div class="vspace size-2"> </div> - -<h4>Why 48dp?</h4> -<p>On average, 48dp translate to a physical size of about 9mm (with some variability). This is -comfortably in the range of recommended target sizes (7-10 mm) for touchscreen objects and users -will be able to reliably and accurately target them with their fingers.</p> -<p>If you design your elements to be at least 48dp high and wide you can guarantee that:</p> -<ul> -<li>your targets will never be smaller than the minimum recommended target size of 7mm regardless of - what screen they are displayed on.</li> -<li>you strike a good compromise between overall information density on the one hand, and - targetability of UI elements on the other.</li> -</ul> - -<img src="{@docRoot}design/media/metrics_closeup.png"> - -<div class="vspace size-2"> </div> - -<h4>Mind the gaps</h4> -<p>Spacing between each UI element is 8dp.</p> - -<h2 id="examples">Examples</h2> - -<img src="{@docRoot}design/media/metrics_forms.png"> diff --git a/docs/html/design/style/themes.jd b/docs/html/design/style/themes.jd deleted file mode 100644 index 6c8169baa642..000000000000 --- a/docs/html/design/style/themes.jd +++ /dev/null @@ -1,53 +0,0 @@ -page.title=Themes -@jd:body - -<div class="cols"> - <div class="col-5"> - - <img src="{@docRoot}design/media/themes_holo_light.png"> - <div class="figure-caption"> - Gmail in Holo Light. - </div> - - <img src="{@docRoot}design/media/themes_holo_dark.png"> - <div class="figure-caption"> - Settings in Holo Dark. - </div> - - </div> - <div class="col-7"> - - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/style/color.html#color-themes"> - <div> - <h3>Material Design</h3> - <p>Color Themes<p> - </div> -</a> - - -<p>Themes are Android's mechanism for applying a consistent style to an app or activity. -The style specifies the visual properties of the elements that make up your user interface, -such as color, height, padding and font size. To promote greater cohesion between all apps -on the platform, Android provides two system themes that you can choose from when building apps:</p> -<ul> -<li>Holo Light</li> -<li>Holo Dark</li> -</ul> -<p>Applying these themes will go a long way in helping you to build apps that fit right into the -general visual language of Android.</p> -<p>Pick the system theme that best matches the needs and design aesthetics for your app. If your -desire is to have a more distinct look for your app, using one of the system themes as a starting -point for your customizations is a good idea. The system themes provide a solid foundation on top -of which you can selectively implement your own visual stylings.</p> - -<div class="note develop"> -<p><strong>Developer Guide</strong></p> - <p>For information about how to apply themes such as Holo Light and Dark, and - how to build your own themes, see the - <a href="{@docRoot}guide/topics/ui/themes.html">Styles and Themes</a> API guide.</p> -</div> - - </div> -</div> diff --git a/docs/html/design/style/touch-feedback.jd b/docs/html/design/style/touch-feedback.jd deleted file mode 100644 index e1fac2f1c26d..000000000000 --- a/docs/html/design/style/touch-feedback.jd +++ /dev/null @@ -1,95 +0,0 @@ -page.title=Touch Feedback -page.tags=input,button -@jd:body - -<div class="cols" style="margin-bottom: -100px"> -<div class="col-7"> - -<a class="notice-designers-material" - href="http://www.google.com/design/spec/animation/responsive-interaction.html"> - <div> - <h3>Material Design</h3> - <p>Responsive Interaction<p> - </div> -</a> - - -<p>Use illumination and dimming to respond to touches, reinforce the resulting behaviors -of gestures, and indicate what actions are enabled and disabled.</p> - -<p><strong>Be responsive to touches in a gentle way</strong>. Whenever a user touches an -actionable area in your app, let them know the app is "listening" by providing a visual -response. Make it subtle —just slightly lighter or darker than the untouched color. This -provides two benefits:</p> - -<ul> -<li><a href="{@docRoot}design/get-started/principles.html#sprinkle-encouragement">Sprinkles -of encouragement</a> are more pleasant than jolts.</li> -<li>Incorporating <a href="{@docRoot}design/style/branding.html">your branding</a> is much -easier because the default touch feedback works with whatever hue you choose.</li> -</ul> - -</div> - -<div class="col-6" style="float:right;"> - <video class="play-on-hover" width="268" height="442" autoplay style="border:1px solid #ddd;background-color:#f9f9f9;" poster=""> - <source src="{@docRoot}design/media/touch_feedback.mp4" type="video/mp4"> - <source src="{@docRoot}design/media/touch_feedback.webm" type="video/webm"> - <source src="{@docRoot}design/media/touch_feedback.ogv" type="video/ogg"> - </video> - <div class="figure-caption"> - <div style="color:#a3a3a3;margin-left:130px;"><em>Click image to replay...</em></div> - </div> -</div> - -<h4 style="clear:both;">States</h4> - - -<div class="vspace size-1"> </div> - -<img src="{@docRoot}design/media/touch_feedback_states.png"> -<div class="figure-caption"> - Most of Android's UI elements have touch feedback built in, including - states that indicate whether touching the element will have any effect. -</div> - -<div class="vspace size-3"> </div> - -<div class="cols"> - <div class="col-6"> - - <h4>Communication</h4> -<p>When your objects react to more complex gestures, help users -understand what the outcome will be.</p> - -<p>In Recents, when a user starts swiping a thumbnail left or right, it -begins to dim. This helps the user understand that swiping will cause the -item to be removed.</p> - </div> - <div class="col-7"> - - <img src="{@docRoot}design/media/touch_feedback_manipulation.png"> - - </div> -</div> -<div class="vspace size-3"> </div> - -<div class="cols"> - <div class="col-6"> - - <img src="{@docRoot}design/media/touch_feedback_communication.png"> - <p><em>If a user attempts to scroll past the last home screen panel, the screen - content tilts to the right to indicate that further navigation in this direction - isn’t possible.</em></p> - - </div> - <div class="col-6"> - -<h4>Boundaries</h4> -<p> - When users try to scroll past the beginning or end of a scrollable area, - communicate the boundary with a visual cue. Many of Android's scrollable UI - widgets, like lists and grid lists, have support for boundary feedback built - in. If you’re building custom widgets, keep boundary feedback in mind and - provide it from within your app. -</p> diff --git a/docs/html/design/style/typography.jd b/docs/html/design/style/typography.jd deleted file mode 100644 index af76c409d327..000000000000 --- a/docs/html/design/style/typography.jd +++ /dev/null @@ -1,78 +0,0 @@ -page.title=Typography -page.tags="textview","font" -page.metaDescription=How to use typography in your Android apps. -@jd:body - -<div class="cols"> - <div class="col-8"> - - <img src="{@docRoot}design/media/typography_main.png"> - - </div> - -<a class="notice-designers-material" - style="width: 278px;" - href="http://www.google.com/design/spec/style/typography.html"> - <div> - <h3>Material Design</h3> - <p>Typography<p> - </div> -</a> - -<div class="col-5"> - -<p> - <a class="download-button" onClick="ga('send', 'event', 'Design', 'Download', 'Roboto ZIP');" - href="{@docRoot}downloads/design/roboto-1.2.zip">Download Roboto</a> -</p> - -<p>The Android design language relies on traditional typographic tools such as scale, space, rhythm, -and alignment with an underlying grid. Successful deployment of these tools is essential to help -users quickly understand a screen of information. To support such use of typography, Ice Cream -Sandwich introduced a new type family named -<a href="http://www.google.com/fonts/specimen/Roboto" class="external-link">Roboto</a>, created -specifically for the requirements of UI and high-resolution screens.</p> - -<p>The current {@link android.widget.TextView} framework offers Roboto in thin, light, regular and bold -weights, along with an italic style for each weight. The framework also offers the -<a href="http://www.google.com/fonts/specimen/Roboto+Condensed" class="external-link">Roboto Condensed</a> -variant in regular and bold weights, along with an italic style for each weight.</p> - - <img src="{@docRoot}design/media/typography_variants@2x.png" width="220"> - -<p><a onClick="ga('send', 'event', 'Design', 'Download', 'Roboto Specimen Book (@typography page)');" - href="{@docRoot}downloads/design/Roboto_Specimen_Book_20131031.pdf">Specimen Book</a></p> - - </div> -</div> - -<hr> - -<div class="cols"> - <div class="col-6"> - -<h4>Default type colors</h4> -<p>The Android UI uses the following default color styles: <code>textColorPrimary</code> and -<code>textColorSecondary</code>. For light themes use <code>textColorPrimaryInverse</code> and -<code>textColorSecondaryInverse</code>. The framework text color styles also support variants for -touch feedback states when used inside UI elements.</p> - - <img src="{@docRoot}design/media/typography_defaults.png"> - - </div> - <div class="col-6"> - -<h4>Typographic Scale</h4> -<p>Contrast in type sizes can go a long way to create ordered, understandable layouts. However, too -many different sizes in the same UI can be messy. The Android framework uses the following limited -set of type sizes:</p> - -<img src="{@docRoot}design/media/typography_sizes.png"> - -<p>Users can select a system-wide scaling factor for text in the Settings app. In order to support -these accessibility features, type should be specified in scale-independent pixels -(<acronym title="Scale-independent pixels. One sp is one pixel on a 160 dpi screen if the user's global text scale is set to 100%.">sp</acronym>) -wherever possible. Layouts supporting scalable types should be tested against these settings.</p> - - </div> -</div> diff --git a/docs/html/design/style/writing.jd b/docs/html/design/style/writing.jd deleted file mode 100644 index 0c62a5502804..000000000000 --- a/docs/html/design/style/writing.jd +++ /dev/null @@ -1,322 +0,0 @@ -page.title=Writing Style -page.tags=dialog,toast,notification -@jd:body - -<h2 id="voa">Android's Voice</h2> - -<p>When writing text that appears in your app, keep it concise, simple, and friendly.</p> - -<h4 id="concise">Concise</h4> - -<ul> - <li>Describe only what the user needs to know.</li> - <li>Eliminate redundancy, such as titles that restate the body of an information box.</li> - <li>Keep text as short as possible.</li> -</ul> - -<p><em>Avoid wordy, stilted text</em></p> - -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - - <div class="do-dont-label bad">Don't</div> - - <table class="ui-table good"><tbody><tr><td> - Consult the documentation that came with your phone for further instructions. - </td></tr></tbody></table> - - </div> - <div class="col-6"> - - <div class="do-dont-label good">Do</div> - - <table class="ui-table good"><tbody><tr><td> - Read the instructions that came with your phone. - </td></tr></tbody></table> - - </div> -</div> - -<p><em>Don't provide unnecessary information</em></p> - -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - - <div class="do-dont-label bad">From a Setup Wizard screen</div> - - <table class="ui-table bad"> - <thead> - <tr> - <th> - Signing in... - </th> - </tr> - </thead> - <tbody> - <tr> - <td> - Your phone needs to communicate with<br> - Google servers to sign in to your account.<br> - This may take up to five minutes. - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-6"> - - <div class="do-dont-label good">From a Setup Wizard screen</div> - - <table class="ui-table good"> - <thead> - <tr> - <th> - Signing in... - </th> - </tr> - </thead> - <tbody> - <tr> - <td> - Your phone is contacting Google.<br> - This can take up to 5 minutes. - </td> - </tr> - </tbody> - </table> - - </div> -</div> - -<h4 id="simple">Simple</h4> - -<ul> - <li>Use short words, active verbs, and common nouns.</li> - <li>Put the most important thing first. “Front-load” the first 11 characters - with the most salient information in the string.</li> - <li>Don’t try to explain subtle differences. They are lost on most users.</li> -</ul> - -<p><em>Focus on the user's concern, not technical details</em></p> - -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - - <div class="do-dont-label bad">Don't</div> - - <table class="ui-table good"><tbody><tr><td> - Manually control GPS to prevent other apps from using it - </td></tr></tbody></table> - - </div> - <div class="col-6"> - - <div class="do-dont-label good">Do</div> - - <table class="ui-table good"><tbody><tr><td> - To save power, switch Location mode to Battery saving - </td></tr></tbody></table> - - </div> -</div> - -<p><em>Put top news first</em></p> - -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - - <div class="do-dont-label bad">Don't</div> - - <table class="ui-table good"><tbody><tr><td> - 77 other people +1’d this, including Larry Page - </td></tr></tbody></table> - - </div> - <div class="col-6"> - - <div class="do-dont-label good">Do</div> - - <table class="ui-table good"><tbody><tr><td> - Larry Page and 76 others +1’d this - </td></tr></tbody></table> - - </div> -</div> - -<p><em>Put the user's goal first</em></p> - -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - - <div class="do-dont-label bad">Don't</div> - - <table class="ui-table good"><tbody><tr><td> - Touch Next to complete setup using a Wi-Fi connection - </td></tr></tbody></table> - - </div> - <div class="col-6"> - - <div class="do-dont-label good">Do</div> - - <table class="ui-table good"><tbody><tr><td> - To finish setup using Wi-Fi, touch Next - </td></tr></tbody></table> - - </div> -</div> - - -<h4 id="friendly">Friendly</h4> - -<ul> - <li>Use contractions.</li> - <li>Talk directly to the reader. Use “you” to refer to the reader.</li> - <li>Keep your tone casual and conversational, but avoid slang.</li> -</li> -</ul> - -<p><em>Avoid being confusing or annoying</em></p> -<div class="cols"> - <div class="col-6 layout-with-list-item-margins"> - <div class="do-dont-label bad">Don't</div> - <table class="ui-table bad"> - <thead> - <tr> - <th> - Sorry! - </th> - </tr> - </thead> - <tbody> - <tr> - <td> - Activity MyAppActivity (in application<br /> - MyApp) is not responding - </td> - </tr> - </tbody> - </table> - - </div> - <div class="col-6"> - <div class="do-dont-label good">Do</div> - <table class="ui-table good"> - <thead> - <tr> - <th> - MyApp isn’t responding - </th> - </tr> - </thead> - <tbody> - <tr> - <td> - Do you want to close it? - </td> - </tr> - </tbody> - </table> - </div> -</div> - - -<h4>Words to avoid</h4> - -<div style="padding:5px 2.1em;"> -<table> - <tr> - <td class="do-dont-label bad" style="width:40%">Don't use</td> - <td class="do-dont-label good" style="width:40%">Use</td> - </tr> - <tr> - <td>one, two, three, four, ...</td> - <td>1, 2, 3, 4, ...</td> - </tr> - <tr> - <td>application</td> - <td>app</td> - </tr> - <tr> - <td>cannot, could not, do not, did not -will not, you will</td> - <td><em>Contractions:</em> can’t, couldn’t, don’t, didn’t won’t, you’ll, and so on</td> - </tr> - <tr> - <td>okay, ok</td> - <td>OK</td> - </tr> - <tr> - <td>please, sorry, thank you</td> - <td><em>Attempts at politeness can annoy the user, especially in messages that say - something has gone wrong.<br /> - Exception: In Japanese, “please” is mandatory and imperative verbs should - be localized accordingly (turn on -> please turn on). - </em></td> - </tr> - <tr> - <td>there is, there are, it is<br /> - <em>and other “disappeared” subjects (grammatical expletives)</em></td> - <td><em>Use a noun as the subject</em></td> - </tr> - <tr> - <td>abort, kill, terminate</td> - <td>stop, cancel, end, exit</td> - </tr> - <tr> - <td>fail, failed, <em>negative language</em></td> - <td><em>In general, use positive phrasing<br /> - (for example, “do” rather than “don’t,” except in cases such as “Don’t show - again,” “Can’t connect,” and so on.)</em></td> - </tr> - <tr> - <td>me, I, my, mine</td> - <td>you, your, yours</td> - </tr> - <tr> - <td>Are you sure? Warning!</td> - <td><em>Tell user the consequence instead, for example, “You’ll lose all photos - and media”</em></td> - </tr> -</table> - -</div> - -<h2 id="formatting_text">Formatting text</h2> - -<h4 id="capitalization">Capitalization</h4> - -<ul> - <li>Use sentence-style capitalization for all UI strings: “Words to live by.”</li> - <li>Capitalize all important words in: - <ul> - <li>App names (Calendar, Google Drive)</li> - <li>Named features (Android Beam, Face Unlock)</li> - <li>Proper nouns (Statue of Liberty, San Francisco Giants)</li> - </ul> - </li> - <li>Be conservative. Don't capitalize words that aren't part of a formal feature name: - <ul> - <li>Sim card lock, Home screen, not Sim Card Lock, Home Screen.</li> - </ul> - </li> -</ul> - - -<h4 id="punctuation">Punctuation</h4> -<ul> - <li><strong>Period.</strong> Don't use a period after a single sentence or - phrase used in isolation, such as in a toast, label, or notification. Wherever two or - more sentences run together, use a period for each sentence. </li> - <li><strong>Ellipsis.</strong> Use the ellipsis character (…) (Option-; on MacOS and &hellip; - in HTML) to indicate - <ul> - <li>Incompleteness, such as an action in progress (“Downloading...”) or truncated text.</li> - <li>That a menu item (such as Print… or Share…) leads to further UI involving significant - choices. Exception: Commands whose wording already implies further (but limited) UI, such - as <strong>Find in page</strong> or <strong>Pick a date</strong>, do not require an - ellipsis. </li> - </ul> - </li> -</ul> diff --git a/docs/html/design/videos/index.jd b/docs/html/design/videos/index.jd deleted file mode 100644 index 3845b44991b4..000000000000 --- a/docs/html/design/videos/index.jd +++ /dev/null @@ -1,130 +0,0 @@ -page.title=Videos -@jd:body - -<p>The Android Design Team presents design-oriented sessions at Google I/O every year. Visit these pages to view the videos and presentations from the conferences.</p> - -<img src="{@docRoot}images/home/io-logo-2013-alt.png"> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/2013/sessions/326368573">Enchant, Simplify, Amaze: Android's Design Principles</a></h3> - <p>Want to enchant people, simplify their lives, and make them feel amazing with your app? Learn how Android's Design Principles can help you create products that resonate with people. Find out about the meaning and research behind the principles. See real-world examples and practices from the Android Design team. Discover techniques for applying the principles in your daily work. No design experience necessary.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/s0HIP8EdlnE" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/2013/sessions/326301704">Structure in Android App Design</a></h3> - <p>Life is simple when your app is simple. But when your apps gets more complex, how do you choose between spinners, tabs, and drawers for navigation? Members of the Android Design team look at techniques for making your app predictable and pleasing to use.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/XpqyiBR0lJ4" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/2013/sessions/326425499">Fireside Chat with the Android Team</a></h3> - <p>Pull up a chair and join the Android platform team for a fireside chat. It's your opportunity to ask us about the platform and learn a little bit more about why things work the way they do, from the people who built it. </p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/A5OOJDIrYls" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/2013/sessions/326483138">Agile UX Research Practice in Android</a></h3> - <p>In the Android UX team, it is critical to get user feedback frequently and consistently so that we are able to iterate and develop the best-in-class designs for our users. We will discuss how the team applied "Pulse Studies" (iterative research sessions) in order to put new ideas, designs, and concepts in front of users on a regular basis; it requires minimal advance planning, it can have an immediate product impact, and it can meet urgent needs. </p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/6MOeVNbh9cY" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/2013/sessions/326460111">Cognitive Science and Design</a></h3> - <p>This session will provide an in-depth look at human perception and cognition, and its implications for interactive and visual design. The human brain is purely treated as an information processing machine, and we will teach the audience its attributes, its advantages, its limitations, and generally how to hack it. </p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/z2exxj4COhU" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<img src="{@docRoot}design/media/extras_googleio_12.png"> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-success"><a href="https://developers.google.com/events/io/sessions/gooio2012/112/">Android Design for Success</a></h3> - <p>You have a great idea for an Android app. You want it to stand out among hundreds of thousands. You want your users to love it and tell everyone they know. The Android User Experience team is here to help. We talk about the Android Design guide and other tricks of the trade for creating apps that delight users and help them accomplish their goals. No design background is required.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/2NL_83EG0no" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="design-for-engineers"><a href="https://developers.google.com/events/io/sessions/gooio2012/1204/">Android Design for Engineers</a></h3> - <p>Design isn't black magic, it's a field that people can learn. In this talk two elite designers from Google give you an advanced crash course in interactive and visual design. Topics include mental models, natural mappings, metaphors, mode errors, visual hierarchies, typography and gestalt principles. Correctly applied, this knowledge can drastically improve the quality of your work.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/iJDoxOTyMdk" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="navigation-in-android"><a href="https://developers.google.com/events/io/sessions/gooio2012/114/">Navigation in Android</a></h3> - <p>An app is useless if people can't find their way around it. Android introduced big navigation-support changes in 3.0 and 4.0. The Action Bar offers a convenient control for Up navigation, the Back key's behavior became more consistent within tasks, and the Recent Tasks UI got an overhaul. In this talk, we discuss how and why we got where we are today, how to think about navigation when designing your app's user experience, and how to write apps that offer effortless navigation in multiple Android versions.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/XwGHJJYBs0Q" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="now-what"><a href="https://developers.google.com/events/io/sessions/gooio2012/115/">So You've Read the Design Guide; Now What?</a></h3> - <p>The Android Design Guide describes how to design beautiful Android apps, but not how to build them. In this talk we give practical tips for how to apply fit & finish as you implement your design, we show you how to avoid some common pitfalls, we describe some useful patterns, and show how tools can help.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/2jCVmfCse1E" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<div class="vspace size-2"> </div> - -<div class="cols"> - <div class="col-7"> - <h3 id="playing-with-patterns"><a href="https://developers.google.com/events/io/sessions/gooio2012/131/">Playing with Patterns</a></h3> - <p>Best-in-class application designers and developers talk about their experience in developing for Android, showing screenshots from their app, exploring the challenges they faced, and offering creative solutions congruent with the Android Design guide. Guests are invited to show examples of visual and interaction patterns in their application that manage to keep it simultaneously consistent and personal.</p> - </div> - <div class="col-6"> - <iframe width="355" height="200" src="//www.youtube.com/embed/8iUbr8RZKtg" frameborder="0" allowfullscreen=""></iframe> - </div> -</div> - -<p>Videos for the entire Design Track can also be found on the <a href="http://www.youtube.com/playlist?list=PL54FA004D676C3EE9">Android Developers Channel</a> on YouTube.</p> diff --git a/docs/html/develop/index.jd b/docs/html/develop/index.jd index 5c3990c591b4..970adedcd771 100644 --- a/docs/html/develop/index.jd +++ b/docs/html/develop/index.jd @@ -51,6 +51,7 @@ excludeFromSuggestions=true data-maxResults="3"></div> </div></section> + <section class="dac-section dac-light"><div class="wrap"> <h1 class="dac-section-title">Android performance patterns</h1> <div class="dac-section-subtitle"> @@ -68,39 +69,47 @@ excludeFromSuggestions=true </ul> </div></section> -<section class="dac-section dac-dark dac-invert"><div class="wrap"> - <h1 class="dac-section-title">Build with Google</h1> - <div class="dac-section-subtitle">Services on billions of Android devices worldwide to help you build better apps.</div> +<section class="dac-section dac-section-light"><div class="wrap"> + <h1 class="dac-section-title">Tools for building apps</h1> + <div class="dac-section-subtitle"> + Insights into Android's tools and libraries to speed your development. + </div> <div class="resource-widget resource-flow-layout col-16" - data-query="collection:develop/landing/buildwithgoogle" + data-query="collection:develop/landing/tools" data-cardSizes="6x6" data-maxResults="3"></div> <ul class="dac-section-links"> - <li class="dac-section-link"><a href="https://developers.google.com/"> - <span class="dac-sprite dac-auto-chevron"></span> - Get started with Google << NEEDS LINK - </a></li> </ul> </div></section> <section class="dac-section dac-light"><div class="wrap"> - <h1 class="dac-section-title">DevBytes</h1> - <div class="dac-section-subtitle">Learn Android in short, focused tutorials.</div> + <h1 class="dac-section-title">Ubiquitous computing</h1> + <div class="dac-section-subtitle"> + Opening up new stuff. + </div> <div class="resource-widget resource-flow-layout col-16" - data-query="collection:develop/landing/devbytes" + data-query="collection:develop/landing/ubicomp" data-cardSizes="6x6" - data-maxResults="6"></div> + data-maxResults="3"></div> <ul class="dac-section-links"> - <li class="dac-section-link"><a href="https://www.youtube.com/watch?v=wlFVIIstKmA&list=PLOU2XLYxmsIJJHY5OrsREtKewtBhc0Uy2"> + <li class="dac-section-link"><a href="/wear/index.html"> + <span class="dac-sprite dac-auto-chevron"></span> + Wear + </a></li> + <li class="dac-section-link"><a href="/tv/index.html"> + <span class="dac-sprite dac-auto-chevron"></span> + TV + </a></li> + <li class="dac-section-link"><a href="/auto/index.html"> <span class="dac-sprite dac-auto-chevron"></span> - DevBytes 2014 playlist + Auto </a></li> </ul> </div></section> <section class="dac-section dac-gray"><div class="wrap"> <h1 class="dac-section-title">Courses</h1> - <div class="dac-section-subtitle">Take free online courses from Android experts that bring you step-by-step to building your own apps.</div> + <div class="dac-section-subtitle">Free online courses from Android experts that bring you step-by-step to building your own apps.</div> <div class="resource-widget resource-flow-layout col-16" data-query="collection:develop/landing/courses" data-cardSizes="6x6" diff --git a/docs/html/guide/topics/renderscript/reference.jd b/docs/html/guide/topics/renderscript/reference.jd deleted file mode 100644 index a9d780ad00a2..000000000000 --- a/docs/html/guide/topics/renderscript/reference.jd +++ /dev/null @@ -1,21 +0,0 @@ -page.title=Runtime API Reference -parent.title=Computation -parent.link=index.html - -@jd:body - -<script language="JavaScript"> - -function autoResize(element){ - var newheight; - var newwidth; - - newheight = element.contentWindow.document.body.scrollHeight + 20; - newwidth = element.contentWindow.document.body.scrollWidth; - element.height = (newheight) + "px"; - element.width = (newwidth) + "px"; -} -</script> - - -<iframe SRC="{@docRoot}reference/renderscript/index.html" width="100%" id="iframe" marginheight="0" frameborder="0" onLoad="autoResize(this);"></iframe> diff --git a/docs/html/images/cards/card-android-fundamentals_16x9_2x.png b/docs/html/images/cards/card-android-fundamentals_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..64d1fa5b1d02 --- /dev/null +++ b/docs/html/images/cards/card-android-fundamentals_16x9_2x.png diff --git a/docs/html/images/cards/card-android-studio-overview_16x9_2x.jpg b/docs/html/images/cards/card-android-studio-overview_16x9_2x.jpg Binary files differnew file mode 100644 index 000000000000..c0ef659892fb --- /dev/null +++ b/docs/html/images/cards/card-android-studio-overview_16x9_2x.jpg diff --git a/docs/html/images/cards/card-build_16x9_2x.png b/docs/html/images/cards/card-build_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..1fdbf896b6ba --- /dev/null +++ b/docs/html/images/cards/card-build_16x9_2x.png diff --git a/docs/html/images/cards/card-download_16-9_2x.png b/docs/html/images/cards/card-download_16-9_2x.png Binary files differnew file mode 100644 index 000000000000..06642b4c9c5a --- /dev/null +++ b/docs/html/images/cards/card-download_16-9_2x.png diff --git a/docs/html/images/cards/card-earn_16x9_2x.png b/docs/html/images/cards/card-earn_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..1b96c83d3701 --- /dev/null +++ b/docs/html/images/cards/card-earn_16x9_2x.png diff --git a/docs/html/images/cards/card-engage_16x9_2x.png b/docs/html/images/cards/card-engage_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..334420b9c87a --- /dev/null +++ b/docs/html/images/cards/card-engage_16x9_2x.png diff --git a/docs/html/images/cards/card-g-play-services_16x9_2x.jpg b/docs/html/images/cards/card-g-play-services_16x9_2x.jpg Binary files differnew file mode 100644 index 000000000000..a2805a6ea340 --- /dev/null +++ b/docs/html/images/cards/card-g-play-services_16x9_2x.jpg diff --git a/docs/html/images/cards/card-key-changes_16-9_2x.png b/docs/html/images/cards/card-key-changes_16-9_2x.png Binary files differnew file mode 100644 index 000000000000..1629b4f538b9 --- /dev/null +++ b/docs/html/images/cards/card-key-changes_16-9_2x.png diff --git a/docs/html/images/cards/card-material-icons-16x9_2x.jpg b/docs/html/images/cards/card-material-icons-16x9_2x.jpg Binary files differnew file mode 100644 index 000000000000..016932cb57e8 --- /dev/null +++ b/docs/html/images/cards/card-material-icons-16x9_2x.jpg diff --git a/docs/html/images/cards/card-new_16x9_2x.png b/docs/html/images/cards/card-new_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..270f4a3b0ff4 --- /dev/null +++ b/docs/html/images/cards/card-new_16x9_2x.png diff --git a/docs/html/images/cards/card-preview_16-9_2x.png b/docs/html/images/cards/card-preview_16-9_2x.png Binary files differnew file mode 100644 index 000000000000..dd80f6a37b7a --- /dev/null +++ b/docs/html/images/cards/card-preview_16-9_2x.png diff --git a/docs/html/images/cards/card-set-up_16-9_2x.png b/docs/html/images/cards/card-set-up_16-9_2x.png Binary files differnew file mode 100644 index 000000000000..0283801e16aa --- /dev/null +++ b/docs/html/images/cards/card-set-up_16-9_2x.png diff --git a/docs/html/images/cards/card-support_16-9_2x.png b/docs/html/images/cards/card-support_16-9_2x.png Binary files differnew file mode 100644 index 000000000000..08b3290ac0e9 --- /dev/null +++ b/docs/html/images/cards/card-support_16-9_2x.png diff --git a/docs/html/images/cards/card-ubiquitous-computing_16x9_2x.png b/docs/html/images/cards/card-ubiquitous-computing_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..5edff621bc6c --- /dev/null +++ b/docs/html/images/cards/card-ubiquitous-computing_16x9_2x.png diff --git a/docs/html/images/cards/card-using-code-templates_16x9_2x.png b/docs/html/images/cards/card-using-code-templates_16x9_2x.png Binary files differnew file mode 100644 index 000000000000..14963062c918 --- /dev/null +++ b/docs/html/images/cards/card-using-code-templates_16x9_2x.png diff --git a/docs/html/images/cards/course-ud825.png b/docs/html/images/cards/course-ud825.png Binary files differnew file mode 100644 index 000000000000..77f98b596856 --- /dev/null +++ b/docs/html/images/cards/course-ud825.png diff --git a/docs/html/images/cards/course-ud849.jpg b/docs/html/images/cards/course-ud849.jpg Binary files differnew file mode 100644 index 000000000000..41b7ecf38d1b --- /dev/null +++ b/docs/html/images/cards/course-ud849.jpg diff --git a/docs/html/images/cards/course-ud853.jpg b/docs/html/images/cards/course-ud853.jpg Binary files differnew file mode 100644 index 000000000000..94adfb0464d9 --- /dev/null +++ b/docs/html/images/cards/course-ud853.jpg diff --git a/docs/html/jd_collections.js b/docs/html/jd_collections.js index b28f978f9e7e..834eac11be04 100644 --- a/docs/html/jd_collections.js +++ b/docs/html/jd_collections.js @@ -66,6 +66,7 @@ var RESOURCE_COLLECTIONS = { "https://www.google.com/design/spec/resources/layout-templates.html", "https://www.google.com/design/spec/resources/sticker-sheets-icons.html", "https://www.google.com/design/spec/resources/roboto-noto-fonts.html", + "https://www.google.com/design/icons/index.html", "design/downloads/index.html#Wear" ] }, @@ -98,20 +99,28 @@ var RESOURCE_COLLECTIONS = { "resources": [ ] }, - "develop/landing/devbytes": { + "develop/landing/ubicomp": { "title": "", "resources": [ - "http://www.youtube.com/watch?v=K2dodTXARqc", - "http://www.youtube.com/watch?v=FOn64iqlphk", - "http://www.youtube.com/watch?v=p4gmvHyuZzw", - "http://www.youtube.com/watch?v=tDmnGNkTtlE", - "http://www.youtube.com/watch?v=6K_jxccHv5M", - "http://www.youtube.com/watch?v=KNKGM4ss5Sc" + "https://www.youtube.com/watch?v=AK38PJZmIW8&list=PLWz5rJ2EKKc-kIrPiq098QH9dOle-fLef", + "https://www.youtube.com/watch?v=6K_jxccHv5M&index=1&list=PLOU2XLYxmsILFBfx66ens76VMLMEPJAB0", + "https://www.youtube.com/watch?v=KNKGM4ss5Sc&index=4&list=PLWz5rJ2EKKc9BdE_PSLNIGjXXr3h_orXM" + ] + }, + "develop/landing/tools": { + "title": "", + "resources": [ + "https://www.youtube.com/watch?v=K2dodTXARqc&list=PLWz5rJ2EKKc8I9gHTMh5yKkwRRGE8BjbQ&index=1", + "https://www.youtube.com/watch?v=3PIc-DuEU2s&index=1&list=PLWz5rJ2EKKc9e0d55YHgJFHXNZbGHEXJX", + "https://www.youtube.com/watch?v=FOn64iqlphk&index=1&list=PLWz5rJ2EKKc9Qk1_iCZNbBp6adYnJf9Vf" ] }, "develop/landing/courses": { "title": "", "resources": [ + "https://www.udacity.com/course/ux-design-for-mobile-developers--ud849", + "https://www.udacity.com/course/developing-android-apps--ud853", + "https://www.udacity.com/course/android-performance--ud825" ] }, "distribute/landing/carousel": { @@ -1221,6 +1230,14 @@ var RESOURCE_COLLECTIONS = { "https://support.google.com/googleplay/answer/2651410" ] }, + "preview/landing/resources": { + "title": "", + "resources": [ + "preview/api-overview.html", + "preview/setup-sdk.html", + "preview/samples.html" + ] + }, "autolanding": { "title": "", "resources": [ diff --git a/docs/html/jd_extras.js b/docs/html/jd_extras.js index 82ff029070aa..cc11da529f85 100644 --- a/docs/html/jd_extras.js +++ b/docs/html/jd_extras.js @@ -173,22 +173,22 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ { "title":"Introduction to Android Studio", "titleFriendly":"", - "summary":"A high level introduction to Android Studio, the new IDE for Android application development. Learn why you should migrate your projects to Android Studio now and how it can help you be more productive as a developer. Rich layout editor, handy suggestions and fixes, new Android project view - these are just some of the things you can expect from the IDE, which is built on the successful IntelliJ IDEA.", - "url":"http://www.youtube.com/watch?v=K2dodTXARqc", + "summary":"Learn why you should migrate your projects to Android Studio now and how it can help you be more productive as a developer. Rich layout editor, handy suggestions and fixes, new Android project view - these are just some of the things you can expect from the IDE, which is built on the successful IntelliJ IDEA.", + "url":"https://www.youtube.com/watch?v=K2dodTXARqc&list=PLWz5rJ2EKKc8I9gHTMh5yKkwRRGE8BjbQ&index=1", "group":"", - "keywords": [], + "keywords": ["studio", "tools"], "tags": [ ], "image":"http://i1.ytimg.com/vi/K2dodTXARqc/maxresdefault.jpg", "type":"video" }, { - "title":"DevBytes: Google Play Services 7.3", + "title":"Google Play Services 7.3", "titleFriendly":"", "summary":"Google Play Services 7.3 brings a ton of great new features to help you BUILD BETTER APPS! This update brings the ability to connect multiple wearables simultaneously to a single phone.", - "url":"http://www.youtube.com/watch?v=FOn64iqlphk", + "url":"https://www.youtube.com/watch?v=FOn64iqlphk&index=1&list=PLWz5rJ2EKKc9Qk1_iCZNbBp6adYnJf9Vf", "group":"", - "keywords": [], + "keywords": ["google play services"], "tags": [ ], "image":"http://i1.ytimg.com/vi/FOn64iqlphk/maxresdefault.jpg", @@ -207,12 +207,12 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "type":"video" }, { - "title":"Android TV: Introduction to Android TV", + "title":"Introduction to Android TV", "titleFriendly":"", "summary":"Android TV brings the Android platform to the living room with rich content and entertaining app experiences. In this video, Timothy introduces the design philosophy and developer components that make building TV experiences easier than ever before.", - "url":"http://www.youtube.com/watch?v=6K_jxccHv5M", + "url":"https://www.youtube.com/watch?v=6K_jxccHv5M&index=1&list=PLOU2XLYxmsILFBfx66ens76VMLMEPJAB0", "group":"", - "keywords": [], + "keywords": ["tv"], "tags": [ ], "image":"http://i1.ytimg.com/vi/6K_jxccHv5M/maxresdefault.jpg", @@ -221,10 +221,10 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ { "title":"Under the Hood of Android Auto", "titleFriendly":"", - "summary":"Your car contains some serious technology. Learn about the Android Auto architecture, which enables you to control Android apps and services running on your phone through your car. In this talk, we'll highlight the key characteristics of the Android Auto protocol, which enables your Android phone to talk to compatible cars. We'll also take a look at some of the details of the Android Auto rendering subsystem, which uses Binders and the Android VirtualDisplay API to composite UI from multiple Android apps. Finally, we'll discuss how we're enhancing the Google Maps app by integrating with the Android Auto platform.", - "url":"http://www.youtube.com/watch?v=KNKGM4ss5Sc", + "summary":"Your car contains some serious technology. Learn about the Android Auto architecture, which enables you to control Android apps and services running on your phone through your car. ", + "url":"https://www.youtube.com/watch?v=KNKGM4ss5Sc&index=4&list=PLWz5rJ2EKKc9BdE_PSLNIGjXXr3h_orXM", "group":"", - "keywords": [], + "keywords": ["auto"], "tags": [ ], "image":"http://i1.ytimg.com/vi/KNKGM4ss5Sc/maxresdefault.jpg", @@ -2131,7 +2131,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Animation", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2144,7 +2144,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Style", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2157,7 +2157,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Layout", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2170,7 +2170,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Components", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2183,7 +2183,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Patterns", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2196,7 +2196,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Usability", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2209,7 +2209,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Color Palettes", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2222,7 +2222,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Layout Templates", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2235,7 +2235,7 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Sticker Sheets & Icons", "summary": "", "keywords": [], - "type": "design", + "type": "material design", "titleFriendly": "" }, { @@ -2248,13 +2248,30 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "title": "Typography: Roboto and Noto Sans fonts", "summary": "", "keywords": [], - "type": "design", + "type": "materialdesign", + "titleFriendly": "" + }, + { + "lang": "en", + "group": "", + "tags": [ + "icons", + "material", + "iconography" + ], + "url": "https://www.google.com/design/icons/index.html", + "timestamp": null, + "image": "images/cards/card-material-icons-16x9_2x.jpg", + "title": "Material icon collection", + "summary": "", + "keywords": ["icons"], + "type": "material design", "titleFriendly": "" }, { "title":"Android Wear Materials", "titleFriendly":"", - "summary":"You may use these materials without restriction to facilitate your app design and implementation. Drag and drop your way to beautifully designed Android apps. The stencils feature the rich typography, colors, interactive controls, and icons found throughout…", + "summary":"Drag and drop your way to beautifully designed Android Wear apps.", "url":"design/downloads/index.html#Wear", "group":"", "keywords": ["icons","stencils","color swatches"], @@ -2264,13 +2281,74 @@ DISTRIBUTE_RESOURCES = DISTRIBUTE_RESOURCES.concat([ "type":"design" }, { + "title":"UX Design for Mobile Developers", + "titleFriendly":"", + "summary":"Learn how to design a 5-star app.", + "url":"https://www.udacity.com/course/ux-design-for-mobile-developers--ud849", + "group":"", + "keywords": ["mobile","ux","design"], + "tags": ["courses"], + "image":"images/cards/course-ud849.jpg", + "lang":"en", + "type":"online course" + }, + { + "title":"Developing Android Apps", + "titleFriendly":"", + "summary":"Learn Android and build an app!", + "url":"https://www.udacity.com/course/developing-android-apps--ud853", + "group":"", + "keywords": ["start","firstapp","sdk"], + "tags": ["courses"], + "image":"images/cards/course-ud853.jpg", + "lang":"en", + "type":"online course" + }, + { + "title":"Android Performance", + "titleFriendly":"", + "summary":"Optimize your apps for speed and usability.", + "url":"https://www.udacity.com/course/android-performance--ud825", + "group":"", + "keywords": ["performance","battery"], + "tags": ["courses"], + "image":"images/cards/course-ud825.png", + "lang":"en", + "type":"online course" + }, + { + "title":"Watch Faces for Android Wear", + "titleFriendly":"", + "summary":"Watch faces let you customize the most prominent UI feature of Android wearables. The API is simple enough for rapid development and flexible enough to build something awesome.", + "url":"https://www.youtube.com/watch?v=AK38PJZmIW8&list=PLWz5rJ2EKKc-kIrPiq098QH9dOle-fLef", + "group":"", + "keywords": ["wear", "wearable", "watch face"], + "tags": [], + "image":"http://i1.ytimg.com/vi/AK38PJZmIW8/maxresdefault.jpg", + "lang":"en", + "type":"video" + }, + + { + "title":"Android Support Library", + "titleFriendly":"", + "summary":"These essential components help you build a great app that works on the huge variety of Android devices, faster.", + "url":"https://www.youtube.com/watch?v=3PIc-DuEU2s&index=1&list=PLWz5rJ2EKKc9e0d55YHgJFHXNZbGHEXJX", + "group":"", + "keywords": ["support", "compatibility"], + "tags": [], + "image":"http://i1.ytimg.com/vi/3PIc-DuEU2s/maxresdefault.jpg", + "lang":"en", + "type":"Video" + }, + { "tags": [ "android", "developerstory", "googleplay", "featured" ], - "title": "Android Developer Story: Jelly Button Games — Growing globally through data driven development", + "title": "Android Developer Storys: Jelly Button Games — Growing globally through data driven development", "type": "youtube", "url": "http://www.youtube.com/watch?v=Pd49vTkvu0U" }, diff --git a/docs/html/jd_tag_helpers.js b/docs/html/jd_tag_helpers.js index 7538e4df5a89..f03b1d7558e8 100644 --- a/docs/html/jd_tag_helpers.js +++ b/docs/html/jd_tag_helpers.js @@ -13,6 +13,7 @@ var ALL_RESOURCES = mergeArrays( GOOGLE_RESOURCES, GUIDE_RESOURCES, SAMPLES_RESOURCES, + PREVIEW_RESOURCES, TOOLS_RESOURCES, TRAINING_RESOURCES, YOUTUBE_RESOURCES, @@ -70,6 +71,7 @@ var ALL_RESOURCES_BY_TYPE = { 'google': GOOGLE_RESOURCES, 'guide': GUIDE_RESOURCES, 'samples': SAMPLES_RESOURCES, + 'preview': PREVIEW_RESOURCES, 'tools': TOOLS_RESOURCES, 'training': TRAINING_RESOURCES, 'youtube': YOUTUBE_RESOURCES, @@ -86,6 +88,7 @@ var ALL_RESOURCES_BY_TAG = mergeMaps( {map:GOOGLE_BY_TAG,arr:GOOGLE_RESOURCES}, {map:GUIDE_BY_TAG,arr:GUIDE_RESOURCES}, {map:SAMPLES_BY_TAG,arr:SAMPLES_RESOURCES}, + {map:PREVIEW_BY_TAG,arr:PREVIEW_RESOURCES}, {map:TOOLS_BY_TAG,arr:TOOLS_RESOURCES}, {map:TRAINING_BY_TAG,arr:TRAINING_RESOURCES}, {map:YOUTUBE_BY_TAG,arr:YOUTUBE_RESOURCES}, diff --git a/docs/html/preview/api-overview.jd b/docs/html/preview/api-overview.jd index f72ffbb56932..dde3c7be149d 100644 --- a/docs/html/preview/api-overview.jd +++ b/docs/html/preview/api-overview.jd @@ -1,5 +1,5 @@ page.title=API Overview -excludeFromSuggestions=true +page.keywords=preview,sdk,compatibility sdk.platform.apiLevel=22 @jd:body diff --git a/docs/html/preview/index.jd b/docs/html/preview/index.jd new file mode 100644 index 000000000000..a2d0b18ce9f2 --- /dev/null +++ b/docs/html/preview/index.jd @@ -0,0 +1,60 @@ +page.title=M Developer Preview +page.tags=preview +meta.tags="preview" +fullpage=true +page.viewport_width=970 +section.landing=true +header.hide=1 +footer.hide=1 +@jd:body + +<section class="dac-expand dac-hero dac-light"> + <div class="wrap"> + <div class="cols dac-hero-content"> + <div class="col-1of2 col-push-1of2 dac-hero-figure"> + <img class="dac-hero-image" src="/design/media/hero-material-design.png"> + </div> + <div class="col-1of2 col-pull-1of2"> + <h1 class="dac-hero-title">M Developer Preview</h1> + <p class="dac-hero-description"> + Get ready for the next official release of the platform. Test your apps + and give us feedback! + </p> + <a class="dac-hero-cta" href="{@docRoot}preview/setup-sdk.html"> + <span class="dac-sprite dac-auto-chevron"></span> + Set up the Preview SDK + </a><br> + <a class="dac-hero-cta" href="{@docRoot}preview/api-overview.html"> + <span class="dac-sprite dac-auto-chevron"></span> + Review the API changes + </a><br> + <a class="dac-hero-cta" href="https://code.google.com/p/android-developer-preview/"> + <span class="dac-sprite dac-auto-chevron"></span> + Report issues + </a><br> + </div> + </div> + </div> +</section> + +<section class="dac-section dac-gray dac-small dac-invert"><div class="wrap"> + <h2 class="norule">Latest</h2> + <div class="resource-widget resource-flow-layout col-16" + data-query="collection:develop/landing/latest" + data-cardSizes="6x6" + data-maxResults="3"></div> +</div></section> + + +<section class="dac-section"><div class="wrap"> + <h1 class="dac-section-title">Resources</h1> + <div class="dac-section-subtitle"> + Check out these resources to help you get started with the M Developer Preview. + </div> + <div class="resource-widget resource-flow-layout col-16" + data-query="collection:preview/landing/resources" + data-cardSizes="6x6" + data-maxResults="6"></div> +</div></section> + + diff --git a/docs/html/preview/overview.jd b/docs/html/preview/overview.jd new file mode 100644 index 000000000000..00f1cfe74a28 --- /dev/null +++ b/docs/html/preview/overview.jd @@ -0,0 +1,7 @@ +page.title=Preview Program Overview + +@jd:body + +<p> + This is an overview of the program. Bacon. +</p>
\ No newline at end of file diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs index bea4914548fc..fbf73f6bf116 100644 --- a/docs/html/preview/preview_toc.cs +++ b/docs/html/preview/preview_toc.cs @@ -1,6 +1,11 @@ <ul id="nav"> <li class="nav-section"> + <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/overview.html"> + Program Overview</a></div> + </li> + + <li class="nav-section"> <div class="nav-section-header empty"><a href="<?cs var:toroot ?>preview/setup-sdk.html"> Set up the SDK</a></div> </li> @@ -29,9 +34,4 @@ License Agreement</a></div> </li> - <li class="nav-section" style="margin: 20px 0 0 -10px;"> - <div class="nav-section-header empty"><a href="<?cs var:toroot ?>index.html" class="back-link"> - Developer Home</a></div> - </li> - </ul> diff --git a/docs/html/preview/reference.jd b/docs/html/preview/reference.jd index ee1f24d024d8..2d30c627f26e 100644 --- a/docs/html/preview/reference.jd +++ b/docs/html/preview/reference.jd @@ -9,7 +9,7 @@ page.title=Reference <ul> <li> - <a href="http://storage.googleapis.com/androiddevelopers/preview/l-developer-preview-reference.zip"> + <a href="http://storage.googleapis.com/androiddevelopers/preview/m-developer-preview-reference.zip"> M Developer Preview reference</a> </li> </ul>
\ No newline at end of file diff --git a/docs/html/tools/projects/templates.jd b/docs/html/tools/projects/templates.jd index 966d25fc0b15..002e2c5acf5b 100644 --- a/docs/html/tools/projects/templates.jd +++ b/docs/html/tools/projects/templates.jd @@ -1,4 +1,7 @@ page.title=Using Code Templates +page.image=images/cards/card-using-code-templates_16x9_2x.png +page.metaDescription=Quickly create Android app projects with various UI or functional components. +page.tags=studio,templates,firstapp @jd:body <div id="qv-wrapper"> @@ -26,7 +29,7 @@ page.title=Using Code Templates </div> </div> - +<img style="float:right" src="{@docRoot}images/cards/card-using-code-templates_16x9_2x.png"> <p>The SDK tools provide templates for quickly creating Android application projects with the basic structure or for adding components to your existing application modules. The code templates provided by the Android SDK follow the Android design and development guidelines to get you on the diff --git a/docs/html/tools/studio/index.jd b/docs/html/tools/studio/index.jd index 13a2fead0394..e7de00065106 100644 --- a/docs/html/tools/studio/index.jd +++ b/docs/html/tools/studio/index.jd @@ -1,4 +1,7 @@ page.title=Android Studio Overview +page.image=images/cards/card-android-studio-overview_16x9_2x.jpg +page.metaDescription=Learn about the official IDE for Android. +page.tags=studio,sdk,tools,firstapp @jd:body <div id="qv-wrapper"> diff --git a/docs/html/training/articles/keystore.jd b/docs/html/training/articles/keystore.jd index 217db8149aee..fea3b2c8a7df 100644 --- a/docs/html/training/articles/keystore.jd +++ b/docs/html/training/articles/keystore.jd @@ -129,7 +129,7 @@ of the two modes: for use as soon as the user unlocks the secure lock screen or confirms their secure lock screen credentials using the {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence) KeyguardManager.createConfirmDeviceCredentialIntent} flow. Each key specifies for how long the authorization remains valid for that key. Such keys - can only be generated or imported if the secure lock screen is enabled (see {@link android.app.KeyguardManager#isKeyguardSecure Keyguard.isKeyguardSecure}). + can only be generated or imported if the secure lock screen is enabled (see {@link android.app.KeyguardManager#isDeviceSecure()}). These keys become permanently invalidated once the secure lock screen is disabled or forcibly reset (e.g. by a Device Admin).</li> <li>User authentication is required for every use of the key. In this mode, a specific operation diff --git a/docs/html/training/testing/ui-testing/index.jd b/docs/html/training/testing/ui-testing/index.jd index 20422f7b424f..d660c601d503 100644 --- a/docs/html/training/testing/ui-testing/index.jd +++ b/docs/html/training/testing/ui-testing/index.jd @@ -72,5 +72,5 @@ Testing UI for a Single App</a></strong></dt> <dd>Learn how to test UI in a single app by using the Espresso testing framework.</dd> <dt><strong><a href="uiautomator-testing.html"> Testing UI for Multiple Apps</a></strong></dt> - <dd>Learn how to test UI in multiple apps by using the UI Automator testing framework</dd> + <dd>Learn how to test UI in multiple apps by using the UI Automator testing framework.</dd> </dl>
\ No newline at end of file diff --git a/docs/html/training/testing/unit-testing/index.jd b/docs/html/training/testing/unit-testing/index.jd new file mode 100644 index 000000000000..a35ba80a1faf --- /dev/null +++ b/docs/html/training/testing/unit-testing/index.jd @@ -0,0 +1,63 @@ +page.title=Building Effective Unit Tests +page.tags=testing,androidjunitrunner,junit,unit test + +trainingnavtop=true +startpage=true + +@jd:body + +<div id="tb-wrapper"> +<div id="tb"> + <h2> + You should also read + </h2> + <ul> + <li> + <a href="{@docRoot}tools/testing-support-library/index.html">Testing Support Library</a> + </li> + </ul> +</div> +</div> + +<p>Unit tests are the fundamental tests in your app testing strategy. By creating and running unit +tests against your code, you can easily verify that the logic of individual units is correct. +Running unit tests after every build helps you to +quickly catch and fix software regressions introduced by code changes to your app. +</p> + +<p>A unit test generally exercises the functionality of the smallest possible unit of code (which +could be a method, class, or component) in a repeatable way. You should build unit tests when you +need to verify the logic of specific code in your app. For example, if you are unit testing a +class, your test might check that the class is in the right state. Typically, the unit of code +is tested in isolation; your test affects and monitors changes to that unit only. A +<a href="http://en.wikipedia.org/wiki/Mock_object" class="external-link">mocking framework</a> +can be used to isolate your unit from its dependencies.</p> + +<p class="note"><strong>Note:</strong> Unit tests are not suitable for testing +complex UI interaction events. Instead, you should use the UI testing frameworks, as described in +<a href="{@docRoot}training/testing/ui-testing/index.html">Automating UI Tests</a>.</p> + +<p>For testing Android apps, you typically create these types of automated unit tests:</p> + +<ul> +<li><strong>Local tests:</strong> Unit tests that run on your local machine only. These tests are +compiled to run locally on the Java Virtual Machine (JVM) to minimize execution time. Use this +approach to run unit tests that have no dependencies on the Android framework or have dependencies +that can be filled by using mock objects.</li> +<li><strong>Instrumented tests:</strong> Unit tests that run on an Android device or emulator. +These tests have access to instrumentation information, such as the +{@link android.content.Context} for the app under test. Use this approach to run unit tests that +have Android dependencies which cannot be easily filled by using mock objects.</li> +</ul> + +<p>The lessons in this class teach you how to build these types of automated unit tests.</p> + +<h2>Lessons</h2> +<dl> + <dt><strong><a href="local-unit-tests.html"> +Building Local Unit Tests</a></strong></dt> + <dd>Learn how to build unit tests that run on your local machine.</dd> + <dt><strong><a href="instrumented-unit-tests.html"> +Building Instrumented Unit Tests</a></strong></dt> + <dd>Learn how to build unit tests that run on an Android device or emulator.</dd> +</dl>
\ No newline at end of file diff --git a/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd new file mode 100644 index 000000000000..07f0f739250b --- /dev/null +++ b/docs/html/training/testing/unit-testing/instrumented-unit-tests.jd @@ -0,0 +1,250 @@ +page.title=Building Instrumented Unit Tests +page.tags=testing,androidjunitrunner,junit,unit test,mock,instrumentation +trainingnavtop=true + +@jd:body + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + <h2>Dependencies and Prerequisites</h2> + + <ul> + <li>Android 2.2 (API level 8) or higher</li> + <li><a href="{@docRoot}tools/testing-support-library/index.html"> + Android Testing Support Library</a></li> + </ul> + + <h2>This lesson teaches you to</h2> + + <ol> + <li><a href="#setup">Set Up Your Testing Environment</a></li> + <li><a href="#build">Create a Instrumented Unit Test Class</a></li> + <li><a href="#run">Run Instrumented Unit Tests</a></li> + </ol> + + <h2>Try it out</h2> + + <ul> + <li> +<a href="https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicUnitAndroidTest" +class="external-link">Instrumented Unit Tests Code Samples</a></li> + </ul> +</div> +</div> + +<p> +Instrumented unit tests are unit tests that run on physical devices and emulators, instead of +the Java Virtual Machine (JVM) on your local machine. You should create instrumented unit tests +if your tests need access to instrumentation information (such as the target app's +{@link android.content.Context}) or if they require the real implementation of an Android framework +component (such as a {@link android.os.Parcelable} or {@link android.content.SharedPreferences} +object). Using instrumented unit tests also helps to reduce the effort required to write and +maintain mock code. You are still free to use a mocking framework, if you choose, to simulate any +dependency relationships. Instrumented unit tests can take advantage of the Android framework APIs +and supporting APIs, such as the Android Testing Support Library. +</p> + +<h2 id="setup">Set Up Your Testing Environment</h2> +<p>Before building instrumented unit tests, you must:</p> + + <ul> + <li> + <strong>Install the Android Testing Support Library</strong>. The + <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> + {@code AndroidJUnitRunner}</a> API, located under the + {@code com.android.support.test.runner} package, allows you to + create and run instrumented unit tests. To learn how to install the + library, see <a href="{@docRoot}tools/testing-support-library/index.html#setup"> + Testing Support Library Setup</a>. + </li> + + <li> + <strong>Set up your project structure.</strong> In your Gradle project, the source code for + the target app that you want to test is typically placed under the {@code app/src/main/java} + folder. The source code for instrumentatation tests, including your unit tests, must be + placed under the <code>app/src/androidTest/java</code> folder. + To learn more about setting up your project directory, see + <a href="{@docRoot}tools/projects/index.html">Managing Projects</a>. + </li> + + <li> + <strong>Specify your Android testing dependencies</strong>. In order for the + <a href="{@docRoot}tools/building/plugin-for-gradle.html">Android Plug-in for Gradle</a> to + correctly build and run your instrumented unit tests, you must specify the following + libraries in the {@code build.gradle} file of your Android app module: + + <pre> +dependencies { + androidTestCompile 'com.android.support.test:runner:0.2' + androidTestCompile 'com.android.support.test:rules:0.2' + // Set this dependency if you want to use Hamcrest matching + androidTestCompile 'org.hamcrest:hamcrest-library:1.1' +} +</pre> + </li> + </ul> + +<h2 id="build">Create an Instrumented Unit Test Class</h2> +<p> +Your instrumented unit test class should be written as a JUnit 4 test class. To learn more about +creating JUnit 4 test classes and using JUnit 4 assertions and annotations, see +<a href="local-unit-tests.html#build">Create a Local Unit Test Class</a>. +</p> +<p>To create an instrumented JUnit 4 test class, add the {@code @RunWith(AndroidJUnit4.class)} +annotation at the beginning of your test class definition. You also need to specify the +<a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> +{@code AndroidJUnitRunner}</a> class +provided in the Android Testing Support Library as your default test runner. This step is described +in more detail in <a href="#run">Run Instrumented Unit Tests</a>. +</p> + +<p>The following example shows how you might write an instrumented unit test to test that +the {@link android.os.Parcelable} interface is implemented correctly for the +{@code LogHistory} class:</p> + +<pre> +import android.os.Parcel; +import android.support.test.runner.AndroidJUnit4; +import android.util.Pair; +import org.junit.Test; +import org.junit.runner.RunWith; +import java.util.List; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +@RunWith(AndroidJUnit4.class) +public class LogHistoryAndroidUnitTest { + + public static final String TEST_STRING = "This is a string"; + public static final long TEST_LONG = 12345678L; + private LogHistory mLogHistory; + + @Before + public void createLogHistory() { + mLogHistory = new LogHistory(); + } + + @Test + public void logHistory_ParcelableWriteRead() { + // Set up the Parcelable object to send and receive. + mLogHistory.addEntry(TEST_STRING, TEST_LONG); + + // Write the data. + Parcel parcel = Parcel.obtain(); + mLogHistory.writeToParcel(parcel, mLogHistory.describeContents()); + + // After you're done with writing, you need to reset the parcel for reading. + parcel.setDataPosition(0); + + // Read the data. + LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel); + List<Pair<String, Long>> createdFromParcelData = createdFromParcel.getData(); + + // Verify that the received data is correct. + assertThat(createdFromParcelData.size(), is(1)); + assertThat(createdFromParcelData.get(0).first, is(TEST_STRING)); + assertThat(createdFromParcelData.get(0).second, is(TEST_LONG)); + } +} +</pre> + +<h3 id="test-suites">Creating a test suite</h3> +<p> +To organize the execution of your instrumented unit tests, you can group a collection of test +classes in a <em>test suite</em> class and run these tests together. Test suites can be nested; +your test suite can group other test suites and run all their component test classes together. +</p> + +<p> +A test suite is contained in a test package, similar to the main application package. By +convention, the test suite package name usually ends with the {@code .suite} suffix (for example, +{@code com.example.android.testing.mysample.suite}). +</p> + +<p> +To create a test suite for your unit tests, import the JUnit +<a href="http://junit.sourceforge.net/javadoc/org/junit/runner/RunWith.html" +class="external-link">{@code RunWith}</a> and +<a href="http://junit.sourceforge.net/javadoc/org/junit/runners/Suite.html" +class="external-link">{@code Suite}</a> classes. In your test suite, add the +{@code @RunWith(Suite.class)} and the {@code @Suite.SuitClasses()} annotations. In +the {@code @Suite.SuiteClasses()} annotation, list the individual test classes or test +suites as arguments. +</p> + +<p> +The following example shows how you might implement a test suite called {@code UnitTestSuite} +that groups and runs the {@code CalculatorInstrumentationTest} and +{@code CalculatorAddParameterizedTest} test classes together. +</p> + +<pre> +import com.example.android.testing.mysample.CalculatorAddParameterizedTest; +import com.example.android.testing.mysample.CalculatorInstrumentationTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; + +// Runs all unit tests. +@RunWith(Suite.class) +@Suite.SuiteClasses({CalculatorInstrumentationTest.class, + CalculatorAddParameterizedTest.class}) +public class UnitTestSuite {} +</pre> + +<h2 id="run">Run Instrumented Unit Tests</h2> +<p> +The +<a href="https://developer.android.com/tools/building/plugin-for-gradle.html"> + Android Plug-in for Gradle</a> +provides a default directory ({@code src/androidTest/java}) for you to store the instrumented unit +and integration test classes and test suites that you want to run on a device. The plug-in compiles +the test code in that directory and then executes the test app using a test runner class. You must +set the +<a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> +{@code AndroidJUnitRunner}</a> class provided in the +<a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a> +as your default test runner.</p> +</p> + +<p>To specify +<a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html"> +{@code AndroidJUnitRunner}</a> as the default test instrumentation runner, add the following +setting in your {@code build.gradle} file:</p> +<pre> +android { + defaultConfig { + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } +} +</pre> + +<h3 id="run-from-Android-Studio">Running instrumented unit tests from Android Studio</h3> +<p> +To run instrumented unit tests in your Gradle project from Android Studio: +</p> +<ol> +<li>Open the <strong>Build Variants</strong> window by clicking the left-hand tab, then set the +test artifact to <em>Android Instrumentation Tests</em>. +</li> +<li>In the <strong>Project</strong> window, drill down to your unit test class or method, then + right-click and run it using the Android Test configuration. +</li> +</ol> + +<p>Android Studio displays the results of the unit test execution in the <strong>Run</strong> +window.</p> + +<h3 id="run-from-commandline">Running instrumented unit tests from the command-line</h3> + +<p>To run instrumented unit tests in your Gradle project from the command-line, call the + {@code connectedCheck} (or {@code cC}) task:</p> + +<pre> +./gradlew cC +</pre> + +<p>You can find the generated HTML test result reports in the +{@code <path_to_your_project>/app/build/outputs/reports/androidTests/connected/} directory, +and the corresponding XML files in the +{@code <path_to_your_project>/app/build/outputs/androidTest-results/connected/} directory.</p>
\ No newline at end of file diff --git a/docs/html/training/testing/unit-testing/local-unit-tests.jd b/docs/html/training/testing/unit-testing/local-unit-tests.jd new file mode 100644 index 000000000000..421709beaacc --- /dev/null +++ b/docs/html/training/testing/unit-testing/local-unit-tests.jd @@ -0,0 +1,302 @@ +page.title=Building Local Unit Tests +page.tags=testing,androidjunitrunner,junit,unit test,mock +trainingnavtop=true + +@jd:body + +<!-- This is the training bar --> +<div id="tb-wrapper"> +<div id="tb"> + <h2>Dependencies and Prerequisites</h2> + + <ul> + <li>Android Plug-in for Gradle 1.1.0 or higher</li> + </ul> + + <h2>This lesson teaches you to</h2> + + <ol> + <li><a href="#setup">Set Up Your Testing Environment</a></li> + <li><a href="#build">Create a Local Unit Test Class</a></li> + <li><a href="#run">Run Local Unit Tests</a></li> + </ol> + + <h2>Try it out</h2> + + <ul> + <li> +<a href="https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicSample" +class="external-link">Local Unit Tests Code Samples</a></li> + </ul> +</div> +</div> + +<p>If your unit test has no dependencies or only has simple dependencies on Android, you should run +your test on a local development machine. This testing approach is efficient because it helps +you avoid the overhead of loading the target app and unit test code onto a physical device or +emulator every time your test is run. Consequently, the execution time for running your unit +test is greatly reduced. With this approach, you normally use a mocking framework, like +<a href="https://code.google.com/p/mockito/" class="external-link">Mockito</a>, to fulfill any +dependency relationships.</p> + +<p><a href="{@docRoot}tools/building/plugin-for-gradle.html">Android Plug-in for Gradle</a> +version 1.1.0 and higher allows you to create a source directory ({@code src/test/java}) in your +project to store JUnit tests that you want to run on a local machine. This feature improves your +project organization by letting you group your unit tests together into a single source set. You +can run the tests from Android Studio or the command-line, and the plugin executes them on the +local Java Virtual Machine (JVM) on your development machine. </p> + +<h2 id="setup">Set Up Your Testing Environment</h2> +<p>Before building local unit tests, you must:</p> + + <ul> + <li> + <strong>Set up your project structure.</strong> In your Gradle project, the source code for + the target app that you want to test is typically placed under the {@code app/src/main/java} + folder. The source code for your local unit tests must be placed under the + <code>app/src/test/java</code> folder. + To learn more about setting up your project directory, see + <a href="#run">Run Local Unit Tests</a> and + <a href="{@docRoot}tools/projects/index.html">Managing Projects</a>. + </li> + + <li> + <strong>Specify your Android testing dependencies</strong>. In order to use JUnit 4 and + Mockito with your local unit tests, specify the following libraries in + the {@code build.gradle} file of your Android app module: + + <pre> +dependencies { + // Unit testing dependencies + testCompile 'junit:junit:4.12' + // Set this dependency if you want to use Mockito + testCompile 'org.mockito:mockito-core:1.10.19' + // Set this dependency if you want to use Hamcrest matching + androidTestCompile 'org.hamcrest:hamcrest-library:1.1' +} +</pre> + </li> + </ul> + +<h2 id="build">Create a Local Unit Test Class</h2> +<p>Your local unit test class should be written as a JUnit 4 test class. +<a href="http://junit.org/" class="external-link">JUnit</a> is the most popular +and widely-used unit testing framework for Java. The latest version of this framework, JUnit 4, +allows you to write tests in a cleaner and more flexible way than its predecessor versions. Unlike +the previous approach to Android unit testing based on JUnit 3, with JUnit 4, you do not need to +extend the {@code junit.framework.TestCase} class. You also do not need to prefix your test method +name with the {@code ‘test’} keyword, or use any classes in the {@code junit.framework} or +{@code junit.extensions} package.</p> + +<p>To create a basic JUnit 4 test class, create a Java class that contains one or more test methods. +A test method begins with the {@code @Test} annotation and contains the code to exercise +and verify a single functionality in the component that you want to test.</p> + +<p>The following example shows how you might implement a local unit test class. The test method +{@code emailValidator_CorrectEmailSimple_ReturnsTrue} verifies that the {@code isValidEmail()} +method in the app under test returns the correct result.</p> + +<pre> +import org.junit.Test; +import java.util.regex.Pattern; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class EmailValidatorTest { + + @Test + public void emailValidator_CorrectEmailSimple_ReturnsTrue() { + assertThat(EmailValidator.isValidEmail("name@email.com"), is(true)); + } + ... +} +</pre> + +<p>To test that components in your app return the expected results, use the +<a href="http://junit.org/javadoc/latest/org/junit/Assert.html" class="external-link"> +junit.Assert</a> methods to perform validation checks (or <em>assertions</em>) to compare the state +of the component under test against some expected value. To make tests more readable, you +can use <a href="https://code.google.com/p/hamcrest/wiki/Tutorial" class="external-link"> +Hamcrest matchers</a> (such as the {@code is()} and {@code equalTo()} methods) to match the +returned result against the expected result.</p> + +<p>In your JUnit 4 test class, you can use annotations to call out sections in your test code for +special processing, such as:</p> + +<ul> +<li> +{@code @Before}: Use this annotation to specify a block of code with test setup operations. This +code block will be invoked before each test. You can have multiple {@code @Before} methods but +the order which these methods are called is not fixed. +</li> +<li> +{@code @After}: This annotation specifies a block of code with test tear-down operations. This +code block will be called after every test method. You can define multiple {@code @After} +operations in your test code. Use this annotation to release any resources from memory. +</li> +<li> +{@code @Test}: Use this annotation to mark a test method. A single test class can contain +multiple test methods, each prefixed with this annotation. +</li> +<li> +{@code @BeforeClass}: Use this annotation to specify static methods to be invoked only once per +test class. This testing step is useful for expensive operations such as connecting to a database. +</li> +<li> +{@code @AfterClass}: Use this annotation to specify static methods to be invoked only after all +tests in the class have been run. This testing step is useful for releasing any resources allocated +in the {@code @BeforeClass} block. +</li> +<li> +{@code @Test(timeout=<milliseconds>)}: Specifies a timeout period for the test. If the +test starts but does not complete within the given timeout period, it automatically fails. You must +specify the timeout period in milliseconds, for example: {@code @Test(timeout=5000)}. +</li> +</ul> + +<h3 id="mocking-dependencies">Mocking Android dependencies</h3> +<p> +By default, the <a href="{@docRoot}tools/building/plugin-for-gradle.html"> +Android Plug-in for Gradle</a> executes your local unit tests against a modified +version of the {@code android.jar} library, which does not contain any actual code. Instead, method +calls to Android classes from your unit test throw an exception. +</p> +<p> +You can use a mocking framework to stub out external dependencies in your code, to easily test that +your component interacts with a dependency in an expected way. By substituting Android dependencies +with mock objects, you can isolate your unit test from the rest of the Android system while +verifying that the correct methods in those dependencies are called. The +<a href="https://code.google.com/p/mockito/" class="external-link">Mockito</a> mocking framework +for Java (version 1.9.5 and higher) offers compatibility with Android unit testing. +With Mockito, you can configure mock objects to return some specific value when invoked.</p> + +<p>To add a mock object to your local unit test using this framework, follow this programming model: +</p> + +<ol> +<li> +Include the Mockito library dependency in your {@code build.gradle} file, as described in +<a href="#setup">Set Up Your Testing Environment</a>. +</li> +<li>At the beginning of your unit test class definition, add the +{@code @RunWith(MockitoJUnitRunner.class)} annotation. This annotation tells the Mockito test +runner to validate that your usage of the framework is correct and simplifies the initialization of +your mock objects. +</li> +<li>To create a mock object for an Android dependency, add the {@code @Mock} annotation before +the field declaration.</li> +<li>To stub the behavior of the dependency, you can specify a condition and return +value when the condition is met by using the {@code when()} and {@code thenReturn()} methods. +</li> +</ol> + +<p> +The following example shows how you might create a unit test that uses a mock +{@link android.content.Context} object. +</p> + +<pre> +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.CoreMatchers.*; +import static org.mockito.Mockito.*; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import android.content.SharedPreferences; + +@RunWith(MockitoJUnitRunner.class) +public class UnitTestSample { + + private static final String FAKE_STRING = "HELLO WORLD"; + + @Mock + Context mMockContext; + + @Test + public void readStringFromContext_LocalizedString() { + // Given a mocked Context injected into the object under test... + when(mMockContext.getString(R.string.hello_word)) + .thenReturn(FAKE_STRING); + ClassUnderTest myObjectUnderTest = new ClassUnderTest(mMockContext); + + // ...when the string is returned from the object under test... + String result = myObjectUnderTest.getHelloWorldString(); + + // ...then the result should be the expected one. + assertThat(result, is(FAKE_STRING)); + } +} +</pre> + +<p> +To learn more about using the Mockito framework, see the +<a href="http://site.mockito.org/mockito/docs/current/org/mockito/Mockito.html" +class="external-link">Mockito API reference</a> and the +{@code SharedPreferencesHelperTest} class in the +<a href="https://github.com/googlesamples/android-testing/tree/master/unittesting/BasicSample" +class="external-link">sample code</a>. +</p> + +<h2 id="run">Run Local Unit Tests</h2> +<p> +The Android Plug-in for Gradle provides a default directory ({@code src/test/java}) for you to +store unit test classes that you want to run on a local JVM. The plug-in compiles the test code in +that directory and then executes the test app locally using the default test runner class. +</p> +<p> +As with production code, you can create unit tests for a +<a href="http://developer.android.com/tools/building/configuring-gradle.html#workBuildVariants" +class="external-link">specific flavor or build type</a>. You should keep unit tests in a test +source tree location that corresponds to your production source tree, such as: + +<table> +<tr> +<th>Path to Production Class</th> +<th>Path to Local Unit Test Class</th> +</tr> +<tr> +<td>{@code src/main/java/Foo.java}</td> +<td>{@code src/test/java/FooTest.java}</td> +</tr> +<tr> +<td>{@code src/debug/java/Foo.java}</td> +<td>{@code src/testDebug/java/FooTest.java}</td> +</tr> +<tr> +<td>{@code src/myFlavor/java/Foo.java}</td> +<td>{@code src/testMyFlavor/java/FooTest.java}</td> +</tr> +</table> + +<h3 id="run-from-Android-Studio">Running local unit tests from Android Studio</h3> +<p> +To run local unit tests in your Gradle project from Android Studio: +</p> +<ol> +<li>In the <strong>Project</strong> window, right click on the project and synchronize your project. +</li> +<li>Open the <strong>Build Variants</strong> window by clicking the left-hand tab, then change the +test artifact to <em>Unit Tests</em>. +</li> +<li>In the <strong>Project</strong> window, drill down to your unit test class or method, then +right-click and run it. +</li> +</ol> + +<p>Android Studio displays the results of the unit test execution in the <strong>Run</strong> +window.</p> + +<h3 id="run-from-commandline">Running local unit tests from the command-line</h3> + +<p>To run local unit tests in your Gradle project from the command-line, call the {@code test} task +command with the {@code --continue} option.</p> + +<pre> +./gradlew test --continue +</pre> + +<p>If there are failing tests, the command will display links to HTML reports (one per build +variant). You can find the generated HTML test result reports in the +{@code <path_to_your_project>/app/build/reports/tests/} directory, and the corresponding XML +files in the {@code <path_to_your_project>/app/build/test-results/} directory.</p>
\ No newline at end of file diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index 862663eefa1c..089739bd002f 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -1875,6 +1875,24 @@ results." </ul> </li> </ul> + <ul> + <li class="nav-section"> + <div class="nav-section-header"><a href="<?cs var:toroot ?>training/testing/unit-testing/index.html" + description="How to build effective unit tests for Android apps."> + Building Effective Unit Tests + </a></div> + <ul> + <li><a href="<?cs var:toroot ?>training/testing/unit-testing/local-unit-tests.html"> + <span class="en">Building Local Unit Tests</span> + </a> + </li> + <li><a href="<?cs var:toroot ?>training/testing/unit-testing/instrumented-unit-tests.html"> + <span class="en">Building Instrumented Unit Tests</span> + </a> + </li> + </ul> + </li> + </ul> </li> <!-- End best Testing --> diff --git a/graphics/java/android/graphics/Atlas.java b/graphics/java/android/graphics/Atlas.java index 39a5a53589f3..e0a534583b67 100644 --- a/graphics/java/android/graphics/Atlas.java +++ b/graphics/java/android/graphics/Atlas.java @@ -21,10 +21,12 @@ package android.graphics; */ public class Atlas { /** - * This flag indicates whether the packing algorithm will attempt - * to rotate entries to make them fit better in the atlas. + * WARNING: These flag values are part of the on-disk configuration information, + * do not change their values. */ - public static final int FLAG_ALLOW_ROTATIONS = 0x1; + + /** DELETED: FLAG_ROTATION = 0x01 */ + /** * This flag indicates whether the packing algorithm should leave * an empty 1 pixel wide border around each bitmap. This border can @@ -52,9 +54,7 @@ public class Atlas { /** * Represents a bitmap packed in the atlas. Each entry has a location in - * pixels in the atlas and a rotation flag. If the entry was rotated, the - * bitmap must be rotated by 90 degrees (in either direction as long as - * the origin remains the same) before being rendered into the atlas. + * pixels in the atlas and a rotation flag. */ public static class Entry { /** @@ -65,11 +65,6 @@ public class Atlas { * Location, in pixels, of the bitmap on the Y axis in the atlas. */ public int y; - - /** - * If true, the bitmap must be rotated 90 degrees in the atlas. - */ - public boolean rotated; } private final Policy mPolicy; @@ -239,7 +234,6 @@ public class Atlas { private final SplitDecision mSplitDecision; - private final boolean mAllowRotation; private final int mPadding; /** @@ -263,7 +257,6 @@ public class Atlas { } SlicePolicy(int width, int height, int flags, SplitDecision splitDecision) { - mAllowRotation = (flags & FLAG_ALLOW_ROTATIONS) != 0; mPadding = (flags & FLAG_ADD_PADDING) != 0 ? 1 : 0; // The entire atlas is empty at first, minus padding @@ -360,26 +353,9 @@ public class Atlas { * * @return True if the rectangle was packed in the atlas, false otherwise */ - @SuppressWarnings("SuspiciousNameCombination") private boolean insert(Cell cell, Cell prev, int width, int height, Entry entry) { - boolean rotated = false; - - // If the rectangle doesn't fit we'll try to rotate it - // if possible before giving up if (cell.width < width || cell.height < height) { - if (mAllowRotation) { - if (cell.width < height || cell.height < width) { - return false; - } - - // Rotate the rectangle - int temp = width; - width = height; - height = temp; - rotated = true; - } else { - return false; - } + return false; } // Remaining free space after packing the rectangle @@ -433,7 +409,6 @@ public class Atlas { // Return the location and rotation of the packed rectangle entry.x = cell.x; entry.y = cell.y; - entry.rotated = rotated; return true; } diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index c850b074a90e..2d8b0b22b46f 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -330,6 +330,7 @@ public final class Bitmap implements Parcelable { * @return The current generation ID for this bitmap. */ public int getGenerationId() { + if (mRecycled) return 0; return nativeGenerationId(mFinalizer.mNativeBitmap); } @@ -1040,6 +1041,7 @@ public final class Bitmap implements Parcelable { * @see BitmapFactory.Options#inPremultiplied */ public final boolean isPremultiplied() { + if (mRecycled) return false; return nativeIsPremultiplied(mFinalizer.mNativeBitmap); } @@ -1064,6 +1066,7 @@ public final class Bitmap implements Parcelable { * @see BitmapFactory.Options#inPremultiplied */ public final void setPremultiplied(boolean premultiplied) { + checkRecycled("setPremultiplied called on a recycled bitmap"); mRequestPremultiplied = premultiplied; nativeSetPremultiplied(mFinalizer.mNativeBitmap, premultiplied); } @@ -1157,6 +1160,7 @@ public final class Bitmap implements Parcelable { * @return number of bytes between rows of the native bitmap pixels. */ public final int getRowBytes() { + if (mRecycled) return 0; return nativeRowBytes(mFinalizer.mNativeBitmap); } @@ -1200,6 +1204,7 @@ public final class Bitmap implements Parcelable { * that config, otherwise return null. */ public final Config getConfig() { + if (mRecycled) return Config.ARGB_8888; return Config.nativeToConfig(nativeConfig(mFinalizer.mNativeBitmap)); } @@ -1212,6 +1217,7 @@ public final class Bitmap implements Parcelable { * it will return true by default. */ public final boolean hasAlpha() { + if (mRecycled) return false; return nativeHasAlpha(mFinalizer.mNativeBitmap); } @@ -1226,6 +1232,7 @@ public final class Bitmap implements Parcelable { * non-opaque per-pixel alpha values. */ public void setHasAlpha(boolean hasAlpha) { + checkRecycled("setHasAlpha called on a recycled bitmap"); nativeSetHasAlpha(mFinalizer.mNativeBitmap, hasAlpha, mRequestPremultiplied); } @@ -1247,6 +1254,7 @@ public final class Bitmap implements Parcelable { * @see #setHasMipMap(boolean) */ public final boolean hasMipMap() { + if (mRecycled) return false; return nativeHasMipMap(mFinalizer.mNativeBitmap); } @@ -1271,6 +1279,7 @@ public final class Bitmap implements Parcelable { * @see #hasMipMap() */ public final void setHasMipMap(boolean hasMipMap) { + checkRecycled("setHasMipMap called on a recycled bitmap"); nativeSetHasMipMap(mFinalizer.mNativeBitmap, hasMipMap); } @@ -1549,6 +1558,10 @@ public final class Bitmap implements Parcelable { * If other is null, return false. */ public boolean sameAs(Bitmap other) { + checkRecycled("Can't call sameAs on a recycled bitmap!"); + if (other.isRecycled()) { + throw new IllegalArgumentException("Can't compare to a recycled bitmap!"); + } return this == other || (other != null && nativeSameAs(mFinalizer.mNativeBitmap, other.mFinalizer.mNativeBitmap)); } @@ -1568,6 +1581,7 @@ public final class Bitmap implements Parcelable { // TODO: Consider having this start an async upload? // With inPurgeable no-op'd there's currently no use for this // method, but it could have interesting future uses. + checkRecycled("Can't prepareToDraw on a recycled bitmap!"); } /** @@ -1576,6 +1590,7 @@ public final class Bitmap implements Parcelable { * @hide * */ public final long refSkPixelRef() { + checkRecycled("Can't refSkPixelRef on a recycled bitmap!"); return nativeRefPixelRef(mNativePtr); } diff --git a/include/androidfw/ResourceTypes.h b/include/androidfw/ResourceTypes.h index 587e7fa761d6..b15caeb1b4ae 100644 --- a/include/androidfw/ResourceTypes.h +++ b/include/androidfw/ResourceTypes.h @@ -1631,6 +1631,7 @@ public: status_t applyStyle(uint32_t resID, bool force=false); status_t setTo(const Theme& other); + status_t clear(); /** * Retrieve a value in the theme. If the theme defines this diff --git a/keystore/java/android/security/AndroidKeyPairGenerator.java b/keystore/java/android/security/AndroidKeyPairGenerator.java index 3b25ba66b9c3..3f29c6ab83b6 100644 --- a/keystore/java/android/security/AndroidKeyPairGenerator.java +++ b/keystore/java/android/security/AndroidKeyPairGenerator.java @@ -54,13 +54,13 @@ public abstract class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { public static class RSA extends AndroidKeyPairGenerator { public RSA() { - super("RSA"); + super(KeyStoreKeyProperties.Algorithm.RSA); } } public static class EC extends AndroidKeyPairGenerator { public EC() { - super("EC"); + super(KeyStoreKeyProperties.Algorithm.EC); } } @@ -83,15 +83,15 @@ public abstract class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { private android.security.KeyStore mKeyStore; private KeyPairGeneratorSpec mSpec; - private String mKeyAlgorithm; + private @KeyStoreKeyProperties.AlgorithmEnum String mKeyAlgorithm; private int mKeyType; private int mKeySize; - protected AndroidKeyPairGenerator(String algorithm) { + protected AndroidKeyPairGenerator(@KeyStoreKeyProperties.AlgorithmEnum String algorithm) { mAlgorithm = algorithm; } - public String getAlgorithm() { + public @KeyStoreKeyProperties.AlgorithmEnum String getAlgorithm() { return mAlgorithm; } @@ -197,7 +197,7 @@ public abstract class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { return certGen.generate(privateKey); } - private String getKeyAlgorithm(KeyPairGeneratorSpec spec) { + private @KeyStoreKeyProperties.AlgorithmEnum String getKeyAlgorithm(KeyPairGeneratorSpec spec) { String result = spec.getKeyType(); if (result != null) { return result; @@ -248,10 +248,11 @@ public abstract class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { } } - private static String getDefaultSignatureAlgorithmForKeyAlgorithm(String algorithm) { - if ("RSA".equalsIgnoreCase(algorithm)) { + private static String getDefaultSignatureAlgorithmForKeyAlgorithm( + @KeyStoreKeyProperties.AlgorithmEnum String algorithm) { + if (KeyStoreKeyProperties.Algorithm.RSA.equalsIgnoreCase(algorithm)) { return "sha256WithRSA"; - } else if ("EC".equalsIgnoreCase(algorithm)) { + } else if (KeyStoreKeyProperties.Algorithm.EC.equalsIgnoreCase(algorithm)) { return "sha256WithECDSA"; } else { throw new IllegalArgumentException("Unsupported key type " + algorithm); @@ -287,7 +288,7 @@ public abstract class AndroidKeyPairGenerator extends KeyPairGeneratorSpi { } KeyPairGeneratorSpec spec = (KeyPairGeneratorSpec) params; - String keyAlgorithm = getKeyAlgorithm(spec); + @KeyStoreKeyProperties.AlgorithmEnum String keyAlgorithm = getKeyAlgorithm(spec); int keyType = KeyStore.getKeyTypeForAlgorithm(keyAlgorithm); if (keyType == -1) { throw new InvalidAlgorithmParameterException( diff --git a/keystore/java/android/security/AndroidKeyStore.java b/keystore/java/android/security/AndroidKeyStore.java index 72cb062c8bf4..69d80e644112 100644 --- a/keystore/java/android/security/AndroidKeyStore.java +++ b/keystore/java/android/security/AndroidKeyStore.java @@ -103,8 +103,9 @@ public class AndroidKeyStore extends KeyStoreSpi { keyAliasInKeystore, null, null, keyCharacteristics); if ((errorCode != KeymasterDefs.KM_ERROR_OK) && (errorCode != android.security.KeyStore.NO_ERROR)) { - throw new UnrecoverableKeyException("Failed to load information about key." - + " Error code: " + errorCode); + throw (UnrecoverableKeyException) + new UnrecoverableKeyException("Failed to load information about key") + .initCause(mKeyStore.getInvalidKeyException(alias, errorCode)); } int keymasterAlgorithm = @@ -128,10 +129,11 @@ public class AndroidKeyStore extends KeyStoreSpi { keymasterDigest = keymasterDigests.get(0); } - String keyAlgorithmString; + @KeyStoreKeyProperties.AlgorithmEnum String keyAlgorithmString; try { - keyAlgorithmString = KeymasterUtils.getJcaSecretKeyAlgorithm( - keymasterAlgorithm, keymasterDigest); + keyAlgorithmString = + KeyStoreKeyProperties.Algorithm.fromKeymasterSecretKeyAlgorithm( + keymasterAlgorithm, keymasterDigest); } catch (IllegalArgumentException e) { throw (UnrecoverableKeyException) new UnrecoverableKeyException("Unsupported secret key type").initCause(e); @@ -451,10 +453,10 @@ public class AndroidKeyStore extends KeyStoreSpi { int keymasterAlgorithm; int keymasterDigest; try { - keymasterAlgorithm = KeymasterUtils.getKeymasterAlgorithmFromJcaSecretKeyAlgorithm( + keymasterAlgorithm = KeyStoreKeyProperties.Algorithm.toKeymasterSecretKeyAlgorithm( keyAlgorithmString); keymasterDigest = - KeymasterUtils.getKeymasterDigestfromJcaSecretKeyAlgorithm(keyAlgorithmString); + KeyStoreKeyProperties.Algorithm.toKeymasterDigest(keyAlgorithmString); } catch (IllegalArgumentException e) { throw new KeyStoreException("Unsupported secret key algorithm: " + keyAlgorithmString); } @@ -465,8 +467,7 @@ public class AndroidKeyStore extends KeyStoreSpi { int[] keymasterDigests; if (params.isDigestsSpecified()) { // Digest(s) specified in parameters - keymasterDigests = - KeymasterUtils.getKeymasterDigestsFromJcaDigestAlgorithms(params.getDigests()); + keymasterDigests = KeyStoreKeyProperties.Digest.allToKeymaster(params.getDigests()); if (keymasterDigest != -1) { // Digest also specified in the JCA key algorithm name. if (!com.android.internal.util.ArrayUtils.contains( @@ -494,8 +495,8 @@ public class AndroidKeyStore extends KeyStoreSpi { } @KeyStoreKeyProperties.PurposeEnum int purposes = params.getPurposes(); - int[] keymasterBlockModes = KeymasterUtils.getKeymasterBlockModesFromJcaBlockModes( - params.getBlockModes()); + int[] keymasterBlockModes = + KeyStoreKeyProperties.BlockMode.allToKeymaster(params.getBlockModes()); if (((purposes & KeyStoreKeyProperties.Purpose.ENCRYPT) != 0) && (params.isRandomizedEncryptionRequired())) { for (int keymasterBlockMode : keymasterBlockModes) { @@ -503,8 +504,7 @@ public class AndroidKeyStore extends KeyStoreSpi { throw new KeyStoreException( "Randomized encryption (IND-CPA) required but may be violated by block" + " mode: " - + KeymasterUtils.getJcaBlockModeFromKeymasterBlockMode( - keymasterBlockMode) + + KeyStoreKeyProperties.BlockMode.fromKeymaster(keymasterBlockMode) + ". See KeyStoreParameter documentation."); } } @@ -513,11 +513,11 @@ public class AndroidKeyStore extends KeyStoreSpi { args.addInt(KeymasterDefs.KM_TAG_PURPOSE, keymasterPurpose); } args.addInts(KeymasterDefs.KM_TAG_BLOCK_MODE, keymasterBlockModes); - int[] keymasterPaddings = ArrayUtils.concat( - KeymasterUtils.getKeymasterPaddingsFromJcaEncryptionPaddings( - params.getEncryptionPaddings()), - KeymasterUtils.getKeymasterPaddingsFromJcaSignaturePaddings( - params.getSignaturePaddings())); + if (params.getSignaturePaddings().length > 0) { + throw new KeyStoreException("Signature paddings not supported for symmetric keys"); + } + int[] keymasterPaddings = KeyStoreKeyProperties.EncryptionPadding.allToKeymaster( + params.getEncryptionPaddings()); args.addInts(KeymasterDefs.KM_TAG_PADDING, keymasterPaddings); KeymasterUtils.addUserAuthArgs(args, params.getContext(), diff --git a/keystore/java/android/security/EcIesParameterSpec.java b/keystore/java/android/security/EcIesParameterSpec.java index a3e5aec7bb86..af935195a903 100644 --- a/keystore/java/android/security/EcIesParameterSpec.java +++ b/keystore/java/android/security/EcIesParameterSpec.java @@ -1,6 +1,8 @@ package android.security; import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -50,7 +52,11 @@ import javax.crypto.Mac; public class EcIesParameterSpec implements AlgorithmParameterSpec { @Retention(RetentionPolicy.SOURCE) - @IntDef(value = {PointFormat.UNCOMPRESSED, PointFormat.COMPRESSED}) + @IntDef({ + PointFormat.UNSPECIFIED, + PointFormat.UNCOMPRESSED, + PointFormat.COMPRESSED, + }) public @interface PointFormatEnum {} /** @@ -127,6 +133,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * Returns KEM KDF algorithm (e.g., {@code HKDFwithSHA256} or {@code KDF1withSHA1}) or * {@code null} if not specified. */ + @Nullable public String getKemKdfAlgorithm() { return mKemKdfAlgorithm; } @@ -138,6 +145,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * @see Cipher#getInstance(String) * @see #getDemCipherKeySize() */ + @Nullable public String getDemCipherTransformation() { return mDemCipherTransformation; } @@ -158,6 +166,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * @see Mac#getInstance(String) * @see #getDemMacKeySize() */ + @Nullable public String getDemMacAlgorithm() { return mDemMacAlgorithm; } @@ -194,7 +203,8 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * Sets KEM KDF algorithm. For example, {@code HKDFwithSHA256}, {@code KDF2withSHA256}, or * {@code KDF1withSHA1}. */ - public Builder setKemKdfAlgorithm(String algorithm) { + @NonNull + public Builder setKemKdfAlgorithm(@Nullable String algorithm) { mKemKdfAlgorithm = algorithm; return this; } @@ -205,7 +215,8 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * * @see Cipher#getInstance(String) */ - public Builder setDemCipherTransformation(String transformation) { + @NonNull + public Builder setDemCipherTransformation(@Nullable String transformation) { mDemCipherTransformation = transformation; return this; } @@ -217,6 +228,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * * @see #setDemCipherTransformation(String) */ + @NonNull public Builder setDemCipherKeySize(int sizeBits) { mDemCipherKeySize = sizeBits; return this; @@ -227,7 +239,8 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * * @see Mac#getInstance(String) */ - public Builder setDemMacAlgorithm(String algorithm) { + @NonNull + public Builder setDemMacAlgorithm(@Nullable String algorithm) { mDemMacAlgorithm = algorithm; return this; } @@ -239,6 +252,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { * * @see #setDemCipherKeySize(int) */ + @NonNull public Builder setDemMacKeySize(int sizeBits) { mDemMacKeySize = sizeBits; return this; @@ -247,6 +261,7 @@ public class EcIesParameterSpec implements AlgorithmParameterSpec { /** * Returns a new {@link EcIesParameterSpec} based on the current state of this builder. */ + @NonNull public EcIesParameterSpec build() { int demMacKeySize = (mDemMacKeySize != -1) ? mDemMacKeySize : mDemCipherKeySize; return new EcIesParameterSpec( diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index e9c24ddc7afb..d3dbebfb86f4 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -15,6 +15,8 @@ */ package android.security; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.Activity; import android.app.PendingIntent; import android.content.ComponentName; @@ -217,6 +219,7 @@ public final class KeyChain { * successfully installed, otherwise {@link * Activity#RESULT_CANCELED} will be returned. */ + @NonNull public static Intent createInstallIntent() { Intent intent = new Intent(ACTION_INSTALL); intent.setClassName(CERT_INSTALLER_PACKAGE, @@ -261,8 +264,10 @@ public final class KeyChain { * @param alias The alias to preselect if available, or null if * unavailable. */ - public static void choosePrivateKeyAlias(Activity activity, KeyChainAliasCallback response, - String[] keyTypes, Principal[] issuers, String host, int port, String alias) { + public static void choosePrivateKeyAlias(@NonNull Activity activity, + @NonNull KeyChainAliasCallback response, + @KeyStoreKeyProperties.AlgorithmEnum String[] keyTypes, Principal[] issuers, + @Nullable String host, int port, @Nullable String alias) { choosePrivateKeyAlias(activity, response, keyTypes, issuers, host, port, null, alias); } @@ -305,10 +310,10 @@ public final class KeyChain { * @param alias The alias to preselect if available, or null if * unavailable. */ - public static void choosePrivateKeyAlias(Activity activity, KeyChainAliasCallback response, - String[] keyTypes, Principal[] issuers, - String host, int port, String url, - String alias) { + public static void choosePrivateKeyAlias(@NonNull Activity activity, + @NonNull KeyChainAliasCallback response, + @KeyStoreKeyProperties.AlgorithmEnum String[] keyTypes, Principal[] issuers, + @Nullable String host, int port, @Nullable String url, @Nullable String alias) { /* * TODO currently keyTypes, issuers are unused. They are meant * to follow the semantics and purpose of X509KeyManager @@ -361,7 +366,8 @@ public final class KeyChain { * returned via {@link KeyChainAliasCallback#alias}. * @throws KeyChainException if the alias was valid but there was some problem accessing it. */ - public static PrivateKey getPrivateKey(Context context, String alias) + @Nullable + public static PrivateKey getPrivateKey(@NonNull Context context, @NonNull String alias) throws KeyChainException, InterruptedException { if (alias == null) { throw new NullPointerException("alias == null"); @@ -396,8 +402,9 @@ public final class KeyChain { * returned via {@link KeyChainAliasCallback#alias}. * @throws KeyChainException if the alias was valid but there was some problem accessing it. */ - public static X509Certificate[] getCertificateChain(Context context, String alias) - throws KeyChainException, InterruptedException { + @Nullable + public static X509Certificate[] getCertificateChain(@NonNull Context context, + @NonNull String alias) throws KeyChainException, InterruptedException { if (alias == null) { throw new NullPointerException("alias == null"); } @@ -431,9 +438,11 @@ public final class KeyChain { * specific {@code PrivateKey} type indicated by {@code algorithm} (e.g., * "RSA"). */ - public static boolean isKeyAlgorithmSupported(String algorithm) { + public static boolean isKeyAlgorithmSupported( + @NonNull @KeyStoreKeyProperties.AlgorithmEnum String algorithm) { final String algUpper = algorithm.toUpperCase(Locale.US); - return "EC".equals(algUpper) || "RSA".equals(algUpper); + return KeyStoreKeyProperties.Algorithm.EC.equals(algUpper) + || KeyStoreKeyProperties.Algorithm.RSA.equals(algUpper); } /** @@ -443,7 +452,8 @@ public final class KeyChain { * hardware support that can be used to bind keys to the device in a way * that makes it non-exportable. */ - public static boolean isBoundKeyAlgorithm(String algorithm) { + public static boolean isBoundKeyAlgorithm( + @NonNull @KeyStoreKeyProperties.AlgorithmEnum String algorithm) { if (!isKeyAlgorithmSupported(algorithm)) { return false; } @@ -452,7 +462,8 @@ public final class KeyChain { } /** @hide */ - public static X509Certificate toCertificate(byte[] bytes) { + @NonNull + public static X509Certificate toCertificate(@NonNull byte[] bytes) { if (bytes == null) { throw new IllegalArgumentException("bytes == null"); } @@ -493,14 +504,14 @@ public final class KeyChain { * * Caller should call unbindService on the result when finished. */ - public static KeyChainConnection bind(Context context) throws InterruptedException { + public static KeyChainConnection bind(@NonNull Context context) throws InterruptedException { return bindAsUser(context, Process.myUserHandle()); } /** * @hide */ - public static KeyChainConnection bindAsUser(Context context, UserHandle user) + public static KeyChainConnection bindAsUser(@NonNull Context context, UserHandle user) throws InterruptedException { if (context == null) { throw new NullPointerException("context == null"); @@ -534,7 +545,7 @@ public final class KeyChain { return new KeyChainConnection(context, keyChainServiceConnection, q.take()); } - private static void ensureNotOnMainThread(Context context) { + private static void ensureNotOnMainThread(@NonNull Context context) { Looper looper = Looper.myLooper(); if (looper != null && looper == context.getMainLooper()) { throw new IllegalStateException( diff --git a/keystore/java/android/security/KeyChainAliasCallback.java b/keystore/java/android/security/KeyChainAliasCallback.java index 2500863f4b08..8e413770d188 100644 --- a/keystore/java/android/security/KeyChainAliasCallback.java +++ b/keystore/java/android/security/KeyChainAliasCallback.java @@ -15,6 +15,8 @@ */ package android.security; +import android.annotation.Nullable; + /** * The KeyChainAliasCallback is the callback for {@link * KeyChain#choosePrivateKeyAlias}. @@ -25,5 +27,5 @@ public interface KeyChainAliasCallback { * Called with the alias of the certificate chosen by the user, or * null if no value was chosen. */ - public void alias(String alias); + public void alias(@Nullable String alias); } diff --git a/keystore/java/android/security/KeyGeneratorSpec.java b/keystore/java/android/security/KeyGeneratorSpec.java index 8f135a6f4b7b..404f9393e409 100644 --- a/keystore/java/android/security/KeyGeneratorSpec.java +++ b/keystore/java/android/security/KeyGeneratorSpec.java @@ -16,6 +16,10 @@ package android.security; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.KeyguardManager; import android.content.Context; import android.text.TextUtils; @@ -24,19 +28,53 @@ import java.util.Date; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; -import javax.crypto.SecretKey; /** - * {@link AlgorithmParameterSpec} for initializing a {@code KeyGenerator} that works with - * <a href="{@docRoot}training/articles/keystore.html">Android KeyStore facility</a>. + * {@link AlgorithmParameterSpec} for initializing a {@link KeyGenerator} of the + * <a href="{@docRoot}training/articles/keystore.html">Android KeyStore facility</a>. This class + * specifies whether user authentication is required for using the key, what uses the key is + * authorized for (e.g., only in {@code CBC} mode), whether the key should be encrypted at rest, the + * key's and validity start and end dates. * - * <p>The Android KeyStore facility is accessed through a {@link KeyGenerator} API using the - * {@code AndroidKeyStore} provider. The {@code context} passed in may be used to pop up some UI to - * ask the user to unlock or initialize the Android KeyStore facility. + * <p>To generate a key, create an instance of this class using the {@link Builder}, initialize a + * {@code KeyGenerator} of the desired key type (e.g., {@code AES} or {@code HmacSHA256}) from the + * {@code AndroidKeyStore} provider with the {@code KeyGeneratorSpec} instance, and then generate a + * key using {@link KeyGenerator#generateKey()}. * - * <p>After generation, the {@code keyStoreAlias} is used with the - * {@link java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter)} - * interface to retrieve the {@link SecretKey}. + * <p>The generated key will be returned by the {@code KeyGenerator} and also stored in the Android + * KeyStore under the alias specified in this {@code KeyGeneratorSpec}. To obtain the key from the + * Android KeyStore use + * {@link java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null)} or + * {@link java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null)}. + * + * <p>NOTE: The key material of the keys generating using the {@code KeyGeneratorSpec} is not + * accessible. + * + * <p><h3>Example</h3> + * The following example illustrates how to generate an HMAC key in the Android KeyStore under alias + * {@code key1} authorized to be used only for HMAC with SHA-256 digest and only if the user has + * been authenticated within the last five minutes. + * <pre> {@code + * KeyGenerator keyGenerator = KeyGenerator.getInstance( + * KeyStoreKeyProperties.Algorithm.HMAC_SHA256, + * "AndroidKeyStore"); + * keyGenerator.initialize( + * new KeyGeneratorSpec.Builder(context) + * .setAlias("key1") + * .setPurposes(KeyStoreKeyProperties.Purpose.SIGN + * | KeyStoreKeyProperties.Purpose.VERIFY) + * // Only permit this key to be used if the user authenticated + * // within the last five minutes. + * .setUserAuthenticationRequired(true) + * .setUserAuthenticationValidityDurationSeconds(5 * 60) + * .build()); + * SecretKey key = keyGenerator.generateKey(); + * + * // The key can also be obtained from the Android KeyStore any time as follows: + * KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + * keyStore.load(null); + * SecretKey key = (SecretKey) keyStore.getKey("key1", null); + * }</pre> */ public class KeyGeneratorSpec implements AlgorithmParameterSpec { @@ -48,8 +86,8 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { private final Date mKeyValidityForOriginationEnd; private final Date mKeyValidityForConsumptionEnd; private final @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private final String[] mEncryptionPaddings; - private final String[] mBlockModes; + private final @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; + private final @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private final boolean mRandomizedEncryptionRequired; private final boolean mUserAuthenticationRequired; private final int mUserAuthenticationValidityDurationSeconds; @@ -63,8 +101,8 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { Date keyValidityForOriginationEnd, Date keyValidityForConsumptionEnd, @KeyStoreKeyProperties.PurposeEnum int purposes, - String[] encryptionPaddings, - String[] blockModes, + @KeyStoreKeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, + @KeyStoreKeyProperties.BlockModeEnum String[] blockModes, boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, int userAuthenticationValidityDurationSeconds) { @@ -128,6 +166,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityStart() { return mKeyValidityStart; } @@ -137,6 +176,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForConsumptionEnd() { return mKeyValidityForConsumptionEnd; } @@ -146,6 +186,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForOriginationEnd() { return mKeyValidityForOriginationEnd; } @@ -160,14 +201,16 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { /** * Gets the set of padding schemes with which the key can be used when encrypting/decrypting. */ - public String[] getEncryptionPaddings() { + @NonNull + public @KeyStoreKeyProperties.EncryptionPaddingEnum String[] getEncryptionPaddings() { return ArrayUtils.cloneIfNotEmpty(mEncryptionPaddings); } /** * Gets the set of block modes with which the key can be used. */ - public String[] getBlockModes() { + @NonNull + public @KeyStoreKeyProperties.BlockModeEnum String[] getBlockModes() { return ArrayUtils.cloneIfNotEmpty(mBlockModes); } @@ -195,17 +238,20 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { /** * Gets the duration of time (seconds) for which this key can be used after the user is - * successfully authenticated. + * successfully authenticated. This has effect only if user authentication is required. + * + * @return duration in seconds or {@code -1} if authentication is required for every use of the + * key. * - * @return duration in seconds or {@code -1} if not restricted. {@code 0} means authentication - * is required for every use of the key. + * @see #isUserAuthenticationRequired() */ public int getUserAuthenticationValidityDurationSeconds() { return mUserAuthenticationValidityDurationSeconds; } /** - * Returns {@code true} if the key must be encrypted in the {@link java.security.KeyStore}. + * Returns {@code true} if the key must be encrypted at rest. This will protect the key with the + * secure lock screen credential (e.g., password, PIN, or pattern). */ public boolean isEncryptionRequired() { return (mFlags & KeyStore.FLAG_ENCRYPTED) != 0; @@ -220,8 +266,8 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { private Date mKeyValidityForOriginationEnd; private Date mKeyValidityForConsumptionEnd; private @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private String[] mEncryptionPaddings; - private String[] mBlockModes; + private @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; + private @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private boolean mRandomizedEncryptionRequired = true; private boolean mUserAuthenticationRequired; private int mUserAuthenticationValidityDurationSeconds = -1; @@ -231,7 +277,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * {@code context} passed in may be used to pop up some UI to ask the user to unlock or * initialize the Android KeyStore facility. */ - public Builder(Context context) { + public Builder(@NonNull Context context) { if (context == null) { throw new NullPointerException("context == null"); } @@ -244,7 +290,8 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * <p>The alias must be provided. There is no default. */ - public Builder setAlias(String alias) { + @NonNull + public Builder setAlias(@NonNull String alias) { if (alias == null) { throw new NullPointerException("alias == null"); } @@ -258,22 +305,27 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * <p>By default, the key size will be determines based on the key algorithm. For example, * for {@code HmacSHA256}, the key size will default to {@code 256}. */ + @NonNull public Builder setKeySize(int keySize) { mKeySize = keySize; return this; } /** - * Indicates that this key must be encrypted at rest on storage. Note that enabling this - * will require that the user enable a strong lock screen (e.g., PIN, password) before - * creating or using the generated key is successful. + * Indicates that this key must be encrypted at rest. This will protect the key with the + * secure lock screen credential (e.g., password, PIN, or pattern). + * + * <p>Note that this feature requires that the secure lock screen (e.g., password, PIN, + * pattern) is set up, otherwise key generation will fail. Moreover, this key will be + * deleted when the secure lock screen is disabled or reset (e.g., by the user or a Device + * Administrator). Finally, this key cannot be used until the user unlocks the secure lock + * screen after boot. + * + * @see KeyguardManager#isDeviceSecure() */ - public Builder setEncryptionRequired(boolean required) { - if (required) { - mFlags |= KeyStore.FLAG_ENCRYPTED; - } else { - mFlags &= ~KeyStore.FLAG_ENCRYPTED; - } + @NonNull + public Builder setEncryptionRequired() { + mFlags |= KeyStore.FLAG_ENCRYPTED; return this; } @@ -284,6 +336,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @see #setKeyValidityEnd(Date) */ + @NonNull public Builder setKeyValidityStart(Date startDate) { mKeyValidityStart = startDate; return this; @@ -298,6 +351,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * @see #setKeyValidityForConsumptionEnd(Date) * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityEnd(Date endDate) { setKeyValidityForOriginationEnd(endDate); setKeyValidityForConsumptionEnd(endDate); @@ -311,6 +365,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @see #setKeyValidityForConsumptionEnd(Date) */ + @NonNull public Builder setKeyValidityForOriginationEnd(Date endDate) { mKeyValidityForOriginationEnd = endDate; return this; @@ -324,6 +379,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityForConsumptionEnd(Date endDate) { mKeyValidityForConsumptionEnd = endDate; return this; @@ -334,6 +390,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * <p>This must be specified for all keys. There is no default. */ + @NonNull public Builder setPurposes(@KeyStoreKeyProperties.PurposeEnum int purposes) { mPurposes = purposes; return this; @@ -346,7 +403,9 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * <p>This must be specified for keys which are used for encryption/decryption. */ - public Builder setEncryptionPaddings(String... paddings) { + @NonNull + public Builder setEncryptionPaddings( + @KeyStoreKeyProperties.EncryptionPaddingEnum String... paddings) { mEncryptionPaddings = ArrayUtils.cloneIfNotEmpty(paddings); return this; } @@ -357,7 +416,8 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * <p>This must be specified for encryption/decryption keys. */ - public Builder setBlockModes(String... blockModes) { + @NonNull + public Builder setBlockModes(@KeyStoreKeyProperties.BlockModeEnum String... blockModes) { mBlockModes = ArrayUtils.cloneIfNotEmpty(blockModes); return this; } @@ -394,6 +454,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * ciphertext.</li> * </ul> */ + @NonNull public Builder setRandomizedEncryptionRequired(boolean required) { mRandomizedEncryptionRequired = required; return this; @@ -414,6 +475,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @see #setUserAuthenticationValidityDurationSeconds(int) */ + @NonNull public Builder setUserAuthenticationRequired(boolean required) { mUserAuthenticationRequired = required; return this; @@ -425,12 +487,14 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * <p>By default, the user needs to authenticate for every use of the key. * - * @param seconds duration in seconds or {@code 0} if the user needs to authenticate for + * @param seconds duration in seconds or {@code -1} if the user needs to authenticate for * every use of the key. * * @see #setUserAuthenticationRequired(boolean) */ - public Builder setUserAuthenticationValidityDurationSeconds(int seconds) { + @NonNull + public Builder setUserAuthenticationValidityDurationSeconds( + @IntRange(from = -1) int seconds) { mUserAuthenticationValidityDurationSeconds = seconds; return this; } @@ -440,6 +504,7 @@ public class KeyGeneratorSpec implements AlgorithmParameterSpec { * * @throws IllegalArgumentException if a required field is missing or violates a constraint. */ + @NonNull public KeyGeneratorSpec build() { return new KeyGeneratorSpec(mContext, mKeystoreAlias, diff --git a/keystore/java/android/security/KeyPairGeneratorSpec.java b/keystore/java/android/security/KeyPairGeneratorSpec.java index d6d37897eee4..2086ccb65977 100644 --- a/keystore/java/android/security/KeyPairGeneratorSpec.java +++ b/keystore/java/android/security/KeyPairGeneratorSpec.java @@ -16,10 +16,15 @@ package android.security; +import android.app.KeyguardManager; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.content.Context; import android.text.TextUtils; import java.math.BigInteger; +import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.cert.Certificate; @@ -29,26 +34,64 @@ import java.util.Date; import javax.security.auth.x500.X500Principal; /** - * This provides the required parameters needed for initializing the - * {@code KeyPairGenerator} that works with - * <a href="{@docRoot}training/articles/keystore.html">Android KeyStore - * facility</a>. The Android KeyStore facility is accessed through a - * {@link java.security.KeyPairGenerator} API using the {@code AndroidKeyStore} - * provider. The {@code context} passed in may be used to pop up some UI to ask - * the user to unlock or initialize the Android KeyStore facility. - * <p> - * After generation, the {@code keyStoreAlias} is used with the - * {@link java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter)} - * interface to retrieve the {@link PrivateKey} and its associated - * {@link Certificate} chain. - * <p> - * The KeyPair generator will create a self-signed certificate with the subject - * as its X.509v3 Subject Distinguished Name and as its X.509v3 Issuer - * Distinguished Name along with the other parameters specified with the - * {@link Builder}. - * <p> - * The self-signed X.509 certificate may be replaced at a later time by a - * certificate signed by a real Certificate Authority. + * {@link AlgorithmParameterSpec} for initializing a {@link KeyPairGenerator} of the + * <a href="{@docRoot}training/articles/keystore.html">Android KeyStore facility</a>. This class + * specifies whether user authentication is required for using the private key, what uses the + * private key is authorized for (e.g., only for signing -- decryption not permitted), whether the + * private key should be encrypted at rest, the private key's and validity start and end dates. + * + * <p>To generate a key pair, create an instance of this class using the {@link Builder}, initialize + * a {@code KeyPairGenerator} of the desired key type (e.g., {@code EC} or {@code RSA}) from the + * {@code AndroidKeyStore} provider with the {@code KeyPairGeneratorSpec} instance, and then + * generate a key pair using {@link KeyPairGenerator#generateKeyPair()}. + * + * <p>The generated key pair will be returned by the {@code KeyPairGenerator} and also stored in the + * Android KeyStore under the alias specified in this {@code KeyPairGeneratorSpec}. To obtain the + * private key from the Android KeyStore use + * {@link java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null)} or + * {@link java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null)}. + * To obtain the public key from the Android KeyStore use + * {@link java.security.KeyStore#getCertificate(String)} and then + * {@link Certificate#getPublicKey()}. + * + * <p>A self-signed X.509 certificate will be also generated and stored in the Android KeyStore. + * This is because the {@link java.security.KeyStore} abstraction does not support storing key pairs + * without a certificate. The subject, serial number, and validity dates of the certificate can be + * specified in this {@code KeyPairGeneratorSpec}. The self-signed certificate may be replaced at a + * later time by a certificate signed by a Certificate Authority (CA). + * + * <p>NOTE: The key material of the private keys generating using the {@code KeyPairGeneratorSpec} + * is not accessible. The key material of the public keys is accessible. + * + * <p><h3>Example</h3> + * The following example illustrates how to generate an EC key pair in the Android KeyStore under + * alias {@code key2} authorized to be used only for signing using SHA-256, SHA-384, or SHA-512 + * digest and only if the user has been authenticated within the last five minutes. + * <pre> {@code + * KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( + * KeyStoreKeyProperties.Algorithm.EC, + * "AndroidKeyStore"); + * keyPairGenerator.initialize( + * new KeyGeneratorSpec.Builder(context) + * .setAlias("key2") + * .setPurposes(KeyStoreKeyProperties.Purpose.SIGN + * | KeyStoreKeyProperties.Purpose.VERIFY) + * .setDigests(KeyStoreKeyProperties.Digest.SHA256 + * | KeyStoreKeyProperties.Digest.SHA384 + * | KeyStoreKeyProperties.Digest.SHA512) + * // Only permit this key to be used if the user authenticated + * // within the last five minutes. + * .setUserAuthenticationRequired(true) + * .setUserAuthenticationValidityDurationSeconds(5 * 60) + * .build()); + * KeyPair keyPair = keyPairGenerator.generateKey(); + * + * // The key pair can also be obtained from the Android KeyStore any time as follows: + * KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + * keyStore.load(null); + * PrivateKey privateKey = (PrivateKey) keyStore.getKey("key2", null); + * PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey(); + * }</pre> */ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { @@ -85,13 +128,13 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { private final @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private final String[] mDigests; + private final @KeyStoreKeyProperties.DigestEnum String[] mDigests; - private final String[] mEncryptionPaddings; + private final @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; - private final String[] mSignaturePaddings; + private final @KeyStoreKeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; - private final String[] mBlockModes; + private final @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private final boolean mRandomizedEncryptionRequired; @@ -138,10 +181,10 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { Date keyValidityForOriginationEnd, Date keyValidityForConsumptionEnd, @KeyStoreKeyProperties.PurposeEnum int purposes, - String[] digests, - String[] encryptionPaddings, - String[] signaturePaddings, - String[] blockModes, + @KeyStoreKeyProperties.DigestEnum String[] digests, + @KeyStoreKeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, + @KeyStoreKeyProperties.SignaturePaddingEnum String[] signaturePaddings, + @KeyStoreKeyProperties.BlockModeEnum String[] blockModes, boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, int userAuthenticationValidityDurationSeconds) { @@ -246,7 +289,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { /** * Returns the key type (e.g., "EC", "RSA") specified by this parameter. */ - public String getKeyType() { + @Nullable + public @KeyStoreKeyProperties.AlgorithmEnum String getKeyType() { return mKeyType; } @@ -263,6 +307,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Returns the {@link AlgorithmParameterSpec} that will be used for creation * of the key pair. */ + @NonNull public AlgorithmParameterSpec getAlgorithmParameterSpec() { return mSpec; } @@ -271,6 +316,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Gets the subject distinguished name to be used on the X.509 certificate * that will be put in the {@link java.security.KeyStore}. */ + @NonNull public X500Principal getSubjectDN() { return mSubjectDN; } @@ -279,6 +325,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Gets the serial number to be used on the X.509 certificate that will be * put in the {@link java.security.KeyStore}. */ + @NonNull public BigInteger getSerialNumber() { return mSerialNumber; } @@ -287,6 +334,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Gets the start date to be used on the X.509 certificate that will be put * in the {@link java.security.KeyStore}. */ + @NonNull public Date getStartDate() { return mStartDate; } @@ -295,6 +343,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Gets the end date to be used on the X.509 certificate that will be put in * the {@link java.security.KeyStore}. */ + @NonNull public Date getEndDate() { return mEndDate; } @@ -307,8 +356,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { } /** - * Returns {@code true} if this parameter will require generated keys to be - * encrypted in the {@link java.security.KeyStore}. + * Returns {@code true} if the key must be encrypted at rest. This will protect the key pair + * with the secure lock screen credential (e.g., password, PIN, or pattern). */ public boolean isEncryptionRequired() { return (mFlags & KeyStore.FLAG_ENCRYPTED) != 0; @@ -319,6 +368,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityStart() { return mKeyValidityStart; } @@ -329,6 +379,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForConsumptionEnd() { return mKeyValidityForConsumptionEnd; } @@ -338,6 +389,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForOriginationEnd() { return mKeyValidityForOriginationEnd; } @@ -352,28 +404,32 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { /** * Gets the set of digest algorithms with which the key can be used. */ - public String[] getDigests() { + @NonNull + public @KeyStoreKeyProperties.DigestEnum String[] getDigests() { return ArrayUtils.cloneIfNotEmpty(mDigests); } /** * Gets the set of padding schemes with which the key can be used when encrypting/decrypting. */ - public String[] getEncryptionPaddings() { + @NonNull + public @KeyStoreKeyProperties.EncryptionPaddingEnum String[] getEncryptionPaddings() { return ArrayUtils.cloneIfNotEmpty(mEncryptionPaddings); } /** * Gets the set of padding schemes with which the key can be used when signing/verifying. */ - public String[] getSignaturePaddings() { + @NonNull + public @KeyStoreKeyProperties.SignaturePaddingEnum String[] getSignaturePaddings() { return ArrayUtils.cloneIfNotEmpty(mSignaturePaddings); } /** * Gets the set of block modes with which the key can be used. */ - public String[] getBlockModes() { + @NonNull + public @KeyStoreKeyProperties.BlockModeEnum String[] getBlockModes() { return ArrayUtils.cloneIfNotEmpty(mBlockModes); } @@ -403,14 +459,14 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { } /** - * Gets the duration of time (seconds) for which the private key can be used after the user - * is successfully authenticated. + * Gets the duration of time (seconds) for which this key can be used after the user is + * successfully authenticated. This has effect only if user authentication is required. * * <p>This restriction applies only to private key operations. Public key operations are not * restricted. * - * @return duration in seconds or {@code -1} if not restricted. {@code 0} means authentication - * is required for every use of the key. + * @return duration in seconds or {@code -1} if authentication is required for every use of the + * key. * * @see #isUserAuthenticationRequired() */ @@ -468,13 +524,13 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { private @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private String[] mDigests; + private @KeyStoreKeyProperties.DigestEnum String[] mDigests; - private String[] mEncryptionPaddings; + private @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; - private String[] mSignaturePaddings; + private @KeyStoreKeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; - private String[] mBlockModes; + private @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private boolean mRandomizedEncryptionRequired = true; @@ -488,7 +544,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * some UI to ask the user to unlock or initialize the Android KeyStore * facility. */ - public Builder(Context context) { + public Builder(@NonNull Context context) { if (context == null) { throw new NullPointerException("context == null"); } @@ -500,7 +556,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@link java.security.KeyStore} instance using the * {@code AndroidKeyStore} provider. */ - public Builder setAlias(String alias) { + @NonNull + public Builder setAlias(@NonNull String alias) { if (alias == null) { throw new NullPointerException("alias == null"); } @@ -511,7 +568,9 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { /** * Sets the key type (e.g., EC, RSA) of the keypair to be created. */ - public Builder setKeyType(String keyType) throws NoSuchAlgorithmException { + @NonNull + public Builder setKeyType(@NonNull @KeyStoreKeyProperties.AlgorithmEnum String keyType) + throws NoSuchAlgorithmException { if (keyType == null) { throw new NullPointerException("keyType == null"); } else { @@ -528,6 +587,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * key type of RSA this will set the modulus size and for a key type of * EC it will select a curve with a matching field size. */ + @NonNull public Builder setKeySize(int keySize) { if (keySize < 0) { throw new IllegalArgumentException("keySize < 0"); @@ -540,7 +600,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Sets the algorithm-specific key generation parameters. For example, for RSA keys * this may be an instance of {@link java.security.spec.RSAKeyGenParameterSpec}. */ - public Builder setAlgorithmParameterSpec(AlgorithmParameterSpec spec) { + public Builder setAlgorithmParameterSpec(@NonNull AlgorithmParameterSpec spec) { if (spec == null) { throw new NullPointerException("spec == null"); } @@ -556,7 +616,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1 LOLLIPOP_MR1} and older platforms. On * newer platforms the subject defaults to {@code CN=fake} if not specified. */ - public Builder setSubject(X500Principal subject) { + @NonNull + public Builder setSubject(@NonNull X500Principal subject) { if (subject == null) { throw new NullPointerException("subject == null"); } @@ -572,7 +633,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1 LOLLIPOP_MR1} and older platforms. On * newer platforms the serial number defaults to {@code 1} if not specified. */ - public Builder setSerialNumber(BigInteger serialNumber) { + @NonNull + public Builder setSerialNumber(@NonNull BigInteger serialNumber) { if (serialNumber == null) { throw new NullPointerException("serialNumber == null"); } @@ -588,7 +650,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1 LOLLIPOP_MR1} and older platforms. On * newer platforms the date defaults to {@code Jan 1 1970} if not specified. */ - public Builder setStartDate(Date startDate) { + @NonNull + public Builder setStartDate(@NonNull Date startDate) { if (startDate == null) { throw new NullPointerException("startDate == null"); } @@ -604,7 +667,8 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * {@link android.os.Build.VERSION_CODES#LOLLIPOP_MR1 LOLLIPOP_MR1} and older platforms. On * newer platforms the date defaults to {@code Jan 1 2048} if not specified. */ - public Builder setEndDate(Date endDate) { + @NonNull + public Builder setEndDate(@NonNull Date endDate) { if (endDate == null) { throw new NullPointerException("endDate == null"); } @@ -613,11 +677,18 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { } /** - * Indicates that this key must be encrypted at rest on storage. Note - * that enabling this will require that the user enable a strong lock - * screen (e.g., PIN, password) before creating or using the generated - * key is successful. + * Indicates that this key pair must be encrypted at rest. This will protect the key pair + * with the secure lock screen credential (e.g., password, PIN, or pattern). + * + * <p>Note that this feature requires that the secure lock screen (e.g., password, PIN, + * pattern) is set up, otherwise key pair generation will fail. Moreover, this key pair will + * be deleted when the secure lock screen is disabled or reset (e.g., by the user or a + * Device Administrator). Finally, this key pair cannot be used until the user unlocks the + * secure lock screen after boot. + * + * @see KeyguardManager#isDeviceSecure() */ + @NonNull public Builder setEncryptionRequired() { mFlags |= KeyStore.FLAG_ENCRYPTED; return this; @@ -628,8 +699,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect. + * * @see #setKeyValidityEnd(Date) */ + @NonNull public Builder setKeyValidityStart(Date startDate) { mKeyValidityStart = startDate; return this; @@ -640,10 +714,13 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect. + * * @see #setKeyValidityStart(Date) * @see #setKeyValidityForConsumptionEnd(Date) * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityEnd(Date endDate) { setKeyValidityForOriginationEnd(endDate); setKeyValidityForConsumptionEnd(endDate); @@ -655,8 +732,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect. + * * @see #setKeyValidityForConsumptionEnd(Date) */ + @NonNull public Builder setKeyValidityForOriginationEnd(Date endDate) { mKeyValidityForOriginationEnd = endDate; return this; @@ -668,8 +748,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect. + * * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityForConsumptionEnd(Date endDate) { mKeyValidityForConsumptionEnd = endDate; return this; @@ -679,7 +762,16 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Sets the set of purposes for which the key can be used. * * <p>This must be specified for all keys. There is no default. + * + * <p>If the set of purposes for which the key can be used does not contain + * {@link KeyStoreKeyProperties.Purpose#SIGN}, the self-signed certificate generated by + * {@link KeyPairGenerator} of {@code AndroidKeyStore} provider will contain an invalid + * signature. This is OK if the certificate is only used for obtaining the public key from + * Android KeyStore. + * + * <p><b>NOTE: This has currently no effect. */ + @NonNull public Builder setPurposes(@KeyStoreKeyProperties.PurposeEnum int purposes) { mPurposes = purposes; return this; @@ -690,8 +782,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * to use the key with any other digest will be rejected. * * <p>This must be specified for keys which are used for signing/verification. + * + * <p><b>NOTE: This has currently no effect. */ - public Builder setDigests(String... digests) { + @NonNull + public Builder setDigests(@KeyStoreKeyProperties.DigestEnum String... digests) { mDigests = ArrayUtils.cloneIfNotEmpty(digests); return this; } @@ -702,8 +797,12 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * rejected. * * <p>This must be specified for keys which are used for encryption/decryption. + * + * <p><b>NOTE: This has currently no effect. */ - public Builder setEncryptionPaddings(String... paddings) { + @NonNull + public Builder setEncryptionPaddings( + @KeyStoreKeyProperties.EncryptionPaddingEnum String... paddings) { mEncryptionPaddings = ArrayUtils.cloneIfNotEmpty(paddings); return this; } @@ -714,8 +813,12 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * rejected. * * <p>This must be specified for RSA keys which are used for signing/verification. + * + * <p><b>NOTE: This has currently no effect. */ - public Builder setSignaturePaddings(String... paddings) { + @NonNull + public Builder setSignaturePaddings( + @KeyStoreKeyProperties.SignaturePaddingEnum String... paddings) { mSignaturePaddings = ArrayUtils.cloneIfNotEmpty(paddings); return this; } @@ -725,8 +828,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * Attempts to use the key with any other block modes will be rejected. * * <p>This must be specified for encryption/decryption keys. + * + * <p><b>NOTE: This has currently no effect. */ - public Builder setBlockModes(String... blockModes) { + @NonNull + public Builder setBlockModes(@KeyStoreKeyProperties.BlockModeEnum String... blockModes) { mBlockModes = ArrayUtils.cloneIfNotEmpty(blockModes); return this; } @@ -750,7 +856,10 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * <li>If you are using RSA encryption without padding, consider switching to padding * schemes which offer {@code IND-CPA}, such as PKCS#1 or OAEP.</li> * </ul> + * + * <p><b>NOTE: This has currently no effect. */ + @NonNull public Builder setRandomizedEncryptionRequired(boolean required) { mRandomizedEncryptionRequired = required; return this; @@ -772,8 +881,11 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * <p>This restriction applies only to private key operations. Public key operations are not * restricted. * + * <p><b>NOTE: This has currently no effect. + * * @see #setUserAuthenticationValidityDurationSeconds(int) */ + @NonNull public Builder setUserAuthenticationRequired(boolean required) { mUserAuthenticationRequired = required; return this; @@ -788,12 +900,16 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * <p>This restriction applies only to private key operations. Public key operations are not * restricted. * - * @param seconds duration in seconds or {@code 0} if the user needs to authenticate for + * <p><b>NOTE: This has currently no effect. + * + * @param seconds duration in seconds or {@code -1} if the user needs to authenticate for * every use of the key. * * @see #setUserAuthenticationRequired(boolean) */ - public Builder setUserAuthenticationValidityDurationSeconds(int seconds) { + @NonNull + public Builder setUserAuthenticationValidityDurationSeconds( + @IntRange(from = -1) int seconds) { mUserAuthenticationValidityDurationSeconds = seconds; return this; } @@ -804,6 +920,7 @@ public final class KeyPairGeneratorSpec implements AlgorithmParameterSpec { * @throws IllegalArgumentException if a required field is missing * @return built instance of {@code KeyPairGeneratorSpec} */ + @NonNull public KeyPairGeneratorSpec build() { return new KeyPairGeneratorSpec(mContext, mKeystoreAlias, diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java index 82d328b0b71f..3ed8899c4c1f 100644 --- a/keystore/java/android/security/KeyStore.java +++ b/keystore/java/android/security/KeyStore.java @@ -18,14 +18,17 @@ package android.security; import android.app.ActivityThread; import android.app.Application; +import android.app.KeyguardManager; import com.android.org.conscrypt.NativeConstants; import android.content.Context; import android.hardware.fingerprint.FingerprintManager; import android.os.Binder; import android.os.IBinder; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; +import android.os.UserHandle; import android.security.keymaster.ExportResult; import android.security.keymaster.KeyCharacteristics; import android.security.keymaster.KeymasterArguments; @@ -71,6 +74,19 @@ public class KeyStore { // Flags for "put" "import" and "generate" public static final int FLAG_NONE = 0; + + /** + * Indicates that this key (or key pair) must be encrypted at rest. This will protect the key + * (or key pair) with the secure lock screen credential (e.g., password, PIN, or pattern). + * + * <p>Note that this requires that the secure lock screen (e.g., password, PIN, pattern) is set + * up, otherwise key (or key pair) generation or import will fail. Moreover, this key (or key + * pair) will be deleted when the secure lock screen is disabled or reset (e.g., by the user or + * a Device Administrator). Finally, this key (or key pair) cannot be used until the user + * unlocks the secure lock screen after boot. + * + * @see KeyguardManager#isDeviceSecure() + */ public static final int FLAG_ENCRYPTED = 1; // States @@ -115,10 +131,10 @@ public class KeyStore { return mToken; } - static int getKeyTypeForAlgorithm(String keyType) { - if ("RSA".equalsIgnoreCase(keyType)) { + static int getKeyTypeForAlgorithm(@KeyStoreKeyProperties.AlgorithmEnum String keyType) { + if (KeyStoreKeyProperties.Algorithm.RSA.equalsIgnoreCase(keyType)) { return NativeConstants.EVP_PKEY_RSA; - } else if ("EC".equalsIgnoreCase(keyType)) { + } else if (KeyStoreKeyProperties.Algorithm.EC.equalsIgnoreCase(keyType)) { return NativeConstants.EVP_PKEY_EC; } else { return -1; @@ -212,15 +228,6 @@ public class KeyStore { } } - public boolean password(String password) { - try { - return mBinder.password(password) == NO_ERROR; - } catch (RemoteException e) { - Log.w(TAG, "Cannot connect to keystore", e); - return false; - } - } - public boolean lock() { try { return mBinder.lock() == NO_ERROR; @@ -230,9 +237,20 @@ public class KeyStore { } } - public boolean unlock(String password) { + /** + * Attempt to unlock the keystore for {@code user} with the password {@code password}. + * This is required before keystore entries created with FLAG_ENCRYPTED can be accessed or + * created. + * + * @param user Android user ID to operate on + * @param password user's keystore password. Should be the most recent value passed to + * {@link #onUserPasswordChanged} for the user. + * + * @return whether the keystore was unlocked. + */ + public boolean unlock(int userId, String password) { try { - mError = mBinder.unlock(password); + mError = mBinder.unlock(userId, password); return mError == NO_ERROR; } catch (RemoteException e) { Log.w(TAG, "Cannot connect to keystore", e); @@ -240,6 +258,10 @@ public class KeyStore { } } + public boolean unlock(String password) { + return unlock(UserHandle.getUserId(Process.myUid()), password); + } + public boolean isEmpty() { try { return mBinder.zero() == KEY_NOT_FOUND; @@ -540,6 +562,30 @@ public class KeyStore { } /** + * Notify keystore that a user's password has changed. + * + * @param userId the user whose password changed. + * @param newPassword the new password or "" if the password was removed. + */ + public boolean onUserPasswordChanged(int userId, String newPassword) { + // Parcel.cpp doesn't support deserializing null strings and treats them as "". Make that + // explicit here. + if (newPassword == null) { + newPassword = ""; + } + try { + return mBinder.onUserPasswordChanged(userId, newPassword) == NO_ERROR; + } catch (RemoteException e) { + Log.w(TAG, "Cannot connect to keystore", e); + return false; + } + } + + public boolean onUserPasswordChanged(String newPassword) { + return onUserPasswordChanged(UserHandle.getUserId(Process.myUid()), newPassword); + } + + /** * Returns a {@link KeyStoreException} corresponding to the provided keystore/keymaster error * code. */ @@ -550,7 +596,7 @@ public class KeyStore { case NO_ERROR: return new KeyStoreException(errorCode, "OK"); case LOCKED: - return new KeyStoreException(errorCode, "Keystore locked"); + return new KeyStoreException(errorCode, "User authentication required"); case UNINITIALIZED: return new KeyStoreException(errorCode, "Keystore not initialized"); case SYSTEM_ERROR: @@ -587,6 +633,8 @@ public class KeyStore { */ InvalidKeyException getInvalidKeyException(String keystoreKeyAlias, KeyStoreException e) { switch (e.getErrorCode()) { + case LOCKED: + return new UserNotAuthenticatedException(); case KeymasterDefs.KM_ERROR_KEY_EXPIRED: return new KeyExpiredException(); case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID: diff --git a/keystore/java/android/security/KeyStoreCipherSpi.java b/keystore/java/android/security/KeyStoreCipherSpi.java index 094aa75bf4b2..bd601bc000b6 100644 --- a/keystore/java/android/security/KeyStoreCipherSpi.java +++ b/keystore/java/android/security/KeyStoreCipherSpi.java @@ -27,6 +27,7 @@ import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; +import java.security.ProviderException; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.security.spec.InvalidParameterSpecException; @@ -315,15 +316,15 @@ public abstract class KeyStoreCipherSpi extends CipherSpi implements KeyStoreCry } else if (e instanceof InvalidAlgorithmParameterException) { throw (InvalidAlgorithmParameterException) e; } else { - throw new RuntimeException("Unexpected exception type", e); + throw new ProviderException("Unexpected exception type", e); } } if (mOperationToken == null) { - throw new IllegalStateException("Keystore returned null operation token"); + throw new ProviderException("Keystore returned null operation token"); } if (mOperationHandle == 0) { - throw new IllegalStateException("Keystore returned invalid operation handle"); + throw new ProviderException("Keystore returned invalid operation handle"); } loadAlgorithmSpecificParametersFromBeginResult(keymasterOutputArgs); @@ -494,13 +495,14 @@ public abstract class KeyStoreCipherSpi extends CipherSpi implements KeyStoreCry } if ((mIv != null) && (mIv.length > 0)) { try { - AlgorithmParameters params = AlgorithmParameters.getInstance("AES"); + AlgorithmParameters params = + AlgorithmParameters.getInstance(KeyStoreKeyProperties.Algorithm.AES); params.init(new IvParameterSpec(mIv)); return params; } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("Failed to obtain AES AlgorithmParameters", e); + throw new ProviderException("Failed to obtain AES AlgorithmParameters", e); } catch (InvalidParameterSpecException e) { - throw new RuntimeException( + throw new ProviderException( "Failed to initialize AES AlgorithmParameters with an IV", e); } } @@ -633,10 +635,9 @@ public abstract class KeyStoreCipherSpi extends CipherSpi implements KeyStoreCry if ((mIv == null) && (mEncrypting)) { // IV was not provided by the caller and thus will be generated by keymaster. // Mix in some additional entropy from the provided SecureRandom. - if (mRng != null) { - mAdditionalEntropyForBegin = new byte[mBlockSizeBytes]; - mRng.nextBytes(mAdditionalEntropyForBegin); - } + mAdditionalEntropyForBegin = + KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng( + mRng, mBlockSizeBytes); } } } @@ -668,11 +669,11 @@ public abstract class KeyStoreCipherSpi extends CipherSpi implements KeyStoreCry if (mIv == null) { mIv = returnedIv; } else if ((returnedIv != null) && (!Arrays.equals(returnedIv, mIv))) { - throw new IllegalStateException("IV in use differs from provided IV"); + throw new ProviderException("IV in use differs from provided IV"); } } else { if (returnedIv != null) { - throw new IllegalStateException( + throw new ProviderException( "IV in use despite IV not being used by this transformation"); } } diff --git a/keystore/java/android/security/KeyStoreConnectException.java b/keystore/java/android/security/KeyStoreConnectException.java index 1aa3aecc0b1e..885f1f7566db 100644 --- a/keystore/java/android/security/KeyStoreConnectException.java +++ b/keystore/java/android/security/KeyStoreConnectException.java @@ -16,12 +16,14 @@ package android.security; +import java.security.ProviderException; + /** * Indicates a communications error with keystore service. * * @hide */ -public class KeyStoreConnectException extends IllegalStateException { +public class KeyStoreConnectException extends ProviderException { public KeyStoreConnectException() { super("Failed to communicate with keystore service"); } diff --git a/keystore/java/android/security/KeyStoreCryptoOperationUtils.java b/keystore/java/android/security/KeyStoreCryptoOperationUtils.java index e5933add7331..311278bab16b 100644 --- a/keystore/java/android/security/KeyStoreCryptoOperationUtils.java +++ b/keystore/java/android/security/KeyStoreCryptoOperationUtils.java @@ -21,6 +21,7 @@ import android.security.keymaster.KeymasterDefs; import java.security.GeneralSecurityException; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; +import java.security.SecureRandom; /** * Assorted utility methods for implementing crypto operations on top of KeyStore. @@ -28,6 +29,9 @@ import java.security.InvalidKeyException; * @hide */ abstract class KeyStoreCryptoOperationUtils { + + private static volatile SecureRandom sRng; + private KeyStoreCryptoOperationUtils() {} /** @@ -81,4 +85,28 @@ abstract class KeyStoreCryptoOperationUtils { // General cases return getInvalidKeyExceptionForInit(keyStore, key, beginOpResultCode); } + + /** + * Returns the requested number of random bytes to mix into keystore/keymaster RNG. + * + * @param rng RNG from which to obtain the random bytes or {@code null} for the platform-default + * RNG. + */ + static byte[] getRandomBytesToMixIntoKeystoreRng(SecureRandom rng, int sizeBytes) { + if (rng == null) { + rng = getRng(); + } + byte[] result = new byte[sizeBytes]; + rng.nextBytes(result); + return result; + } + + private static SecureRandom getRng() { + // IMPLEMENTATION NOTE: It's OK to share a SecureRandom instance because SecureRandom is + // required to be thread-safe. + if (sRng == null) { + sRng = new SecureRandom(); + } + return sRng; + } } diff --git a/keystore/java/android/security/KeyStoreHmacSpi.java b/keystore/java/android/security/KeyStoreHmacSpi.java index 0dbe78848813..5089a2577fcc 100644 --- a/keystore/java/android/security/KeyStoreHmacSpi.java +++ b/keystore/java/android/security/KeyStoreHmacSpi.java @@ -24,6 +24,7 @@ import android.security.keymaster.OperationResult; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.Key; +import java.security.ProviderException; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.MacSpi; @@ -185,10 +186,10 @@ public abstract class KeyStoreHmacSpi extends MacSpi implements KeyStoreCryptoOp } if (mOperationToken == null) { - throw new IllegalStateException("Keystore returned null operation token"); + throw new ProviderException("Keystore returned null operation token"); } if (mOperationHandle == 0) { - throw new IllegalStateException("Keystore returned invalid operation handle"); + throw new ProviderException("Keystore returned invalid operation handle"); } mChunkedStreamer = new KeyStoreCryptoOperationChunkedStreamer( @@ -206,17 +207,17 @@ public abstract class KeyStoreHmacSpi extends MacSpi implements KeyStoreCryptoOp try { ensureKeystoreOperationInitialized(); } catch (InvalidKeyException e) { - throw new IllegalStateException("Failed to reinitialize MAC", e); + throw new ProviderException("Failed to reinitialize MAC", e); } byte[] output; try { output = mChunkedStreamer.update(input, offset, len); } catch (KeyStoreException e) { - throw new IllegalStateException("Keystore operation failed", e); + throw new ProviderException("Keystore operation failed", e); } if ((output != null) && (output.length != 0)) { - throw new IllegalStateException("Update operation unexpectedly produced output"); + throw new ProviderException("Update operation unexpectedly produced output"); } } @@ -225,14 +226,14 @@ public abstract class KeyStoreHmacSpi extends MacSpi implements KeyStoreCryptoOp try { ensureKeystoreOperationInitialized(); } catch (InvalidKeyException e) { - throw new IllegalStateException("Failed to reinitialize MAC", e); + throw new ProviderException("Failed to reinitialize MAC", e); } byte[] result; try { result = mChunkedStreamer.doFinal(null, 0, 0); } catch (KeyStoreException e) { - throw new IllegalStateException("Keystore operation failed", e); + throw new ProviderException("Keystore operation failed", e); } resetWhilePreservingInitState(); diff --git a/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java index 68b57518ae70..4b914c2fdef1 100644 --- a/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java +++ b/keystore/java/android/security/KeyStoreKeyGeneratorSpi.java @@ -21,6 +21,7 @@ import android.security.keymaster.KeymasterArguments; import android.security.keymaster.KeymasterDefs; import java.security.InvalidAlgorithmParameterException; +import java.security.ProviderException; import java.security.SecureRandom; import java.security.spec.AlgorithmParameterSpec; import java.util.Date; @@ -39,6 +40,17 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { public AES() { super(KeymasterDefs.KM_ALGORITHM_AES, 128); } + + @Override + protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) + throws InvalidAlgorithmParameterException { + super.engineInit(params, random); + if ((mKeySizeBits != 128) && (mKeySizeBits != 192) && (mKeySizeBits != 256)) { + throw new InvalidAlgorithmParameterException( + "Unsupported key size: " + mKeySizeBits + + ". Supported: 128, 192, 256."); + } + } } protected static abstract class HmacBase extends KeyStoreKeyGeneratorSpi { @@ -87,6 +99,11 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { private KeyGeneratorSpec mSpec; private SecureRandom mRng; + protected int mKeySizeBits; + private int[] mKeymasterPurposes; + private int[] mKeymasterBlockModes; + private int[] mKeymasterPaddings; + protected KeyStoreKeyGeneratorSpi( int keymasterAlgorithm, int defaultKeySizeBits) { @@ -100,6 +117,97 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { mKeymasterAlgorithm = keymasterAlgorithm; mKeymasterDigest = keymasterDigest; mDefaultKeySizeBits = defaultKeySizeBits; + if (mDefaultKeySizeBits <= 0) { + throw new IllegalArgumentException("Default key size must be positive"); + } + + if ((mKeymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC) && (mKeymasterDigest == -1)) { + throw new IllegalArgumentException( + "Digest algorithm must be specified for HMAC key"); + } + } + + @Override + protected void engineInit(SecureRandom random) { + throw new UnsupportedOperationException("Cannot initialize without an " + + KeyGeneratorSpec.class.getName() + " parameter"); + } + + @Override + protected void engineInit(int keySize, SecureRandom random) { + throw new UnsupportedOperationException("Cannot initialize without a " + + KeyGeneratorSpec.class.getName() + " parameter"); + } + + @Override + protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) + throws InvalidAlgorithmParameterException { + resetAll(); + + boolean success = false; + try { + if ((params == null) || (!(params instanceof KeyGeneratorSpec))) { + throw new InvalidAlgorithmParameterException("Cannot initialize without an " + + KeyGeneratorSpec.class.getName() + " parameter"); + } + KeyGeneratorSpec spec = (KeyGeneratorSpec) params; + if (spec.getKeystoreAlias() == null) { + throw new InvalidAlgorithmParameterException("KeyStore entry alias not provided"); + } + + mRng = random; + mSpec = spec; + + mKeySizeBits = (spec.getKeySize() != -1) ? spec.getKeySize() : mDefaultKeySizeBits; + if (mKeySizeBits <= 0) { + throw new InvalidAlgorithmParameterException( + "Key size must be positive: " + mKeySizeBits); + } else if ((mKeySizeBits % 8) != 0) { + throw new InvalidAlgorithmParameterException( + "Key size in must be a multiple of 8: " + mKeySizeBits); + } + + try { + mKeymasterPurposes = + KeyStoreKeyProperties.Purpose.allToKeymaster(spec.getPurposes()); + mKeymasterPaddings = KeyStoreKeyProperties.EncryptionPadding.allToKeymaster( + spec.getEncryptionPaddings()); + mKeymasterBlockModes = + KeyStoreKeyProperties.BlockMode.allToKeymaster(spec.getBlockModes()); + if (((spec.getPurposes() & KeyStoreKeyProperties.Purpose.ENCRYPT) != 0) + && (spec.isRandomizedEncryptionRequired())) { + for (int keymasterBlockMode : mKeymasterBlockModes) { + if (!KeymasterUtils.isKeymasterBlockModeIndCpaCompatible( + keymasterBlockMode)) { + throw new InvalidAlgorithmParameterException( + "Randomized encryption (IND-CPA) required but may be violated" + + " by block mode: " + + KeyStoreKeyProperties.BlockMode.fromKeymaster( + keymasterBlockMode) + + ". See " + KeyGeneratorSpec.class.getName() + + " documentation."); + } + } + } + } catch (IllegalArgumentException e) { + throw new InvalidAlgorithmParameterException(e); + } + + success = true; + } finally { + if (!success) { + resetAll(); + } + } + } + + private void resetAll() { + mSpec = null; + mRng = null; + mKeySizeBits = -1; + mKeymasterPurposes = null; + mKeymasterPaddings = null; + mKeymasterBlockModes = null; } @Override @@ -117,43 +225,14 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { } KeymasterArguments args = new KeymasterArguments(); + args.addInt(KeymasterDefs.KM_TAG_KEY_SIZE, mKeySizeBits); args.addInt(KeymasterDefs.KM_TAG_ALGORITHM, mKeymasterAlgorithm); if (mKeymasterDigest != -1) { args.addInt(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigest); } - if (mKeymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_HMAC) { - if (mKeymasterDigest == -1) { - throw new IllegalStateException("Digest algorithm must be specified for HMAC key"); - } - } - int keySizeBits = (spec.getKeySize() != -1) ? spec.getKeySize() : mDefaultKeySizeBits; - args.addInt(KeymasterDefs.KM_TAG_KEY_SIZE, keySizeBits); - @KeyStoreKeyProperties.PurposeEnum int purposes = spec.getPurposes(); - int[] keymasterBlockModes = KeymasterUtils.getKeymasterBlockModesFromJcaBlockModes( - spec.getBlockModes()); - if (((purposes & KeyStoreKeyProperties.Purpose.ENCRYPT) != 0) - && (spec.isRandomizedEncryptionRequired())) { - for (int keymasterBlockMode : keymasterBlockModes) { - if (!KeymasterUtils.isKeymasterBlockModeIndCpaCompatible(keymasterBlockMode)) { - throw new IllegalStateException( - "Randomized encryption (IND-CPA) required but may be violated by block" - + " mode: " - + KeymasterUtils.getJcaBlockModeFromKeymasterBlockMode( - keymasterBlockMode) - + ". See KeyGeneratorSpec documentation."); - } - } - } - - for (int keymasterPurpose : - KeyStoreKeyProperties.Purpose.allToKeymaster(purposes)) { - args.addInt(KeymasterDefs.KM_TAG_PURPOSE, keymasterPurpose); - } - args.addInts(KeymasterDefs.KM_TAG_BLOCK_MODE, keymasterBlockModes); - args.addInts( - KeymasterDefs.KM_TAG_PADDING, - KeymasterUtils.getKeymasterPaddingsFromJcaEncryptionPaddings( - spec.getEncryptionPaddings())); + args.addInts(KeymasterDefs.KM_TAG_PURPOSE, mKeymasterPurposes); + args.addInts(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes); + args.addInts(KeymasterDefs.KM_TAG_PADDING, mKeymasterPaddings); KeymasterUtils.addUserAuthArgs(args, spec.getContext(), spec.isUserAuthenticationRequired(), @@ -168,57 +247,31 @@ public abstract class KeyStoreKeyGeneratorSpi extends KeyGeneratorSpi { (spec.getKeyValidityForConsumptionEnd() != null) ? spec.getKeyValidityForConsumptionEnd() : new Date(Long.MAX_VALUE)); - if (((purposes & KeyStoreKeyProperties.Purpose.ENCRYPT) != 0) + if (((spec.getPurposes() & KeyStoreKeyProperties.Purpose.ENCRYPT) != 0) && (!spec.isRandomizedEncryptionRequired())) { // Permit caller-provided IV when encrypting with this key args.addBoolean(KeymasterDefs.KM_TAG_CALLER_NONCE); } - byte[] additionalEntropy = null; - SecureRandom rng = mRng; - if (rng != null) { - additionalEntropy = new byte[(keySizeBits + 7) / 8]; - rng.nextBytes(additionalEntropy); - } - + byte[] additionalEntropy = + KeyStoreCryptoOperationUtils.getRandomBytesToMixIntoKeystoreRng( + mRng, (mKeySizeBits + 7) / 8); int flags = spec.getFlags(); String keyAliasInKeystore = Credentials.USER_SECRET_KEY + spec.getKeystoreAlias(); + KeyCharacteristics resultingKeyCharacteristics = new KeyCharacteristics(); int errorCode = mKeyStore.generateKey( - keyAliasInKeystore, args, additionalEntropy, flags, new KeyCharacteristics()); + keyAliasInKeystore, args, additionalEntropy, flags, resultingKeyCharacteristics); if (errorCode != KeyStore.NO_ERROR) { - throw new IllegalStateException( + throw new ProviderException( "Keystore operation failed", KeyStore.getKeyStoreException(errorCode)); } - String keyAlgorithmJCA = - KeymasterUtils.getJcaSecretKeyAlgorithm(mKeymasterAlgorithm, mKeymasterDigest); - return new KeyStoreSecretKey(keyAliasInKeystore, keyAlgorithmJCA); - } - - @Override - protected void engineInit(SecureRandom random) { - throw new UnsupportedOperationException("Cannot initialize without an " - + KeyGeneratorSpec.class.getName() + " parameter"); - } - - @Override - protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) - throws InvalidAlgorithmParameterException { - if ((params == null) || (!(params instanceof KeyGeneratorSpec))) { - throw new InvalidAlgorithmParameterException("Cannot initialize without an " - + KeyGeneratorSpec.class.getName() + " parameter"); - } - KeyGeneratorSpec spec = (KeyGeneratorSpec) params; - if (spec.getKeystoreAlias() == null) { - throw new InvalidAlgorithmParameterException("KeyStore entry alias not provided"); + String keyAlgorithmJCA; + try { + keyAlgorithmJCA = KeyStoreKeyProperties.Algorithm.fromKeymasterSecretKeyAlgorithm( + mKeymasterAlgorithm, mKeymasterDigest); + } catch (IllegalArgumentException e) { + throw new ProviderException("Failed to obtain JCA secret key algorithm name", e); } - - mSpec = spec; - mRng = random; - } - - @Override - protected void engineInit(int keySize, SecureRandom random) { - throw new UnsupportedOperationException("Cannot initialize without a " - + KeyGeneratorSpec.class.getName() + " parameter"); + return new KeyStoreSecretKey(keyAliasInKeystore, keyAlgorithmJCA); } } diff --git a/keystore/java/android/security/KeyStoreKeyProperties.java b/keystore/java/android/security/KeyStoreKeyProperties.java index b85ec531f245..d1b0e5b7ea86 100644 --- a/keystore/java/android/security/KeyStoreKeyProperties.java +++ b/keystore/java/android/security/KeyStoreKeyProperties.java @@ -17,13 +17,25 @@ package android.security; import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.StringDef; import android.security.keymaster.KeymasterDefs; import libcore.util.EmptyArray; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.security.Key; +import java.security.KeyFactory; +import java.security.KeyPairGenerator; import java.util.Collection; +import java.util.Locale; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.Mac; +import javax.crypto.SecretKeyFactory; /** * Properties of {@code AndroidKeyStore} keys. @@ -37,7 +49,7 @@ public abstract class KeyStoreKeyProperties { public @interface PurposeEnum {} /** - * Purpose of key. + * Purposes of key. */ public static abstract class Purpose { private Purpose() {} @@ -101,6 +113,7 @@ public abstract class KeyStoreKeyProperties { /** * @hide */ + @NonNull public static int[] allToKeymaster(@PurposeEnum int purposes) { int[] result = getSetFlags(purposes); for (int i = 0; i < result.length; i++) { @@ -112,7 +125,7 @@ public abstract class KeyStoreKeyProperties { /** * @hide */ - public static @PurposeEnum int allFromKeymaster(Collection<Integer> purposes) { + public static @PurposeEnum int allFromKeymaster(@NonNull Collection<Integer> purposes) { @PurposeEnum int result = 0; for (int keymasterPurpose : purposes) { result |= fromKeymaster(keymasterPurpose); @@ -122,6 +135,524 @@ public abstract class KeyStoreKeyProperties { } @Retention(RetentionPolicy.SOURCE) + @StringDef({ + Algorithm.RSA, + Algorithm.EC, + Algorithm.AES, + Algorithm.HMAC_SHA1, + Algorithm.HMAC_SHA224, + Algorithm.HMAC_SHA256, + Algorithm.HMAC_SHA384, + Algorithm.HMAC_SHA512, + }) + public @interface AlgorithmEnum {} + + /** + * Key algorithms. + * + * <p>These are standard names which can be used to obtain instances of {@link KeyGenerator}, + * {@link KeyPairGenerator}, {@link Cipher} (as part of the transformation string), {@link Mac}, + * {@link KeyFactory}, {@link SecretKeyFactory}. These are also the names used by + * {@link Key#getAlgorithm()}. + */ + public static abstract class Algorithm { + private Algorithm() {} + + /** Rivest Shamir Adleman (RSA) key. */ + public static final String RSA = "RSA"; + + /** Elliptic Curve (EC) key. */ + public static final String EC = "EC"; + + /** Advanced Encryption Standard (AES) key. */ + public static final String AES = "AES"; + + /** Keyed-Hash Message Authentication Code (HMAC) key using SHA-1 as the hash. */ + public static final String HMAC_SHA1 = "HmacSHA1"; + + /** Keyed-Hash Message Authentication Code (HMAC) key using SHA-224 as the hash. */ + public static final String HMAC_SHA224 = "HmacSHA224"; + + /** Keyed-Hash Message Authentication Code (HMAC) key using SHA-256 as the hash. */ + public static final String HMAC_SHA256 = "HmacSHA256"; + + /** Keyed-Hash Message Authentication Code (HMAC) key using SHA-384 as the hash. */ + public static final String HMAC_SHA384 = "HmacSHA384"; + + /** Keyed-Hash Message Authentication Code (HMAC) key using SHA-512 as the hash. */ + public static final String HMAC_SHA512 = "HmacSHA512"; + + /** + * @hide + */ + static int toKeymasterSecretKeyAlgorithm(@NonNull @AlgorithmEnum String algorithm) { + if (AES.equalsIgnoreCase(algorithm)) { + return KeymasterDefs.KM_ALGORITHM_AES; + } else if (algorithm.toUpperCase(Locale.US).startsWith("HMAC")) { + return KeymasterDefs.KM_ALGORITHM_HMAC; + } else { + throw new IllegalArgumentException( + "Unsupported secret key algorithm: " + algorithm); + } + } + + /** + * @hide + */ + @NonNull + static @AlgorithmEnum String fromKeymasterSecretKeyAlgorithm( + int keymasterAlgorithm, int keymasterDigest) { + switch (keymasterAlgorithm) { + case KeymasterDefs.KM_ALGORITHM_AES: + if (keymasterDigest != -1) { + throw new IllegalArgumentException("Digest not supported for AES key: " + + Digest.fromKeymaster(keymasterDigest)); + } + return AES; + case KeymasterDefs.KM_ALGORITHM_HMAC: + switch (keymasterDigest) { + case KeymasterDefs.KM_DIGEST_SHA1: + return HMAC_SHA1; + case KeymasterDefs.KM_DIGEST_SHA_2_224: + return HMAC_SHA224; + case KeymasterDefs.KM_DIGEST_SHA_2_256: + return HMAC_SHA256; + case KeymasterDefs.KM_DIGEST_SHA_2_384: + return HMAC_SHA384; + case KeymasterDefs.KM_DIGEST_SHA_2_512: + return HMAC_SHA512; + default: + throw new IllegalArgumentException("Unsupported HMAC digest: " + + Digest.fromKeymaster(keymasterDigest)); + } + default: + throw new IllegalArgumentException( + "Unsupported algorithm: " + keymasterAlgorithm); + } + } + + /** + * @hide + * + * @return keymaster digest or {@code -1} if the algorithm does not involve a digest. + */ + static int toKeymasterDigest(@NonNull @AlgorithmEnum String algorithm) { + String algorithmUpper = algorithm.toUpperCase(Locale.US); + if (algorithmUpper.startsWith("HMAC")) { + String digestUpper = algorithmUpper.substring("HMAC".length()); + switch (digestUpper) { + case "SHA1": + return KeymasterDefs.KM_DIGEST_SHA1; + case "SHA224": + return KeymasterDefs.KM_DIGEST_SHA_2_224; + case "SHA256": + return KeymasterDefs.KM_DIGEST_SHA_2_256; + case "SHA384": + return KeymasterDefs.KM_DIGEST_SHA_2_384; + case "SHA512": + return KeymasterDefs.KM_DIGEST_SHA_2_512; + default: + throw new IllegalArgumentException( + "Unsupported HMAC digest: " + digestUpper); + } + } else { + return -1; + } + } + } + + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + BlockMode.ECB, + BlockMode.CBC, + BlockMode.CTR, + BlockMode.GCM, + }) + public @interface BlockModeEnum {} + + /** + * Block modes that can be used when encrypting/decrypting using a key. + */ + public static abstract class BlockMode { + private BlockMode() {} + + /** Electronic Codebook (ECB) block mode. */ + public static final String ECB = "ECB"; + + /** Cipher Block Chaining (CBC) block mode. */ + public static final String CBC = "CBC"; + + /** Counter (CTR) block mode. */ + public static final String CTR = "CTR"; + + /** Galois/Counter Mode (GCM) block mode. */ + public static final String GCM = "GCM"; + + /** + * @hide + */ + static int toKeymaster(@NonNull @BlockModeEnum String blockMode) { + if (ECB.equalsIgnoreCase(blockMode)) { + return KeymasterDefs.KM_MODE_ECB; + } else if (CBC.equalsIgnoreCase(blockMode)) { + return KeymasterDefs.KM_MODE_CBC; + } else if (CTR.equalsIgnoreCase(blockMode)) { + return KeymasterDefs.KM_MODE_CTR; + } else if (GCM.equalsIgnoreCase(blockMode)) { + return KeymasterDefs.KM_MODE_GCM; + } else { + throw new IllegalArgumentException("Unsupported block mode: " + blockMode); + } + } + + /** + * @hide + */ + @NonNull + static @BlockModeEnum String fromKeymaster(int blockMode) { + switch (blockMode) { + case KeymasterDefs.KM_MODE_ECB: + return ECB; + case KeymasterDefs.KM_MODE_CBC: + return CBC; + case KeymasterDefs.KM_MODE_CTR: + return CTR; + case KeymasterDefs.KM_MODE_GCM: + return GCM; + default: + throw new IllegalArgumentException("Unsupported block mode: " + blockMode); + } + } + + /** + * @hide + */ + @NonNull + static @BlockModeEnum String[] allFromKeymaster(@NonNull Collection<Integer> blockModes) { + if ((blockModes == null) || (blockModes.isEmpty())) { + return EmptyArray.STRING; + } + @BlockModeEnum String[] result = new String[blockModes.size()]; + int offset = 0; + for (int blockMode : blockModes) { + result[offset] = fromKeymaster(blockMode); + offset++; + } + return result; + } + + /** + * @hide + */ + static int[] allToKeymaster(@Nullable @BlockModeEnum String[] blockModes) { + if ((blockModes == null) || (blockModes.length == 0)) { + return EmptyArray.INT; + } + int[] result = new int[blockModes.length]; + for (int i = 0; i < blockModes.length; i++) { + result[i] = toKeymaster(blockModes[i]); + } + return result; + } + } + + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + EncryptionPadding.NONE, + EncryptionPadding.PKCS7, + EncryptionPadding.RSA_PKCS1, + EncryptionPadding.RSA_OAEP, + }) + public @interface EncryptionPaddingEnum {} + + /** + * Padding schemes for encryption/decryption. + */ + public static abstract class EncryptionPadding { + private EncryptionPadding() {} + + /** + * No padding. + */ + public static final String NONE = "NoPadding"; + + /** + * PKCS#7 padding. + */ + public static final String PKCS7 = "PKCS7Padding"; + + /** + * RSA PKCS#1 v1.5 padding for encryption/decryption. + */ + public static final String RSA_PKCS1 = "PKCS1Padding"; + + /** + * RSA Optimal Asymmetric Encryption Padding (OAEP). + */ + public static final String RSA_OAEP = "OAEPPadding"; + + /** + * @hide + */ + static int toKeymaster(@NonNull @EncryptionPaddingEnum String padding) { + if (NONE.equalsIgnoreCase(padding)) { + return KeymasterDefs.KM_PAD_NONE; + } else if (PKCS7.equalsIgnoreCase(padding)) { + return KeymasterDefs.KM_PAD_PKCS7; + } else if (RSA_PKCS1.equalsIgnoreCase(padding)) { + return KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT; + } else if (RSA_OAEP.equalsIgnoreCase(padding)) { + return KeymasterDefs.KM_PAD_RSA_OAEP; + } else { + throw new IllegalArgumentException( + "Unsupported encryption padding scheme: " + padding); + } + } + + /** + * @hide + */ + @NonNull + static @EncryptionPaddingEnum String fromKeymaster(int padding) { + switch (padding) { + case KeymasterDefs.KM_PAD_NONE: + return NONE; + case KeymasterDefs.KM_PAD_PKCS7: + return PKCS7; + case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT: + return RSA_PKCS1; + case KeymasterDefs.KM_PAD_RSA_OAEP: + return RSA_OAEP; + default: + throw new IllegalArgumentException( + "Unsupported encryption padding: " + padding); + } + } + + /** + * @hide + */ + @NonNull + static int[] allToKeymaster(@Nullable @EncryptionPaddingEnum String[] paddings) { + if ((paddings == null) || (paddings.length == 0)) { + return EmptyArray.INT; + } + int[] result = new int[paddings.length]; + for (int i = 0; i < paddings.length; i++) { + result[i] = toKeymaster(paddings[i]); + } + return result; + } + } + + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + SignaturePadding.RSA_PKCS1, + SignaturePadding.RSA_PSS, + }) + public @interface SignaturePaddingEnum {} + + /** + * Padding schemes for signing/verification. + */ + public static abstract class SignaturePadding { + private SignaturePadding() {} + + /** + * RSA PKCS#1 v1.5 padding for signatures. + */ + public static final String RSA_PKCS1 = "PKCS1"; + + /** + * RSA PKCS#1 v2.1 Probabilistic Signature Scheme (PSS) padding. + */ + public static final String RSA_PSS = "PSS"; + + /** + * @hide + */ + static int toKeymaster(@NonNull @SignaturePaddingEnum String padding) { + switch (padding.toUpperCase(Locale.US)) { + case RSA_PKCS1: + return KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN; + case RSA_PSS: + return KeymasterDefs.KM_PAD_RSA_PSS; + default: + throw new IllegalArgumentException( + "Unsupported signature padding scheme: " + padding); + } + } + + /** + * @hide + */ + @NonNull + static @SignaturePaddingEnum String fromKeymaster(int padding) { + switch (padding) { + case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN: + return RSA_PKCS1; + case KeymasterDefs.KM_PAD_RSA_PSS: + return RSA_PSS; + default: + throw new IllegalArgumentException("Unsupported signature padding: " + padding); + } + } + + /** + * @hide + */ + @NonNull + static int[] allToKeymaster(@Nullable @SignaturePaddingEnum String[] paddings) { + if ((paddings == null) || (paddings.length == 0)) { + return EmptyArray.INT; + } + int[] result = new int[paddings.length]; + for (int i = 0; i < paddings.length; i++) { + result[i] = toKeymaster(paddings[i]); + } + return result; + } + } + + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + Digest.NONE, + Digest.MD5, + Digest.SHA1, + Digest.SHA224, + Digest.SHA256, + Digest.SHA384, + Digest.SHA512, + }) + public @interface DigestEnum {} + + /** + * Digests that can be used with a key when signing or generating Message Authentication + * Codes (MACs). + */ + public static abstract class Digest { + private Digest() {} + + /** + * No digest: sign/authenticate the raw message. + */ + public static final String NONE = "NONE"; + + /** + * MD5 digest. + */ + public static final String MD5 = "MD5"; + + /** + * SHA-1 digest. + */ + public static final String SHA1 = "SHA-1"; + + /** + * SHA-2 224 (aka SHA-224) digest. + */ + public static final String SHA224 = "SHA-224"; + + /** + * SHA-2 256 (aka SHA-256) digest. + */ + public static final String SHA256 = "SHA-256"; + + /** + * SHA-2 384 (aka SHA-384) digest. + */ + public static final String SHA384 = "SHA-384"; + + /** + * SHA-2 512 (aka SHA-512) digest. + */ + public static final String SHA512 = "SHA-512"; + + /** + * @hide + */ + static int toKeymaster(@NonNull @DigestEnum String digest) { + switch (digest.toUpperCase(Locale.US)) { + case SHA1: + return KeymasterDefs.KM_DIGEST_SHA1; + case SHA224: + return KeymasterDefs.KM_DIGEST_SHA_2_224; + case SHA256: + return KeymasterDefs.KM_DIGEST_SHA_2_256; + case SHA384: + return KeymasterDefs.KM_DIGEST_SHA_2_384; + case SHA512: + return KeymasterDefs.KM_DIGEST_SHA_2_512; + case NONE: + return KeymasterDefs.KM_DIGEST_NONE; + case MD5: + return KeymasterDefs.KM_DIGEST_MD5; + default: + throw new IllegalArgumentException("Unsupported digest algorithm: " + digest); + } + } + + /** + * @hide + */ + @NonNull + static @DigestEnum String fromKeymaster(int digest) { + switch (digest) { + case KeymasterDefs.KM_DIGEST_NONE: + return NONE; + case KeymasterDefs.KM_DIGEST_MD5: + return MD5; + case KeymasterDefs.KM_DIGEST_SHA1: + return SHA1; + case KeymasterDefs.KM_DIGEST_SHA_2_224: + return SHA224; + case KeymasterDefs.KM_DIGEST_SHA_2_256: + return SHA256; + case KeymasterDefs.KM_DIGEST_SHA_2_384: + return SHA384; + case KeymasterDefs.KM_DIGEST_SHA_2_512: + return SHA512; + default: + throw new IllegalArgumentException("Unsupported digest algorithm: " + digest); + } + } + + /** + * @hide + */ + @NonNull + static @DigestEnum String[] allFromKeymaster(@NonNull Collection<Integer> digests) { + if (digests.isEmpty()) { + return EmptyArray.STRING; + } + String[] result = new String[digests.size()]; + int offset = 0; + for (int digest : digests) { + result[offset] = fromKeymaster(digest); + offset++; + } + return result; + } + + /** + * @hide + */ + @NonNull + static int[] allToKeymaster(@Nullable @DigestEnum String[] digests) { + if ((digests == null) || (digests.length == 0)) { + return EmptyArray.INT; + } + int[] result = new int[digests.length]; + int offset = 0; + for (@DigestEnum String digest : digests) { + result[offset] = toKeymaster(digest); + offset++; + } + return result; + } + } + + @Retention(RetentionPolicy.SOURCE) @IntDef({Origin.GENERATED, Origin.IMPORTED, Origin.UNKNOWN}) public @interface OriginEnum {} @@ -138,7 +669,7 @@ public abstract class KeyStoreKeyProperties { public static final int IMPORTED = 1 << 1; /** - * Origin of the key is unknown. This can occur only for keys backed by an old TEE + * Origin of the key is unknown. This can occur only for keys backed by an old TEE-backed * implementation which does not record origin information. */ public static final int UNKNOWN = 1 << 2; diff --git a/keystore/java/android/security/KeyStoreKeySpec.java b/keystore/java/android/security/KeyStoreKeySpec.java index 96d58d824011..81a19bb55755 100644 --- a/keystore/java/android/security/KeyStoreKeySpec.java +++ b/keystore/java/android/security/KeyStoreKeySpec.java @@ -16,50 +16,90 @@ package android.security; +import android.annotation.NonNull; +import android.annotation.Nullable; + +import java.security.PrivateKey; import java.security.spec.KeySpec; import java.util.Date; +import javax.crypto.SecretKey; + /** * Information about a key from the <a href="{@docRoot}training/articles/keystore.html">Android - * KeyStore</a>. + * KeyStore</a>. This class describes whether the key material is available in + * plaintext outside of secure hardware, whether user authentication is required for using the key + * and whether this requirement is enforced by secure hardware, the key's origin, what uses the key + * is authorized for (e.g., only in {@code CBC} mode, or signing only), whether the key should be + * encrypted at rest, the key's and validity start and end dates. + * + * <p><h3>Example: Symmetric Key</h3> + * The following example illustrates how to obtain a {@link KeyStoreKeySpec} describing the provided + * Android KeyStore {@link SecretKey}. + * <pre> {@code + * SecretKey key = ...; // Android KeyStore key + * + * SecretKeyFactory factory = SecretKeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore"); + * KeyStoreKeySpec spec; + * try { + * spec = (KeyStoreKeySpec) factory.getKeySpec(key, KeyStoreKeySpec.class); + * } catch (InvalidKeySpecException e) { + * // Not an Android KeyStore key. + * } + * }</pre> + * + * <p><h3>Example: Private Key</h3> + * The following example illustrates how to obtain a {@link KeyStoreKeySpec} describing the provided + * Android KeyStore {@link PrivateKey}. + * <pre> {@code + * PrivateKey key = ...; // Android KeyStore key + * + * KeyFactory factory = KeyFactory.getInstance(key.getAlgorithm(), "AndroidKeyStore"); + * KeyStoreKeySpec spec; + * try { + * spec = factory.getKeySpec(key, KeyStoreKeySpec.class); + * } catch (InvalidKeySpecException e) { + * // Not an Android KeyStore key. + * } + * }</pre> */ public class KeyStoreKeySpec implements KeySpec { private final String mKeystoreAlias; private final int mKeySize; - private final boolean mTeeBacked; + private final boolean mInsideSecureHardware; private final @KeyStoreKeyProperties.OriginEnum int mOrigin; private final Date mKeyValidityStart; private final Date mKeyValidityForOriginationEnd; private final Date mKeyValidityForConsumptionEnd; private final @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private final String[] mEncryptionPaddings; - private final String[] mSignaturePaddings; - private final String[] mDigests; - private final String[] mBlockModes; + private final @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; + private final @KeyStoreKeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; + private final @KeyStoreKeyProperties.DigestEnum String[] mDigests; + private final @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private final boolean mUserAuthenticationRequired; private final int mUserAuthenticationValidityDurationSeconds; - private final boolean mUserAuthenticationRequirementTeeEnforced; + private final boolean mUserAuthenticationRequirementEnforcedBySecureHardware; /** * @hide */ KeyStoreKeySpec(String keystoreKeyAlias, - boolean teeBacked, + boolean insideSecureHardware, @KeyStoreKeyProperties.OriginEnum int origin, int keySize, Date keyValidityStart, Date keyValidityForOriginationEnd, Date keyValidityForConsumptionEnd, @KeyStoreKeyProperties.PurposeEnum int purposes, - String[] encryptionPaddings, - String[] signaturePaddings, - String[] digests, - String[] blockModes, + @KeyStoreKeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, + @KeyStoreKeyProperties.SignaturePaddingEnum String[] signaturePaddings, + @KeyStoreKeyProperties.DigestEnum String[] digests, + @KeyStoreKeyProperties.BlockModeEnum String[] blockModes, boolean userAuthenticationRequired, int userAuthenticationValidityDurationSeconds, - boolean userAuthenticationRequirementTeeEnforced) { + boolean userAuthenticationRequirementEnforcedBySecureHardware) { mKeystoreAlias = keystoreKeyAlias; - mTeeBacked = teeBacked; + mInsideSecureHardware = insideSecureHardware; mOrigin = origin; mKeySize = keySize; mKeyValidityStart = keyValidityStart; @@ -74,7 +114,8 @@ public class KeyStoreKeySpec implements KeySpec { mBlockModes = ArrayUtils.cloneIfNotEmpty(ArrayUtils.nullToEmpty(blockModes)); mUserAuthenticationRequired = userAuthenticationRequired; mUserAuthenticationValidityDurationSeconds = userAuthenticationValidityDurationSeconds; - mUserAuthenticationRequirementTeeEnforced = userAuthenticationRequirementTeeEnforced; + mUserAuthenticationRequirementEnforcedBySecureHardware = + userAuthenticationRequirementEnforcedBySecureHardware; } /** @@ -85,11 +126,12 @@ public class KeyStoreKeySpec implements KeySpec { } /** - * Returns {@code true} if the key is TEE-backed. Key material of TEE-backed keys is available - * in plaintext only inside the TEE. + * Returns {@code true} if the key resides inside secure hardware (e.g., Trusted Execution + * Environment (TEE) or Secure Element (SE)). Key material of such keys is available in + * plaintext only inside the secure hardware and is not exposed outside of it. */ - public boolean isTeeBacked() { - return mTeeBacked; + public boolean isInsideSecureHardware() { + return mInsideSecureHardware; } /** @@ -111,6 +153,7 @@ public class KeyStoreKeySpec implements KeySpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityStart() { return mKeyValidityStart; } @@ -120,6 +163,7 @@ public class KeyStoreKeySpec implements KeySpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForConsumptionEnd() { return mKeyValidityForConsumptionEnd; } @@ -129,6 +173,7 @@ public class KeyStoreKeySpec implements KeySpec { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForOriginationEnd() { return mKeyValidityForOriginationEnd; } @@ -143,28 +188,32 @@ public class KeyStoreKeySpec implements KeySpec { /** * Gets the set of block modes with which the key can be used. */ - public String[] getBlockModes() { + @NonNull + public @KeyStoreKeyProperties.BlockModeEnum String[] getBlockModes() { return ArrayUtils.cloneIfNotEmpty(mBlockModes); } /** * Gets the set of padding modes with which the key can be used when encrypting/decrypting. */ - public String[] getEncryptionPaddings() { + @NonNull + public @KeyStoreKeyProperties.EncryptionPaddingEnum String[] getEncryptionPaddings() { return ArrayUtils.cloneIfNotEmpty(mEncryptionPaddings); } /** * Gets the set of padding modes with which the key can be used when signing/verifying. */ - public String[] getSignaturePaddings() { + @NonNull + public @KeyStoreKeyProperties.SignaturePaddingEnum String[] getSignaturePaddings() { return ArrayUtils.cloneIfNotEmpty(mSignaturePaddings); } /** * Gets the set of digest algorithms with which the key can be used. */ - public String[] getDigests() { + @NonNull + public @KeyStoreKeyProperties.DigestEnum String[] getDigests() { return ArrayUtils.cloneIfNotEmpty(mDigests); } @@ -179,10 +228,10 @@ public class KeyStoreKeySpec implements KeySpec { /** * Gets the duration of time (seconds) for which this key can be used after the user is - * successfully authenticated. + * successfully authenticated. This has effect only if user authentication is required. * - * @return duration in seconds or {@code -1} if not restricted. {@code 0} means authentication - * is required for every use of the key. + * @return duration in seconds or {@code -1} if authentication is required for every use of the + * key. * * @see #isUserAuthenticationRequired() */ @@ -192,11 +241,12 @@ public class KeyStoreKeySpec implements KeySpec { /** * Returns {@code true} if the requirement that this key can only be used if the user has been - * authenticated if enforced by the TEE. + * authenticated if enforced by secure hardware (e.g., Trusted Execution Environment (TEE) or + * Secure Element (SE)). * * @see #isUserAuthenticationRequired() */ - public boolean isUserAuthenticationRequirementTeeEnforced() { - return mUserAuthenticationRequirementTeeEnforced; + public boolean isUserAuthenticationRequirementEnforcedBySecureHardware() { + return mUserAuthenticationRequirementEnforcedBySecureHardware; } } diff --git a/keystore/java/android/security/KeyStoreParameter.java b/keystore/java/android/security/KeyStoreParameter.java index b4747e937040..4a736c33f615 100644 --- a/keystore/java/android/security/KeyStoreParameter.java +++ b/keystore/java/android/security/KeyStoreParameter.java @@ -16,27 +16,92 @@ package android.security; +import android.annotation.IntRange; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.KeyguardManager; import android.content.Context; import java.security.Key; import java.security.KeyStore.ProtectionParameter; +import java.security.cert.Certificate; import java.util.Date; import javax.crypto.Cipher; /** - * Parameters specifying how to secure and restrict the use of a key being - * imported into the - * <a href="{@docRoot}training/articles/keystore.html">Android KeyStore - * facility</a>. The Android KeyStore facility is accessed through a - * {@link java.security.KeyStore} API using the {@code AndroidKeyStore} - * provider. The {@code context} passed in may be used to pop up some UI to ask - * the user to unlock or initialize the Android KeyStore facility. - * <p> - * Any entries placed in the {@code KeyStore} may be retrieved later. Note that - * there is only one logical instance of the {@code KeyStore} per application - * UID so apps using the {@code sharedUid} facility will also share a - * {@code KeyStore}. + * Parameters specifying how to secure and restrict the use of a key or key pair being imported into + * the <a href="{@docRoot}training/articles/keystore.html">Android KeyStore facility</a>. This class + * specifies whether user authentication is required for using the key, what uses the key is + * authorized for (e.g., only in {@code CTR} mode, or only for signing -- decryption not permitted), + * whether the key should be encrypted at rest, the key's and validity start and end dates. + * + * <p>To import a key or key pair into the Android KeyStore, create an instance of this class using + * the {@link Builder} and pass the instance into {@link java.security.KeyStore#setEntry(String, java.security.KeyStore.Entry, ProtectionParameter) KeyStore.setEntry} + * with the key or key pair being imported. + * + * <p>To obtain the secret/symmetric or private key from the Android KeyStore use + * {@link java.security.KeyStore#getKey(String, char[]) KeyStore.getKey(String, null)} or + * {@link java.security.KeyStore#getEntry(String, java.security.KeyStore.ProtectionParameter) KeyStore.getEntry(String, null)}. + * To obtain the public key from the Android KeyStore use + * {@link java.security.KeyStore#getCertificate(String)} and then + * {@link Certificate#getPublicKey()}. + * + * <p>NOTE: The key material of keys stored in the Android KeyStore is not accessible. + * + * <p><h3>Example: Symmetric Key</h3> + * The following example illustrates how to import an AES key into the Android KeyStore under alias + * {@code key1} authorized to be used only for encryption/decryption in CBC mode with PKCS#7 + * padding. The key must export its key material via {@link Key#getEncoded()} in {@code RAW} format. + * <pre> {@code + * SecretKey key = ...; // AES key + * + * KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + * keyStore.load(null); + * keyStore.setEntry( + * "key1", + * new KeyStore.SecretKeyEntry(key), + * new KeyStoreParameter.Builder(context) + * .setPurposes(KeyStoreKeyProperties.Purpose.ENCRYPT + * | KeyStoreKeyProperties.Purpose.DECRYPT) + * .setBlockMode(KeyStoreKeyProperties.BlockMode.CBC) + * .setEncryptionPaddings( + * KeyStoreKeyProperties.EncryptionPaddings.PKCS7) + * .build()); + * // Key imported, obtain a reference to it. + * SecretKey keyStoreKey = (SecretKey) keyStore.getKey("key1", null); + * // The original key can now be thrown away. + * }</pre> + * + * <p><h3>Example: Asymmetric Key Pair</h3> + * The following example illustrates how to import an EC key pair into the Android KeyStore under + * alias {@code key2} authorized to be used only for signing with SHA-256 digest and only if + * the user has been authenticated within the last ten minutes. Both the private and the public key + * must export their key material via {@link Key#getEncoded()} in {@code PKCS#8} and {@code X.509} + * format respectively. + * <pre> {@code + * PrivateKey privateKey = ...; // EC private key + * Certificate[] certChain = ...; // Certificate chain with the first certificate + * // containing the corresponding EC public key. + * + * KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); + * keyStore.load(null); + * keyStore.setEntry( + * "key2", + * new KeyStore.PrivateKeyEntry(privateKey, certChain), + * new KeyStoreParameter.Builder(context) + * .setPurposes(KeyStoreKeyProperties.Purpose.SIGN) + * .setDigests(KeyStoreKeyProperties.Digest.SHA256) + * // Only permit this key to be used if the user + * // authenticated within the last ten minutes. + * .setUserAuthenticationRequired(true) + * .setUserAuthenticationValidityDurationSeconds(10 * 60) + * .build()); + * // Key pair imported, obtain a reference to it. + * PrivateKey keyStorePrivateKey = (PrivateKey) keyStore.getKey("key2", null); + * PublicKey publicKey = keyStore.getCertificate("key2").getPublicKey(); + * // The original private key can now be thrown away. + * }</pre> */ public final class KeyStoreParameter implements ProtectionParameter { private final Context mContext; @@ -45,10 +110,10 @@ public final class KeyStoreParameter implements ProtectionParameter { private final Date mKeyValidityForOriginationEnd; private final Date mKeyValidityForConsumptionEnd; private final @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private final String[] mEncryptionPaddings; - private final String[] mSignaturePaddings; - private final String[] mDigests; - private final String[] mBlockModes; + private final @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; + private final @KeyStoreKeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; + private final @KeyStoreKeyProperties.DigestEnum String[] mDigests; + private final @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private final boolean mRandomizedEncryptionRequired; private final boolean mUserAuthenticationRequired; private final int mUserAuthenticationValidityDurationSeconds; @@ -60,10 +125,10 @@ public final class KeyStoreParameter implements ProtectionParameter { Date keyValidityForOriginationEnd, Date keyValidityForConsumptionEnd, @KeyStoreKeyProperties.PurposeEnum int purposes, - String[] encryptionPaddings, - String[] signaturePaddings, - String[] digests, - String[] blockModes, + @KeyStoreKeyProperties.EncryptionPaddingEnum String[] encryptionPaddings, + @KeyStoreKeyProperties.SignaturePaddingEnum String[] signaturePaddings, + @KeyStoreKeyProperties.DigestEnum String[] digests, + @KeyStoreKeyProperties.BlockModeEnum String[] blockModes, boolean randomizedEncryptionRequired, boolean userAuthenticationRequired, int userAuthenticationValidityDurationSeconds) { @@ -107,8 +172,9 @@ public final class KeyStoreParameter implements ProtectionParameter { } /** - * Returns {@code true} if this parameter requires entries to be encrypted - * on the disk. + * Returns {@code true} if the {@link java.security.KeyStore} entry must be encrypted at rest. + * This will protect the entry with the secure lock screen credential (e.g., password, PIN, or + * pattern). */ public boolean isEncryptionRequired() { return (mFlags & KeyStore.FLAG_ENCRYPTED) != 0; @@ -119,6 +185,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityStart() { return mKeyValidityStart; } @@ -128,6 +195,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForConsumptionEnd() { return mKeyValidityForConsumptionEnd; } @@ -137,6 +205,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * * @return instant or {@code null} if not restricted. */ + @Nullable public Date getKeyValidityForOriginationEnd() { return mKeyValidityForOriginationEnd; } @@ -151,7 +220,8 @@ public final class KeyStoreParameter implements ProtectionParameter { /** * Gets the set of padding schemes with which the key can be used when encrypting/decrypting. */ - public String[] getEncryptionPaddings() { + @NonNull + public @KeyStoreKeyProperties.EncryptionPaddingEnum String[] getEncryptionPaddings() { return ArrayUtils.cloneIfNotEmpty(mEncryptionPaddings); } @@ -159,7 +229,8 @@ public final class KeyStoreParameter implements ProtectionParameter { * Gets the set of padding schemes with which the key can be used when signing or verifying * signatures. */ - public String[] getSignaturePaddings() { + @NonNull + public @KeyStoreKeyProperties.SignaturePaddingEnum String[] getSignaturePaddings() { return ArrayUtils.cloneIfNotEmpty(mSignaturePaddings); } @@ -170,7 +241,8 @@ public final class KeyStoreParameter implements ProtectionParameter { * * @see #isDigestsSpecified() */ - public String[] getDigests() { + @NonNull + public @KeyStoreKeyProperties.DigestEnum String[] getDigests() { if (mDigests == null) { throw new IllegalStateException("Digests not specified"); } @@ -183,6 +255,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * * @see #getDigests() */ + @NonNull public boolean isDigestsSpecified() { return mDigests != null; } @@ -190,7 +263,8 @@ public final class KeyStoreParameter implements ProtectionParameter { /** * Gets the set of block modes with which the key can be used. */ - public String[] getBlockModes() { + @NonNull + public @KeyStoreKeyProperties.BlockModeEnum String[] getBlockModes() { return ArrayUtils.cloneIfNotEmpty(mBlockModes); } @@ -218,10 +292,12 @@ public final class KeyStoreParameter implements ProtectionParameter { /** * Gets the duration of time (seconds) for which this key can be used after the user is - * successfully authenticated. + * successfully authenticated. This has effect only if user authentication is required. + * + * @return duration in seconds or {@code -1} if authentication is required for every use of the + * key. * - * @return duration in seconds or {@code -1} if not restricted. {@code 0} means authentication - * is required for every use of the key. + * @see #isUserAuthenticationRequired() */ public int getUserAuthenticationValidityDurationSeconds() { return mUserAuthenticationValidityDurationSeconds; @@ -240,7 +316,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <pre class="prettyprint"> * KeyStoreParameter params = new KeyStoreParameter.Builder(mContext) - * .setEncryptionRequired() + * .setEncryptionRequired(true) * .build(); * </pre> */ @@ -251,10 +327,10 @@ public final class KeyStoreParameter implements ProtectionParameter { private Date mKeyValidityForOriginationEnd; private Date mKeyValidityForConsumptionEnd; private @KeyStoreKeyProperties.PurposeEnum int mPurposes; - private String[] mEncryptionPaddings; - private String[] mSignaturePaddings; - private String[] mDigests; - private String[] mBlockModes; + private @KeyStoreKeyProperties.EncryptionPaddingEnum String[] mEncryptionPaddings; + private @KeyStoreKeyProperties.SignaturePaddingEnum String[] mSignaturePaddings; + private @KeyStoreKeyProperties.DigestEnum String[] mDigests; + private @KeyStoreKeyProperties.BlockModeEnum String[] mBlockModes; private boolean mRandomizedEncryptionRequired = true; private boolean mUserAuthenticationRequired; private int mUserAuthenticationValidityDurationSeconds = -1; @@ -265,7 +341,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * some UI to ask the user to unlock or initialize the Android KeyStore * facility. */ - public Builder(Context context) { + public Builder(@NonNull Context context) { if (context == null) { throw new NullPointerException("context == null"); } @@ -273,11 +349,19 @@ public final class KeyStoreParameter implements ProtectionParameter { } /** - * Indicates that this key must be encrypted at rest on storage. Note - * that enabling this will require that the user enable a strong lock - * screen (e.g., PIN, password) before creating or using the generated - * key is successful. + * Sets whether this {@link java.security.KeyStore} entry must be encrypted at rest. + * Encryption at rest will protect the entry with the secure lock screen credential (e.g., + * password, PIN, or pattern). + * + * <p>Note that enabling this feature requires that the secure lock screen (e.g., password, + * PIN, pattern) is set up, otherwise setting the {@code KeyStore} entry will fail. + * Moreover, this entry will be deleted when the secure lock screen is disabled or reset + * (e.g., by the user or a Device Administrator). Finally, this entry cannot be used until + * the user unlocks the secure lock screen after boot. + * + * @see KeyguardManager#isDeviceSecure() */ + @NonNull public Builder setEncryptionRequired(boolean required) { if (required) { mFlags |= KeyStore.FLAG_ENCRYPTED; @@ -292,8 +376,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * * @see #setKeyValidityEnd(Date) */ + @NonNull public Builder setKeyValidityStart(Date startDate) { mKeyValidityStart = startDate; return this; @@ -304,10 +391,13 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * * @see #setKeyValidityStart(Date) * @see #setKeyValidityForConsumptionEnd(Date) * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityEnd(Date endDate) { setKeyValidityForOriginationEnd(endDate); setKeyValidityForConsumptionEnd(endDate); @@ -319,8 +409,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * * @see #setKeyValidityForConsumptionEnd(Date) */ + @NonNull public Builder setKeyValidityForOriginationEnd(Date endDate) { mKeyValidityForOriginationEnd = endDate; return this; @@ -332,8 +425,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>By default, the key is valid at any instant. * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * * @see #setKeyValidityForOriginationEnd(Date) */ + @NonNull public Builder setKeyValidityForConsumptionEnd(Date endDate) { mKeyValidityForConsumptionEnd = endDate; return this; @@ -343,7 +439,10 @@ public final class KeyStoreParameter implements ProtectionParameter { * Sets the set of purposes for which the key can be used. * * <p>This must be specified for all keys. There is no default. + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ + @NonNull public Builder setPurposes(@KeyStoreKeyProperties.PurposeEnum int purposes) { mPurposes = purposes; return this; @@ -355,8 +454,12 @@ public final class KeyStoreParameter implements ProtectionParameter { * rejected. * * <p>This must be specified for keys which are used for encryption/decryption. + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ - public Builder setEncryptionPaddings(String... paddings) { + @NonNull + public Builder setEncryptionPaddings( + @KeyStoreKeyProperties.EncryptionPaddingEnum String... paddings) { mEncryptionPaddings = ArrayUtils.cloneIfNotEmpty(paddings); return this; } @@ -367,8 +470,12 @@ public final class KeyStoreParameter implements ProtectionParameter { * rejected. * * <p>This must be specified for RSA keys which are used for signing/verification. + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ - public Builder setSignaturePaddings(String... paddings) { + @NonNull + public Builder setSignaturePaddings( + @KeyStoreKeyProperties.SignaturePaddingEnum String... paddings) { mSignaturePaddings = ArrayUtils.cloneIfNotEmpty(paddings); return this; } @@ -380,8 +487,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>For HMAC keys, the default is the digest specified in {@link Key#getAlgorithm()}. For * asymmetric signing keys this constraint must be specified. + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ - public Builder setDigests(String... digests) { + @NonNull + public Builder setDigests(@KeyStoreKeyProperties.DigestEnum String... digests) { mDigests = ArrayUtils.cloneIfNotEmpty(digests); return this; } @@ -391,8 +501,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * Attempts to use the key with any other block modes will be rejected. * * <p>This must be specified for encryption/decryption keys. + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ - public Builder setBlockModes(String... blockModes) { + @NonNull + public Builder setBlockModes(@KeyStoreKeyProperties.BlockModeEnum String... blockModes) { mBlockModes = ArrayUtils.cloneIfNotEmpty(blockModes); return this; } @@ -430,7 +543,10 @@ public final class KeyStoreParameter implements ProtectionParameter { * <li>If you are using RSA encryption without padding, consider switching to padding * schemes which offer {@code IND-CPA}, such as PKCS#1 or OAEP.</li> * </ul> + * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. */ + @NonNull public Builder setRandomizedEncryptionRequired(boolean required) { mRandomizedEncryptionRequired = required; return this; @@ -449,8 +565,11 @@ public final class KeyStoreParameter implements ProtectionParameter { * <a href="{@docRoot}training/articles/keystore.html#UserAuthentication">More * information</a>. * + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * * @see #setUserAuthenticationValidityDurationSeconds(int) */ + @NonNull public Builder setUserAuthenticationRequired(boolean required) { mUserAuthenticationRequired = required; return this; @@ -462,12 +581,16 @@ public final class KeyStoreParameter implements ProtectionParameter { * * <p>By default, the user needs to authenticate for every use of the key. * - * @param seconds duration in seconds or {@code 0} if the user needs to authenticate for + * <p><b>NOTE: This has currently no effect on asymmetric key pairs. + * + * @param seconds duration in seconds or {@code -1} if the user needs to authenticate for * every use of the key. * * @see #setUserAuthenticationRequired(boolean) */ - public Builder setUserAuthenticationValidityDurationSeconds(int seconds) { + @NonNull + public Builder setUserAuthenticationValidityDurationSeconds( + @IntRange(from = -1) int seconds) { mUserAuthenticationValidityDurationSeconds = seconds; return this; } @@ -478,6 +601,7 @@ public final class KeyStoreParameter implements ProtectionParameter { * @throws IllegalArgumentException if a required field is missing * @return built instance of {@code KeyStoreParameter} */ + @NonNull public KeyStoreParameter build() { return new KeyStoreParameter( mContext, diff --git a/keystore/java/android/security/KeyStoreSecretKeyFactorySpi.java b/keystore/java/android/security/KeyStoreSecretKeyFactorySpi.java index bfe09e3e1b73..548296b07c5d 100644 --- a/keystore/java/android/security/KeyStoreSecretKeyFactorySpi.java +++ b/keystore/java/android/security/KeyStoreSecretKeyFactorySpi.java @@ -74,22 +74,22 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi { + " Keystore error: " + errorCode); } - boolean teeBacked; + boolean insideSecureHardware; @KeyStoreKeyProperties.OriginEnum int origin; int keySize; @KeyStoreKeyProperties.PurposeEnum int purposes; String[] encryptionPaddings; - String[] digests; - String[] blockModes; + @KeyStoreKeyProperties.DigestEnum String[] digests; + @KeyStoreKeyProperties.BlockModeEnum String[] blockModes; int keymasterSwEnforcedUserAuthenticators; int keymasterHwEnforcedUserAuthenticators; try { if (keyCharacteristics.hwEnforced.containsTag(KeymasterDefs.KM_TAG_ORIGIN)) { - teeBacked = true; + insideSecureHardware = true; origin = KeyStoreKeyProperties.Origin.fromKeymaster( keyCharacteristics.hwEnforced.getInt(KeymasterDefs.KM_TAG_ORIGIN, -1)); } else if (keyCharacteristics.swEnforced.containsTag(KeymasterDefs.KM_TAG_ORIGIN)) { - teeBacked = false; + insideSecureHardware = false; origin = KeyStoreKeyProperties.Origin.fromKeymaster( keyCharacteristics.swEnforced.getInt(KeymasterDefs.KM_TAG_ORIGIN, -1)); } else { @@ -105,10 +105,10 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi { List<String> encryptionPaddingsList = new ArrayList<String>(); for (int keymasterPadding : keyCharacteristics.getInts(KeymasterDefs.KM_TAG_PADDING)) { - String jcaPadding; + @KeyStoreKeyProperties.EncryptionPaddingEnum String jcaPadding; try { - jcaPadding = KeymasterUtils.getJcaEncryptionPaddingFromKeymasterPadding( - keymasterPadding); + jcaPadding = + KeyStoreKeyProperties.EncryptionPadding.fromKeymaster(keymasterPadding); } catch (IllegalArgumentException e) { throw new InvalidKeySpecException( "Unsupported encryption padding: " + keymasterPadding); @@ -118,9 +118,9 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi { encryptionPaddings = encryptionPaddingsList.toArray(new String[encryptionPaddingsList.size()]); - digests = KeymasterUtils.getJcaDigestAlgorithmsFromKeymasterDigests( + digests = KeyStoreKeyProperties.Digest.allFromKeymaster( keyCharacteristics.getInts(KeymasterDefs.KM_TAG_DIGEST)); - blockModes = KeymasterUtils.getJcaBlockModesFromKeymasterBlockModes( + blockModes = KeyStoreKeyProperties.BlockMode.allFromKeymaster( keyCharacteristics.getInts(KeymasterDefs.KM_TAG_BLOCK_MODE)); keymasterSwEnforcedUserAuthenticators = keyCharacteristics.swEnforced.getInt(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, 0); @@ -150,12 +150,12 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi { !keyCharacteristics.getBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED); int userAuthenticationValidityDurationSeconds = keyCharacteristics.getInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT, -1); - boolean userAuthenticationRequirementEnforcedInTee = (userAuthenticationRequired) + boolean userAuthenticationRequirementEnforcedBySecureHardware = (userAuthenticationRequired) && (keymasterHwEnforcedUserAuthenticators != 0) && (keymasterSwEnforcedUserAuthenticators == 0); return new KeyStoreKeySpec(entryAlias, - teeBacked, + insideSecureHardware, origin, keySize, keyValidityStart, @@ -168,7 +168,7 @@ public class KeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi { blockModes, userAuthenticationRequired, userAuthenticationValidityDurationSeconds, - userAuthenticationRequirementEnforcedInTee); + userAuthenticationRequirementEnforcedBySecureHardware); } @Override diff --git a/keystore/java/android/security/KeymasterUtils.java b/keystore/java/android/security/KeymasterUtils.java index aa44ecda3ed7..df67ae76b39c 100644 --- a/keystore/java/android/security/KeymasterUtils.java +++ b/keystore/java/android/security/KeymasterUtils.java @@ -21,11 +21,6 @@ import android.hardware.fingerprint.FingerprintManager; import android.security.keymaster.KeymasterArguments; import android.security.keymaster.KeymasterDefs; -import libcore.util.EmptyArray; - -import java.util.Collection; -import java.util.Locale; - /** * @hide */ @@ -33,152 +28,6 @@ public abstract class KeymasterUtils { private KeymasterUtils() {} - public static int getKeymasterAlgorithmFromJcaSecretKeyAlgorithm(String jcaKeyAlgorithm) { - if ("AES".equalsIgnoreCase(jcaKeyAlgorithm)) { - return KeymasterDefs.KM_ALGORITHM_AES; - } else if (jcaKeyAlgorithm.toUpperCase(Locale.US).startsWith("HMAC")) { - return KeymasterDefs.KM_ALGORITHM_HMAC; - } else { - throw new IllegalArgumentException( - "Unsupported secret key algorithm: " + jcaKeyAlgorithm); - } - } - - public static String getJcaSecretKeyAlgorithm(int keymasterAlgorithm, int keymasterDigest) { - switch (keymasterAlgorithm) { - case KeymasterDefs.KM_ALGORITHM_AES: - if (keymasterDigest != -1) { - throw new IllegalArgumentException( - "Digest not supported for AES key: " + keymasterDigest); - } - return "AES"; - case KeymasterDefs.KM_ALGORITHM_HMAC: - switch (keymasterDigest) { - case KeymasterDefs.KM_DIGEST_SHA1: - return "HmacSHA1"; - case KeymasterDefs.KM_DIGEST_SHA_2_224: - return "HmacSHA224"; - case KeymasterDefs.KM_DIGEST_SHA_2_256: - return "HmacSHA256"; - case KeymasterDefs.KM_DIGEST_SHA_2_384: - return "HmacSHA384"; - case KeymasterDefs.KM_DIGEST_SHA_2_512: - return "HmacSHA512"; - default: - throw new IllegalArgumentException( - "Unsupported HMAC digest: " + keymasterDigest); - } - default: - throw new IllegalArgumentException("Unsupported algorithm: " + keymasterAlgorithm); - } - } - - public static String getJcaKeyPairAlgorithmFromKeymasterAlgorithm(int keymasterAlgorithm) { - switch (keymasterAlgorithm) { - case KeymasterDefs.KM_ALGORITHM_RSA: - return "RSA"; - case KeymasterDefs.KM_ALGORITHM_EC: - return "EC"; - default: - throw new IllegalArgumentException("Unsupported algorithm: " + keymasterAlgorithm); - } - } - - public static int getKeymasterDigestfromJcaSecretKeyAlgorithm(String jcaKeyAlgorithm) { - String algorithmUpper = jcaKeyAlgorithm.toUpperCase(Locale.US); - if (algorithmUpper.startsWith("HMAC")) { - String digestUpper = algorithmUpper.substring("HMAC".length()); - switch (digestUpper) { - case "MD5": - return KeymasterDefs.KM_DIGEST_MD5; - case "SHA1": - return KeymasterDefs.KM_DIGEST_SHA1; - case "SHA224": - return KeymasterDefs.KM_DIGEST_SHA_2_224; - case "SHA256": - return KeymasterDefs.KM_DIGEST_SHA_2_256; - case "SHA384": - return KeymasterDefs.KM_DIGEST_SHA_2_384; - case "SHA512": - return KeymasterDefs.KM_DIGEST_SHA_2_512; - default: - throw new IllegalArgumentException("Unsupported HMAC digest: " + digestUpper); - } - } else { - return -1; - } - } - - public static int getKeymasterDigestFromJcaDigestAlgorithm(String jcaDigestAlgorithm) { - if (jcaDigestAlgorithm.equalsIgnoreCase("SHA-1")) { - return KeymasterDefs.KM_DIGEST_SHA1; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("SHA-224")) { - return KeymasterDefs.KM_DIGEST_SHA_2_224; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("SHA-256")) { - return KeymasterDefs.KM_DIGEST_SHA_2_256; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("SHA-384")) { - return KeymasterDefs.KM_DIGEST_SHA_2_384; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("SHA-512")) { - return KeymasterDefs.KM_DIGEST_SHA_2_512; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("NONE")) { - return KeymasterDefs.KM_DIGEST_NONE; - } else if (jcaDigestAlgorithm.equalsIgnoreCase("MD5")) { - return KeymasterDefs.KM_DIGEST_MD5; - } else { - throw new IllegalArgumentException( - "Unsupported digest algorithm: " + jcaDigestAlgorithm); - } - } - - public static String getJcaDigestAlgorithmFromKeymasterDigest(int keymasterDigest) { - switch (keymasterDigest) { - case KeymasterDefs.KM_DIGEST_NONE: - return "NONE"; - case KeymasterDefs.KM_DIGEST_MD5: - return "MD5"; - case KeymasterDefs.KM_DIGEST_SHA1: - return "SHA-1"; - case KeymasterDefs.KM_DIGEST_SHA_2_224: - return "SHA-224"; - case KeymasterDefs.KM_DIGEST_SHA_2_256: - return "SHA-256"; - case KeymasterDefs.KM_DIGEST_SHA_2_384: - return "SHA-384"; - case KeymasterDefs.KM_DIGEST_SHA_2_512: - return "SHA-512"; - default: - throw new IllegalArgumentException( - "Unsupported digest algorithm: " + keymasterDigest); - } - } - - public static String[] getJcaDigestAlgorithmsFromKeymasterDigests( - Collection<Integer> keymasterDigests) { - if (keymasterDigests.isEmpty()) { - return EmptyArray.STRING; - } - String[] result = new String[keymasterDigests.size()]; - int offset = 0; - for (int keymasterDigest : keymasterDigests) { - result[offset] = getJcaDigestAlgorithmFromKeymasterDigest(keymasterDigest); - offset++; - } - return result; - } - - public static int[] getKeymasterDigestsFromJcaDigestAlgorithms(String[] jcaDigestAlgorithms) { - if ((jcaDigestAlgorithms == null) || (jcaDigestAlgorithms.length == 0)) { - return EmptyArray.INT; - } - int[] result = new int[jcaDigestAlgorithms.length]; - int offset = 0; - for (String jcaDigestAlgorithm : jcaDigestAlgorithms) { - result[offset] = getKeymasterDigestFromJcaDigestAlgorithm(jcaDigestAlgorithm); - offset++; - } - return result; - } - public static int getDigestOutputSizeBits(int keymasterDigest) { switch (keymasterDigest) { case KeymasterDefs.KM_DIGEST_NONE: @@ -200,60 +49,6 @@ public abstract class KeymasterUtils { } } - public static int getKeymasterBlockModeFromJcaBlockMode(String jcaBlockMode) { - if ("ECB".equalsIgnoreCase(jcaBlockMode)) { - return KeymasterDefs.KM_MODE_ECB; - } else if ("CBC".equalsIgnoreCase(jcaBlockMode)) { - return KeymasterDefs.KM_MODE_CBC; - } else if ("CTR".equalsIgnoreCase(jcaBlockMode)) { - return KeymasterDefs.KM_MODE_CTR; - } else if ("GCM".equalsIgnoreCase(jcaBlockMode)) { - return KeymasterDefs.KM_MODE_GCM; - } else { - throw new IllegalArgumentException("Unsupported block mode: " + jcaBlockMode); - } - } - - public static String getJcaBlockModeFromKeymasterBlockMode(int keymasterBlockMode) { - switch (keymasterBlockMode) { - case KeymasterDefs.KM_MODE_ECB: - return "ECB"; - case KeymasterDefs.KM_MODE_CBC: - return "CBC"; - case KeymasterDefs.KM_MODE_CTR: - return "CTR"; - case KeymasterDefs.KM_MODE_GCM: - return "GCM"; - default: - throw new IllegalArgumentException("Unsupported block mode: " + keymasterBlockMode); - } - } - - public static String[] getJcaBlockModesFromKeymasterBlockModes( - Collection<Integer> keymasterBlockModes) { - if ((keymasterBlockModes == null) || (keymasterBlockModes.isEmpty())) { - return EmptyArray.STRING; - } - String[] result = new String[keymasterBlockModes.size()]; - int offset = 0; - for (int keymasterBlockMode : keymasterBlockModes) { - result[offset] = getJcaBlockModeFromKeymasterBlockMode(keymasterBlockMode); - offset++; - } - return result; - } - - public static int[] getKeymasterBlockModesFromJcaBlockModes(String[] jcaBlockModes) { - if ((jcaBlockModes == null) || (jcaBlockModes.length == 0)) { - return EmptyArray.INT; - } - int[] result = new int[jcaBlockModes.length]; - for (int i = 0; i < jcaBlockModes.length; i++) { - result[i] = getKeymasterBlockModeFromJcaBlockMode(jcaBlockModes[i]); - } - return result; - } - public static boolean isKeymasterBlockModeIndCpaCompatible(int keymasterBlockMode) { switch (keymasterBlockMode) { case KeymasterDefs.KM_MODE_ECB: @@ -267,82 +62,6 @@ public abstract class KeymasterUtils { } } - public static int getKeymasterPaddingFromJcaEncryptionPadding(String jcaPadding) { - if ("NoPadding".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_NONE; - } else if ("PKCS7Padding".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_PKCS7; - } else if ("PKCS1Padding".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT; - } else if ("OEAPPadding".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_RSA_OAEP; - } else { - throw new IllegalArgumentException( - "Unsupported encryption padding scheme: " + jcaPadding); - } - } - - public static String getJcaEncryptionPaddingFromKeymasterPadding(int keymasterPadding) { - switch (keymasterPadding) { - case KeymasterDefs.KM_PAD_NONE: - return "NoPadding"; - case KeymasterDefs.KM_PAD_PKCS7: - return "PKCS7Padding"; - case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_ENCRYPT: - return "PKCS1Padding"; - case KeymasterDefs.KM_PAD_RSA_OAEP: - return "OEAPPadding"; - default: - throw new IllegalArgumentException( - "Unsupported encryption padding: " + keymasterPadding); - } - } - - public static int getKeymasterPaddingFromJcaSignaturePadding(String jcaPadding) { - if ("PKCS#1".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN; - } if ("PSS".equalsIgnoreCase(jcaPadding)) { - return KeymasterDefs.KM_PAD_RSA_PSS; - } else { - throw new IllegalArgumentException( - "Unsupported signature padding scheme: " + jcaPadding); - } - } - - public static String getJcaSignaturePaddingFromKeymasterPadding(int keymasterPadding) { - switch (keymasterPadding) { - case KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN: - return "PKCS#1"; - case KeymasterDefs.KM_PAD_RSA_PSS: - return "PSS"; - default: - throw new IllegalArgumentException( - "Unsupported signature padding: " + keymasterPadding); - } - } - - public static int[] getKeymasterPaddingsFromJcaEncryptionPaddings(String[] jcaPaddings) { - if ((jcaPaddings == null) || (jcaPaddings.length == 0)) { - return EmptyArray.INT; - } - int[] result = new int[jcaPaddings.length]; - for (int i = 0; i < jcaPaddings.length; i++) { - result[i] = getKeymasterPaddingFromJcaEncryptionPadding(jcaPaddings[i]); - } - return result; - } - - public static int[] getKeymasterPaddingsFromJcaSignaturePaddings(String[] jcaPaddings) { - if ((jcaPaddings == null) || (jcaPaddings.length == 0)) { - return EmptyArray.INT; - } - int[] result = new int[jcaPaddings.length]; - for (int i = 0; i < jcaPaddings.length; i++) { - result[i] = getKeymasterPaddingFromJcaSignaturePadding(jcaPaddings[i]); - } - return result; - } - /** * Adds keymaster arguments to express the key's authorization policy supported by user * authentication. diff --git a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java index 95d14b77fffd..9c2f3586e03f 100644 --- a/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java +++ b/keystore/tests/src/android/security/AndroidKeyPairGeneratorTest.java @@ -73,7 +73,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { } private void setupPassword() { - assertTrue(mAndroidKeyStore.password("1111")); + assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111")); assertTrue(mAndroidKeyStore.isUnlocked()); String[] aliases = mAndroidKeyStore.saw(""); @@ -288,7 +288,7 @@ public class AndroidKeyPairGeneratorTest extends AndroidTestCase { } catch (IllegalStateException expected) { } - assertTrue(mAndroidKeyStore.password("1111")); + assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111")); assertTrue(mAndroidKeyStore.isUnlocked()); final KeyPair pair2 = mGenerator.generateKeyPair(); diff --git a/keystore/tests/src/android/security/AndroidKeyStoreTest.java b/keystore/tests/src/android/security/AndroidKeyStoreTest.java index a7046dd29cec..4b2b9b5ac243 100644 --- a/keystore/tests/src/android/security/AndroidKeyStoreTest.java +++ b/keystore/tests/src/android/security/AndroidKeyStoreTest.java @@ -736,7 +736,7 @@ public class AndroidKeyStoreTest extends AndroidTestCase { } private void setupPassword() { - assertTrue(mAndroidKeyStore.password("1111")); + assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111")); assertTrue(mAndroidKeyStore.isUnlocked()); assertEquals(0, mAndroidKeyStore.saw("").length); @@ -2089,7 +2089,7 @@ public class AndroidKeyStoreTest extends AndroidTestCase { } catch (KeyStoreException success) { } - assertTrue(mAndroidKeyStore.password("1111")); + assertTrue(mAndroidKeyStore.onUserPasswordChanged("1111")); assertTrue(mAndroidKeyStore.isUnlocked()); mKeyStore.setEntry(TEST_ALIAS_1, entry, diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java index 916b1ba9ac46..d138c248e08d 100644 --- a/keystore/tests/src/android/security/KeyStoreTest.java +++ b/keystore/tests/src/android/security/KeyStoreTest.java @@ -152,13 +152,13 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testPassword() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state()); } public void testGet() throws Exception { assertNull(mKeyStore.get(TEST_KEYNAME)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertNull(mKeyStore.get(TEST_KEYNAME)); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -170,7 +170,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); assertFalse(mKeyStore.contains(TEST_KEYNAME)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME))); @@ -181,7 +181,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED)); assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED)); assertTrue(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID)); @@ -192,7 +192,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID, KeyStore.FLAG_ENCRYPTED)); assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID, KeyStore.FLAG_ENCRYPTED)); assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID)); @@ -202,7 +202,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertFalse(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); assertFalse(mKeyStore.contains(TEST_I18N_KEY)); - mKeyStore.password(TEST_I18N_KEY); + mKeyStore.onUserPasswordChanged(TEST_I18N_KEY); assertTrue(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); assertTrue(mKeyStore.contains(TEST_I18N_KEY)); @@ -210,7 +210,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testDelete() throws Exception { assertFalse(mKeyStore.delete(TEST_KEYNAME)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertFalse(mKeyStore.delete(TEST_KEYNAME)); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, @@ -222,7 +222,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testDelete_grantedUid_Wifi() throws Exception { assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.WIFI_UID)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.WIFI_UID)); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID, @@ -234,7 +234,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testDelete_ungrantedUid_Bluetooth() throws Exception { assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.BLUETOOTH_UID)); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertFalse(mKeyStore.delete(TEST_KEYNAME, Process.BLUETOOTH_UID)); assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID, @@ -247,7 +247,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testContains() throws Exception { assertFalse(mKeyStore.contains(TEST_KEYNAME)); - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.contains(TEST_KEYNAME)); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, @@ -258,7 +258,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testContains_grantedUid_Wifi() throws Exception { assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID)); - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.WIFI_UID)); assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.WIFI_UID, @@ -269,7 +269,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testContains_grantedUid_Bluetooth() throws Exception { assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID)); - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.contains(TEST_KEYNAME, Process.BLUETOOTH_UID)); assertFalse(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, Process.BLUETOOTH_UID, @@ -282,7 +282,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertNotNull(emptyResult); assertEquals(0, emptyResult.length); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED); mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED); @@ -296,7 +296,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { String[] results1 = mKeyStore.saw(TEST_KEYNAME, Process.BLUETOOTH_UID); assertEquals(0, results1.length); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED); mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED); @@ -309,7 +309,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertNotNull(results1); assertEquals(0, results1.length); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED); mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED); @@ -324,7 +324,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertNotNull(results1); assertEquals(0, results1.length); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE, Process.VPN_UID, KeyStore.FLAG_ENCRYPTED); mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE, Process.VPN_UID, KeyStore.FLAG_ENCRYPTED); @@ -337,7 +337,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testLock() throws Exception { assertFalse(mKeyStore.lock()); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state()); assertTrue(mKeyStore.lock()); @@ -345,7 +345,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testUnlock() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state()); mKeyStore.lock(); @@ -355,7 +355,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testIsEmpty() throws Exception { assertTrue(mKeyStore.isEmpty()); - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertTrue(mKeyStore.isEmpty()); mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED); assertFalse(mKeyStore.isEmpty()); @@ -370,7 +370,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGenerate_Locked_Fail() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); mKeyStore.lock(); assertFalse("Should fail when keystore is locked", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -378,7 +378,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGenerate_Success() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key when unlocked", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -388,7 +388,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGenerate_grantedUid_Wifi_Success() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key when unlocked", mKeyStore.generate(TEST_KEYNAME, Process.WIFI_UID, NativeConstants.EVP_PKEY_RSA, @@ -398,7 +398,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGenerate_ungrantedUid_Bluetooth_Failure() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.generate(TEST_KEYNAME, Process.BLUETOOTH_UID, NativeConstants.EVP_PKEY_RSA, RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null)); @@ -408,7 +408,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testImport_Success() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -417,7 +417,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testImport_grantedUid_Wifi_Success() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, Process.WIFI_UID, KeyStore.FLAG_ENCRYPTED)); @@ -426,7 +426,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testImport_ungrantedUid_Bluetooth_Failure() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, Process.BLUETOOTH_UID, KeyStore.FLAG_ENCRYPTED)); @@ -436,7 +436,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testImport_Failure_BadEncoding() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertFalse("Invalid DER-encoded key should not be imported", mKeyStore.importKey( TEST_KEYNAME, TEST_DATA, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -445,7 +445,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testSign_Success() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null)); @@ -456,7 +456,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testVerify_Success() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertTrue(mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, RSA_KEY_SIZE, KeyStore.FLAG_ENCRYPTED, null)); @@ -475,7 +475,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testSign_NotGenerated_Failure() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); assertNull("Should not be able to sign without first generating keys", mKeyStore.sign(TEST_KEYNAME, TEST_DATA)); @@ -483,7 +483,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testGrant_Generated_Success() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key for testcase", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -494,7 +494,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGrant_Imported_Success() throws Exception { - assertTrue("Password should work for keystore", mKeyStore.password(TEST_PASSWD)); + assertTrue("Password should work for keystore", mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -504,7 +504,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testGrant_NoKey_Failure() throws Exception { assertTrue("Should be able to unlock keystore for test", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse("Should not be able to grant without first initializing the keystore", mKeyStore.grant(TEST_KEYNAME, 0)); @@ -517,7 +517,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testUngrant_Generated_Success() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key for testcase", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -532,7 +532,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testUngrant_Imported_Success() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key for testcase", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -551,7 +551,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testUngrant_NoGrant_Failure() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key for testcase", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -563,7 +563,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testUngrant_DoubleUngrant_Failure() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key for testcase", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -581,7 +581,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testUngrant_DoubleGrantUngrant_Failure() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to generate key for testcase", mKeyStore.generate(TEST_KEYNAME, KeyStore.UID_SELF, NativeConstants.EVP_PKEY_RSA, @@ -601,7 +601,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testDuplicate_grantedUid_Wifi_Success() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.contains(TEST_KEYNAME)); @@ -640,7 +640,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testDuplicate_ungrantedUid_Bluetooth_Failure() throws Exception { - assertTrue(mKeyStore.password(TEST_PASSWD)); + assertTrue(mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertFalse(mKeyStore.contains(TEST_KEYNAME)); @@ -666,7 +666,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testGetmtime_Success() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -697,7 +697,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { public void testGetmtime_NonExist_Failure() throws Exception { assertTrue("Password should work for keystore", - mKeyStore.password(TEST_PASSWD)); + mKeyStore.onUserPasswordChanged(TEST_PASSWD)); assertTrue("Should be able to import key when unlocked", mKeyStore.importKey(TEST_KEYNAME, PRIVKEY_BYTES, KeyStore.UID_SELF, KeyStore.FLAG_ENCRYPTED)); @@ -752,7 +752,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { } public void testGetKeyCharacteristicsSuccess() throws Exception { - mKeyStore.password(TEST_PASSWD); + mKeyStore.onUserPasswordChanged(TEST_PASSWD); String name = "test"; KeyCharacteristics gen = generateRsaKey(name); KeyCharacteristics call = new KeyCharacteristics(); @@ -817,6 +817,9 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { KeymasterArguments out = new KeymasterArguments(); args = new KeymasterArguments(); + args.addInt(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES); + args.addInt(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_GCM); + args.addInt(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE); OperationResult result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT, true, args, null, out); IBinder token = result.token; @@ -881,14 +884,18 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { hexToBytes("591ccb10d410ed26dc5ba74a31362870"), hexToBytes("b6ed21b99ca6f4f9f153e7b1beafed1d"), hexToBytes("23304b7a39f9f3ff067d8d8f9e24ecc7")}; + KeymasterArguments beginArgs = new KeymasterArguments(); + beginArgs.addInt(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES); + beginArgs.addInt(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_ECB); + beginArgs.addInt(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE); for (int i = 0; i < testVectors.length; i++) { byte[] cipherText = doOperation(name, KeymasterDefs.KM_PURPOSE_ENCRYPT, testVectors[i], - new KeymasterArguments()); + beginArgs); MoreAsserts.assertEquals(cipherVectors[i], cipherText); } for (int i = 0; i < testVectors.length; i++) { byte[] plainText = doOperation(name, KeymasterDefs.KM_PURPOSE_DECRYPT, - cipherVectors[i], new KeymasterArguments()); + cipherVectors[i], beginArgs); MoreAsserts.assertEquals(testVectors[i], plainText); } } @@ -912,6 +919,9 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { KeymasterArguments out = new KeymasterArguments(); args = new KeymasterArguments(); + args.addInt(KeymasterDefs.KM_TAG_ALGORITHM, KeymasterDefs.KM_ALGORITHM_AES); + args.addInt(KeymasterDefs.KM_TAG_BLOCK_MODE, KeymasterDefs.KM_MODE_CTR); + args.addInt(KeymasterDefs.KM_TAG_PADDING, KeymasterDefs.KM_PAD_NONE); OperationResult result = mKeyStore.begin(name, KeymasterDefs.KM_PURPOSE_ENCRYPT, true, args, null, out); assertEquals("Begin should succeed", KeyStore.NO_ERROR, result.resultCode); @@ -950,4 +960,28 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> { assertEquals("Update should require authorization", KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED, result.resultCode); } + + public void testPasswordRemovalEncryptedEntry() throws Exception { + mKeyStore.onUserPasswordChanged("test"); + assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, + KeyStore.FLAG_ENCRYPTED)); + assertTrue(mKeyStore.contains(TEST_KEYNAME)); + assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME))); + mKeyStore.onUserPasswordChanged(""); + // Removing the password should have deleted all entries using FLAG_ENCRYPTED + assertNull(mKeyStore.get(TEST_KEYNAME)); + assertFalse(mKeyStore.contains(TEST_KEYNAME)); + } + + public void testPasswordRemovalUnencryptedEntry() throws Exception { + mKeyStore.onUserPasswordChanged("test"); + assertTrue(mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE, KeyStore.UID_SELF, + KeyStore.FLAG_NONE)); + assertTrue(mKeyStore.contains(TEST_KEYNAME)); + assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME))); + mKeyStore.onUserPasswordChanged(""); + // Removing the password should not delete unencrypted entries. + assertTrue(mKeyStore.contains(TEST_KEYNAME)); + assertTrue(Arrays.equals(TEST_KEYVALUE, mKeyStore.get(TEST_KEYNAME))); + } } diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 19a5bebfc14d..2ae7b0856e74 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -3336,6 +3336,30 @@ status_t ResTable::Theme::setTo(const Theme& other) return NO_ERROR; } +status_t ResTable::Theme::clear() +{ + if (kDebugTableTheme) { + ALOGI("Clearing theme %p...\n", this); + dumpToLog(); + } + + for (size_t i = 0; i < Res_MAXPACKAGE; i++) { + if (mPackages[i] != NULL) { + free_package(mPackages[i]); + mPackages[i] = NULL; + } + } + + mTypeSpecFlags = 0; + + if (kDebugTableTheme) { + ALOGI("Final theme:"); + dumpToLog(); + } + + return NO_ERROR; +} + ssize_t ResTable::Theme::getAttribute(uint32_t resID, Res_value* outValue, uint32_t* outTypeSpecFlags) const { diff --git a/libs/hwui/AssetAtlas.cpp b/libs/hwui/AssetAtlas.cpp index 882826ead10e..2889d2ff0b78 100644 --- a/libs/hwui/AssetAtlas.cpp +++ b/libs/hwui/AssetAtlas.cpp @@ -112,9 +112,6 @@ private: Texture* const mDelegate; }; // struct DelegateTexture -/** - * TODO: This method does not take the rotation flag into account - */ void AssetAtlas::createEntries(Caches& caches, int64_t* map, int count) { const float width = float(mTexture->width); const float height = float(mTexture->height); @@ -128,7 +125,6 @@ void AssetAtlas::createEntries(Caches& caches, int64_t* map, int count) { // pointers on 64 bit architectures. const int x = static_cast<int>(map[i++]); const int y = static_cast<int>(map[i++]); - bool rotated = map[i++] > 0; // Bitmaps should never be null, we're just extra paranoid if (!pixelRef) continue; @@ -142,7 +138,7 @@ void AssetAtlas::createEntries(Caches& caches, int64_t* map, int count) { texture->width = pixelRef->info().width(); texture->height = pixelRef->info().height(); - Entry* entry = new Entry(pixelRef, x, y, rotated, texture, mapper, *this); + Entry* entry = new Entry(pixelRef, texture, mapper, *this); texture->uvMapper = &entry->uvMapper; mEntries.add(entry->pixelRef, entry); diff --git a/libs/hwui/AssetAtlas.h b/libs/hwui/AssetAtlas.h index 17c5281cb3de..f1cd0b4947dc 100644 --- a/libs/hwui/AssetAtlas.h +++ b/libs/hwui/AssetAtlas.h @@ -45,8 +45,8 @@ class Image; class AssetAtlas { public: /** - * Entry representing the position and rotation of a - * bitmap inside the atlas. + * Entry representing the texture and uvMapper of a PixelRef in the + * atlas */ class Entry { public: @@ -78,30 +78,15 @@ public: SkPixelRef* pixelRef; /** - * Location of the bitmap inside the atlas, in pixels. - */ - int x; - int y; - - /** - * If set, the bitmap is rotated 90 degrees (clockwise) - * inside the atlas. - */ - bool rotated; - - /** * Atlas this entry belongs to. */ const AssetAtlas& atlas; - Entry(SkPixelRef* pixelRef, int x, int y, bool rotated, - Texture* texture, const UvMapper& mapper, const AssetAtlas& atlas) + Entry(SkPixelRef* pixelRef, Texture* texture, const UvMapper& mapper, + const AssetAtlas& atlas) : texture(texture) , uvMapper(mapper) , pixelRef(pixelRef) - , x(x) - , y(y) - , rotated(rotated) , atlas(atlas) { } @@ -120,8 +105,7 @@ public: * Initializes the atlas with the specified buffer and * map. The buffer is a gralloc'd texture that will be * used as an EGLImage. The map is a list of SkBitmap* - * and their (x, y) positions as well as their rotation - * flags. + * and their (x, y) positions * * This method returns immediately if the atlas is already * initialized. To re-initialize the atlas, you must diff --git a/libs/hwui/DisplayList.cpp b/libs/hwui/DisplayList.cpp index 4540bec77a9e..e679bff18c86 100644 --- a/libs/hwui/DisplayList.cpp +++ b/libs/hwui/DisplayList.cpp @@ -41,10 +41,6 @@ void DisplayListData::cleanupResources() { ResourceCache& resourceCache = ResourceCache::getInstance(); resourceCache.lock(); - for (size_t i = 0; i < bitmapResources.size(); i++) { - resourceCache.decrementRefcountLocked(bitmapResources.itemAt(i)); - } - for (size_t i = 0; i < patchResources.size(); i++) { resourceCache.decrementRefcountLocked(patchResources.itemAt(i)); } @@ -59,7 +55,6 @@ void DisplayListData::cleanupResources() { delete path; } - bitmapResources.clear(); patchResources.clear(); pathResources.clear(); paints.clear(); diff --git a/libs/hwui/DisplayListCanvas.h b/libs/hwui/DisplayListCanvas.h index 0064236a1a98..d997ef464863 100644 --- a/libs/hwui/DisplayListCanvas.h +++ b/libs/hwui/DisplayListCanvas.h @@ -350,9 +350,10 @@ private: // correctly, such as creating the bitmap from scratch, drawing with it, changing its // contents, and drawing again. The only fix would be to always copy it the first time, // which doesn't seem worth the extra cycles for this unlikely case. - const SkBitmap* cachedBitmap = mResourceCache.insert(bitmap); - mDisplayListData->bitmapResources.add(cachedBitmap); - return cachedBitmap; + SkBitmap* localBitmap = new (alloc()) SkBitmap(bitmap); + alloc().autoDestroy(localBitmap); + mDisplayListData->bitmapResources.push_back(localBitmap); + return localBitmap; } inline const Res_png_9patch* refPatch(const Res_png_9patch* patch) { diff --git a/libs/hwui/Properties.cpp b/libs/hwui/Properties.cpp index fd32b6f80dfa..723a177317fc 100644 --- a/libs/hwui/Properties.cpp +++ b/libs/hwui/Properties.cpp @@ -28,6 +28,8 @@ bool Properties::drawReorderDisabled = false; bool Properties::debugLayersUpdates = false; bool Properties::debugOverdraw = false; bool Properties::showDirtyRegions = false; +bool Properties::skipEmptyFrames = true; +bool Properties::swapBuffersWithDamage = false; DebugLevel Properties::debugLevel = kDebugDisabled; OverdrawColorSet Properties::overdrawColorSet = OverdrawColorSet::Default; @@ -101,6 +103,9 @@ bool Properties::load() { debugLevel = (DebugLevel) atoi(property); } + skipEmptyFrames = property_get_bool(PROPERTY_SKIP_EMPTY_DAMAGE, true); + swapBuffersWithDamage = property_get_bool(PROPERTY_SWAP_WITH_DAMAGE, false); + return (prevDebugLayersUpdates != debugLayersUpdates) || (prevDebugOverdraw != debugOverdraw) || (prevDebugStencilClip != debugStencilClip); diff --git a/libs/hwui/Properties.h b/libs/hwui/Properties.h index 46fa940bc76f..cb5560f132ea 100644 --- a/libs/hwui/Properties.h +++ b/libs/hwui/Properties.h @@ -158,6 +158,21 @@ enum DebugLevel { */ #define PROPERTY_DISABLE_DRAW_REORDER "debug.hwui.disable_draw_reorder" +/** + * Setting this property will enable or disable the dropping of frames with + * empty damage. Default is "true". + */ +#define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage" + +/** + * Setting this property will enable usage of EGL_KHR_swap_buffers_with_damage + * See: https://www.khronos.org/registry/egl/extensions/KHR/EGL_KHR_swap_buffers_with_damage.txt + * Default is "false" temporarily + * TODO: Change to "true", make sure to remove the log in EglManager::swapBuffers + * before changing this to default to true! + */ +#define PROPERTY_SWAP_WITH_DAMAGE "debug.hwui.swap_with_damage" + /////////////////////////////////////////////////////////////////////////////// // Runtime configuration properties /////////////////////////////////////////////////////////////////////////////// @@ -288,6 +303,10 @@ public: static bool debugLayersUpdates; static bool debugOverdraw; static bool showDirtyRegions; + // TODO: Remove after stabilization period + static bool skipEmptyFrames; + // TODO: Remove after stabilization period + static bool swapBuffersWithDamage; static DebugLevel debugLevel; static OverdrawColorSet overdrawColorSet; diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index 454fedc2b179..75d81346d62a 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -59,21 +59,6 @@ void ResourceCache::unlock() { mLock.unlock(); } -const SkBitmap* ResourceCache::insert(const SkBitmap& bitmapResource) { - Mutex::Autolock _l(mLock); - - BitmapKey bitmapKey(bitmapResource); - ssize_t index = mBitmapCache.indexOfKey(bitmapKey); - if (index == NAME_NOT_FOUND) { - SkBitmap* cachedBitmap = new SkBitmap(bitmapResource); - index = mBitmapCache.add(bitmapKey, cachedBitmap); - return cachedBitmap; - } - - mBitmapCache.keyAt(index).mRefCount++; - return mBitmapCache.valueAt(index); -} - void ResourceCache::incrementRefcount(void* resource, ResourceType resourceType) { Mutex::Autolock _l(mLock); incrementRefcountLocked(resource, resourceType); @@ -98,11 +83,6 @@ void ResourceCache::decrementRefcount(void* resource) { decrementRefcountLocked(resource); } -void ResourceCache::decrementRefcount(const SkBitmap* bitmapResource) { - Mutex::Autolock _l(mLock); - decrementRefcountLocked(bitmapResource); -} - void ResourceCache::decrementRefcount(const Res_png_9patch* patchResource) { decrementRefcount((void*) patchResource); } @@ -120,23 +100,6 @@ void ResourceCache::decrementRefcountLocked(void* resource) { } } -void ResourceCache::decrementRefcountLocked(const SkBitmap* bitmapResource) { - BitmapKey bitmapKey(*bitmapResource); - ssize_t index = mBitmapCache.indexOfKey(bitmapKey); - - LOG_ALWAYS_FATAL_IF(index == NAME_NOT_FOUND, - "Decrementing the reference of an untracked Bitmap"); - - const BitmapKey& cacheEntry = mBitmapCache.keyAt(index); - if (cacheEntry.mRefCount == 1) { - // delete the bitmap and remove it from the cache - delete mBitmapCache.valueAt(index); - mBitmapCache.removeItemsAt(index); - } else { - cacheEntry.mRefCount--; - } -} - void ResourceCache::decrementRefcountLocked(const Res_png_9patch* patchResource) { decrementRefcountLocked((void*) patchResource); } @@ -190,38 +153,5 @@ void ResourceCache::deleteResourceReferenceLocked(const void* resource, Resource delete ref; } -/////////////////////////////////////////////////////////////////////////////// -// Bitmap Key -/////////////////////////////////////////////////////////////////////////////// - -void BitmapKey::operator=(const BitmapKey& other) { - this->mRefCount = other.mRefCount; - this->mBitmapDimensions = other.mBitmapDimensions; - this->mPixelRefOrigin = other.mPixelRefOrigin; - this->mPixelRefStableID = other.mPixelRefStableID; -} - -bool BitmapKey::operator==(const BitmapKey& other) const { - return mPixelRefStableID == other.mPixelRefStableID && - mPixelRefOrigin == other.mPixelRefOrigin && - mBitmapDimensions == other.mBitmapDimensions; -} - -bool BitmapKey::operator<(const BitmapKey& other) const { - if (mPixelRefStableID != other.mPixelRefStableID) { - return mPixelRefStableID < other.mPixelRefStableID; - } - if (mPixelRefOrigin.x() != other.mPixelRefOrigin.x()) { - return mPixelRefOrigin.x() < other.mPixelRefOrigin.x(); - } - if (mPixelRefOrigin.y() != other.mPixelRefOrigin.y()) { - return mPixelRefOrigin.y() < other.mPixelRefOrigin.y(); - } - if (mBitmapDimensions.width() != other.mBitmapDimensions.width()) { - return mBitmapDimensions.width() < other.mBitmapDimensions.width(); - } - return mBitmapDimensions.height() < other.mBitmapDimensions.height(); -} - }; // namespace uirenderer }; // namespace android diff --git a/libs/hwui/ResourceCache.h b/libs/hwui/ResourceCache.h index 6c483faf3508..4583c8de87e8 100644 --- a/libs/hwui/ResourceCache.h +++ b/libs/hwui/ResourceCache.h @@ -51,37 +51,6 @@ public: ResourceType resourceType; }; -class BitmapKey { -public: - BitmapKey(const SkBitmap& bitmap) - : mRefCount(1) - , mBitmapDimensions(bitmap.dimensions()) - , mPixelRefOrigin(bitmap.pixelRefOrigin()) - , mPixelRefStableID(bitmap.pixelRef()->getStableID()) { } - - void operator=(const BitmapKey& other); - bool operator==(const BitmapKey& other) const; - bool operator<(const BitmapKey& other) const; - -private: - // This constructor is only used by the KeyedVector implementation - BitmapKey() - : mRefCount(-1) - , mBitmapDimensions(SkISize::Make(0,0)) - , mPixelRefOrigin(SkIPoint::Make(0,0)) - , mPixelRefStableID(0) { } - - // reference count of all HWUI object using this bitmap - mutable int mRefCount; - - SkISize mBitmapDimensions; - SkIPoint mPixelRefOrigin; - uint32_t mPixelRefStableID; - - friend class ResourceCache; - friend struct android::key_value_pair_t<BitmapKey, SkBitmap*>; -}; - class ANDROID_API ResourceCache: public Singleton<ResourceCache> { ResourceCache(); ~ResourceCache(); @@ -97,18 +66,10 @@ public: void lock(); void unlock(); - /** - * The cache stores a copy of the provided resource or refs an existing resource - * if the bitmap has previously been inserted and returns the cached copy. - */ - const SkBitmap* insert(const SkBitmap& resource); - void incrementRefcount(const Res_png_9patch* resource); - void decrementRefcount(const SkBitmap* resource); void decrementRefcount(const Res_png_9patch* resource); - void decrementRefcountLocked(const SkBitmap* resource); void decrementRefcountLocked(const Res_png_9patch* resource); void destructor(Res_png_9patch* resource); @@ -134,7 +95,6 @@ private: mutable Mutex mLock; KeyedVector<const void*, ResourceReference*>* mCache; - KeyedVector<BitmapKey, SkBitmap*> mBitmapCache; }; }; // namespace uirenderer diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 3de3086a2f86..733e5e08967a 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -16,36 +16,25 @@ #include "CanvasContext.h" +#include "AnimationContext.h" +#include "Caches.h" +#include "DeferredLayerUpdater.h" #include "EglManager.h" +#include "LayerRenderer.h" +#include "OpenGLRenderer.h" +#include "Properties.h" #include "RenderThread.h" -#include "../AnimationContext.h" -#include "../Caches.h" -#include "../DeferredLayerUpdater.h" -#include "../renderstate/RenderState.h" -#include "../renderstate/Stencil.h" -#include "../LayerRenderer.h" -#include "../OpenGLRenderer.h" +#include "renderstate/RenderState.h" +#include "renderstate/Stencil.h" #include <algorithm> +#include <strings.h> #include <cutils/properties.h> #include <private/hwui/DrawGlInfo.h> -#include <strings.h> #define TRIM_MEMORY_COMPLETE 80 #define TRIM_MEMORY_UI_HIDDEN 20 -#define PROPERTY_SKIP_EMPTY_DAMAGE "debug.hwui.skip_empty_damage" - -static bool sInitialized = false; -static bool sSkipEmptyDamage = true; - -static void initGlobals() { - if (sInitialized) return; - sInitialized = true; - sSkipEmptyDamage = property_get_bool(PROPERTY_SKIP_EMPTY_DAMAGE, - sSkipEmptyDamage); -} - namespace android { namespace uirenderer { namespace renderthread { @@ -58,9 +47,6 @@ CanvasContext::CanvasContext(RenderThread& thread, bool translucent, , mAnimationContext(contextFactory->createAnimationContext(mRenderThread.timeLord())) , mRootRenderNode(rootRenderNode) , mJankTracker(thread.timeLord().frameIntervalNanos()) { - // Done lazily at first draw instead of at library load to avoid - // running pre-zygote fork - initGlobals(); mRenderThread.renderState().registerCanvasContext(this); mProfiler.setDensity(mRenderThread.mainDisplayInfo().density); } @@ -106,8 +92,8 @@ void CanvasContext::setSurface(ANativeWindow* window) { } } -void CanvasContext::swapBuffers() { - if (CC_UNLIKELY(!mEglManager.swapBuffers(mEglSurface))) { +void CanvasContext::swapBuffers(const SkRect& dirty, EGLint width, EGLint height) { + if (CC_UNLIKELY(!mEglManager.swapBuffers(mEglSurface, dirty, width, height))) { setSurface(nullptr); } mHaveNewSurface = false; @@ -185,6 +171,7 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo) { } if (CC_UNLIKELY(!mNativeWindow.get())) { + mCurrentFrameInfo->addFlag(FrameInfoFlags::kSkippedFrame); info.out.canDrawThisFrame = false; return; } @@ -197,6 +184,10 @@ void CanvasContext::prepareTree(TreeInfo& info, int64_t* uiFrameInfo) { NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &runningBehind); info.out.canDrawThisFrame = !runningBehind; + if (!info.out.canDrawThisFrame) { + mCurrentFrameInfo->addFlag(FrameInfoFlags::kSkippedFrame); + } + if (info.out.hasAnimations || !info.out.canDrawThisFrame) { if (!info.out.requiresUiRedraw) { // If animationsNeedsRedraw is set don't bother posting for an RT anim @@ -222,7 +213,7 @@ void CanvasContext::draw() { SkRect dirty; mDamageAccumulator.finish(&dirty); - if (dirty.isEmpty() && sSkipEmptyDamage) { + if (dirty.isEmpty() && Properties::skipEmptyFrames) { mCurrentFrameInfo->addFlag(FrameInfoFlags::kSkippedFrame); return; } @@ -267,7 +258,7 @@ void CanvasContext::draw() { mCurrentFrameInfo->markSwapBuffers(); if (drew) { - swapBuffers(); + swapBuffers(dirty, width, height); } else { mEglManager.cancelFrame(); } @@ -298,8 +289,6 @@ void CanvasContext::doFrame() { prepareTree(info, frameInfo); if (info.out.canDrawThisFrame) { draw(); - } else { - mCurrentFrameInfo->addFlag(FrameInfoFlags::kSkippedFrame); } } diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index f5f1f549d37f..8163b0ff7102 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -29,6 +29,7 @@ #include <cutils/compiler.h> #include <EGL/egl.h> #include <SkBitmap.h> +#include <SkRect.h> #include <utils/Functor.h> #include <utils/Vector.h> @@ -117,7 +118,7 @@ private: friend class android::uirenderer::RenderState; void setSurface(ANativeWindow* window); - void swapBuffers(); + void swapBuffers(const SkRect& dirty, EGLint width, EGLint height); void requireSurface(); void requireGlContext(); diff --git a/libs/hwui/renderthread/EglManager.cpp b/libs/hwui/renderthread/EglManager.cpp index 3afca2f38f47..6255f5ef5b14 100644 --- a/libs/hwui/renderthread/EglManager.cpp +++ b/libs/hwui/renderthread/EglManager.cpp @@ -16,9 +16,10 @@ #include "EglManager.h" -#include "../Caches.h" -#include "../renderstate/RenderState.h" +#include "Caches.h" +#include "Properties.h" #include "RenderThread.h" +#include "renderstate/RenderState.h" #include <cutils/log.h> #include <cutils/properties.h> @@ -261,7 +262,8 @@ void EglManager::beginFrame(EGLSurface surface, EGLint* width, EGLint* height) { mInFrame = true; } -bool EglManager::swapBuffers(EGLSurface surface) { +bool EglManager::swapBuffers(EGLSurface surface, const SkRect& dirty, + EGLint width, EGLint height) { mInFrame = false; #if WAIT_FOR_GPU_COMPLETION @@ -271,7 +273,37 @@ bool EglManager::swapBuffers(EGLSurface surface) { } #endif +#ifdef EGL_KHR_swap_buffers_with_damage + if (CC_UNLIKELY(Properties::swapBuffersWithDamage)) { + SkIRect idirty; + dirty.roundOut(&idirty); + /* + * EGL_KHR_swap_buffers_with_damage spec states: + * + * The rectangles are specified relative to the bottom-left of the surface + * and the x and y components of each rectangle specify the bottom-left + * position of that rectangle. + * + * HWUI does everything with 0,0 being top-left, so need to map + * the rect + */ + EGLint y = height - (idirty.y() + idirty.height()); + // layout: {x, y, width, height} + EGLint rects[4] = { idirty.x(), y, idirty.width(), idirty.height() }; + EGLint numrects = dirty.isEmpty() ? 0 : 1; + // TODO: Remove prior to enabling this path by default + ALOGD("Swap buffers with damage %d: %d, %d, %d, %d (src=" + RECT_STRING ")", + dirty.isEmpty() ? 0 : 1, rects[0], rects[1], rects[2], rects[3], + SK_RECT_ARGS(dirty)); + eglSwapBuffersWithDamageKHR(mEglDisplay, surface, rects, numrects); + } else { + eglSwapBuffers(mEglDisplay, surface); + } +#else eglSwapBuffers(mEglDisplay, surface); +#endif + EGLint err = eglGetError(); if (CC_LIKELY(err == EGL_SUCCESS)) { return true; diff --git a/libs/hwui/renderthread/EglManager.h b/libs/hwui/renderthread/EglManager.h index b1a18a96a83a..08555168f7d8 100644 --- a/libs/hwui/renderthread/EglManager.h +++ b/libs/hwui/renderthread/EglManager.h @@ -18,6 +18,7 @@ #include <cutils/compiler.h> #include <EGL/egl.h> +#include <SkRect.h> #include <ui/GraphicBuffer.h> #include <utils/StrongPointer.h> @@ -47,7 +48,7 @@ public: // Returns true if the current surface changed, false if it was already current bool makeCurrent(EGLSurface surface); void beginFrame(EGLSurface surface, EGLint* width, EGLint* height); - bool swapBuffers(EGLSurface surface); + bool swapBuffers(EGLSurface surface, const SkRect& dirty, EGLint width, EGLint height); void cancelFrame(); // Returns true iff the surface is now preserving buffers. diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index c643e1d31d62..17e47b9b771f 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -353,7 +353,6 @@ CREATE_BRIDGE2(overrideProperty, const char* name, const char* value) { } void RenderProxy::overrideProperty(const char* name, const char* value) { - RenderThread& thread = RenderThread::getInstance(); SETUP_TASK(overrideProperty); args->name = name; args->value = value; diff --git a/libs/hwui/tests/main.cpp b/libs/hwui/tests/main.cpp index 9468d96fd7bf..2f79c5875e37 100644 --- a/libs/hwui/tests/main.cpp +++ b/libs/hwui/tests/main.cpp @@ -58,13 +58,20 @@ static void endRecording(DisplayListCanvas* renderer, RenderNode* node) { class TreeContentAnimation { public: virtual ~TreeContentAnimation() {} - virtual int getFrameCount() { return 150; } + int frameCount = 150; + virtual int getFrameCount() { return frameCount; } + virtual void setFrameCount(int fc) { + if (fc > 0) { + frameCount = fc; + } + } virtual void createContent(int width, int height, DisplayListCanvas* renderer) = 0; virtual void doFrame(int frameNr) = 0; template <class T> - static void run() { + static void run(int frameCount) { T animation; + animation.setFrameCount(frameCount); TestContext testContext; @@ -137,9 +144,10 @@ public: renderer->insertReorderBarrier(false); } void doFrame(int frameNr) override { + int curFrame = frameNr % 150; for (size_t ci = 0; ci < cards.size(); ci++) { - cards[ci]->mutateStagingProperties().setTranslationX(frameNr); - cards[ci]->mutateStagingProperties().setTranslationY(frameNr); + cards[ci]->mutateStagingProperties().setTranslationX(curFrame); + cards[ci]->mutateStagingProperties().setTranslationY(curFrame); cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); } } @@ -159,6 +167,47 @@ private: } }; +class ShadowGrid2Animation : public TreeContentAnimation { +public: + std::vector< sp<RenderNode> > cards; + void createContent(int width, int height, DisplayListCanvas* renderer) override { + renderer->drawColor(0xFFFFFFFF, SkXfermode::kSrcOver_Mode); + renderer->insertReorderBarrier(true); + + for (int x = dp(8); x < (width - dp(58)); x += dp(58)) { + for (int y = dp(8); y < (height - dp(58)); y += dp(58)) { + sp<RenderNode> card = createCard(x, y, dp(50), dp(50)); + renderer->drawRenderNode(card.get()); + cards.push_back(card); + } + } + + renderer->insertReorderBarrier(false); + } + void doFrame(int frameNr) override { + int curFrame = frameNr % 150; + for (size_t ci = 0; ci < cards.size(); ci++) { + cards[ci]->mutateStagingProperties().setTranslationX(curFrame); + cards[ci]->mutateStagingProperties().setTranslationY(curFrame); + cards[ci]->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); + } + } +private: + sp<RenderNode> createCard(int x, int y, int width, int height) { + sp<RenderNode> node = new RenderNode(); + node->mutateStagingProperties().setLeftTopRightBottom(x, y, x + width, y + height); + node->mutateStagingProperties().setElevation(dp(16)); + node->mutateStagingProperties().mutableOutline().setRoundRect(0, 0, width, height, dp(6), 1); + node->mutateStagingProperties().mutableOutline().setShouldClip(true); + node->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y | RenderNode::Z); + + DisplayListCanvas* renderer = startRecording(node.get()); + renderer->drawColor(0xFFEEEEEE, SkXfermode::kSrcOver_Mode); + endRecording(renderer, node.get()); + return node; + } +}; + class RectGridAnimation : public TreeContentAnimation { public: sp<RenderNode> card; @@ -172,8 +221,9 @@ public: renderer->insertReorderBarrier(false); } void doFrame(int frameNr) override { - card->mutateStagingProperties().setTranslationX(frameNr); - card->mutateStagingProperties().setTranslationY(frameNr); + int curFrame = frameNr % 150; + card->mutateStagingProperties().setTranslationX(curFrame); + card->mutateStagingProperties().setTranslationY(curFrame); card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); } private: @@ -220,8 +270,9 @@ public: } void doFrame(int frameNr) override { - card->mutateStagingProperties().setTranslationX(frameNr); - card->mutateStagingProperties().setTranslationY(frameNr); + int curFrame = frameNr % 150; + card->mutateStagingProperties().setTranslationX(curFrame); + card->mutateStagingProperties().setTranslationY(curFrame); card->setPropertyFieldsDirty(RenderNode::X | RenderNode::Y); } private: @@ -248,10 +299,11 @@ struct cstr_cmp { } }; -typedef void (*testProc)(); +typedef void (*testProc)(int); std::map<const char*, testProc, cstr_cmp> gTestMap { {"shadowgrid", TreeContentAnimation::run<ShadowGridAnimation>}, + {"shadowgrid2", TreeContentAnimation::run<ShadowGrid2Animation>}, {"rectgrid", TreeContentAnimation::run<RectGridAnimation> }, {"oval", TreeContentAnimation::run<OvalAnimation> }, }; @@ -271,11 +323,19 @@ int main(int argc, char* argv[]) { return 1; } } + int frameCount = 150; + if (argc > 3) { + frameCount = atoi(argv[3]); + if (frameCount < 1) { + printf("Invalid frame count!\n"); + return 1; + } + } if (loopCount < 0) { loopCount = INT_MAX; } for (int i = 0; i < loopCount; i++) { - proc(); + proc(frameCount); } printf("Success!\n"); return 0; diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java index d58b1d132a9f..566f8dc4ee50 100644 --- a/media/java/android/media/AudioDeviceInfo.java +++ b/media/java/android/media/AudioDeviceInfo.java @@ -21,7 +21,7 @@ import android.util.SparseIntArray; /** * Class to provide information about the audio devices. */ -public class AudioDeviceInfo { +public final class AudioDeviceInfo { /** * A device type associated with an unknown or uninitialized device. @@ -112,7 +112,6 @@ public class AudioDeviceInfo { } /** - * @hide * @return The internal device ID. */ public int getId() { @@ -122,15 +121,15 @@ public class AudioDeviceInfo { /** * @return The human-readable name of the audio device. */ - public String getName() { + public CharSequence getName() { return mPort.name(); } /** + * @hide * @return The "address" string of the device. This generally contains device-specific * parameters. */ - // TODO Is there a compelling reason to expose this? public String getAddress() { return mPort.address(); } @@ -157,15 +156,18 @@ public class AudioDeviceInfo { } /** - * @return An array of channel masks supported by the audio device (defined in - * AudioFormat.java). + * @return An array of channel masks ({@link AudioFormat#CHANNEL_IN_STEREO}, + * {@link AudioFormat#CHANNEL_OUT_7POINT1) for which this audio device can be configured. + * + * @see AudioFormat */ public int[] getChannelMasks() { return mPort.channelMasks(); } /** - * @return An array of channel counts supported by the audio device. + * @return An array of channel counts (1, 2, 4....) for which this audio device + * can be configured. */ public int[] getChannelCounts() { int[] masks = getChannelMasks(); @@ -179,8 +181,10 @@ public class AudioDeviceInfo { } /** - * @return An array of audio format IDs supported by the audio device (defined in - * AudioFormat.java) + * @return An array of audio format IDs (@link AudioFormat#ENCODING_PCM_16BIT, + * {@link AudioFormat#ENCODING_PCM_FLOAT}...) supported by the audio device. + * + * @see AudioFormat */ public int[] getFormats() { return mPort.formats(); diff --git a/media/java/android/media/AudioDevicesManager.java b/media/java/android/media/AudioDevicesManager.java deleted file mode 100644 index 8b83c17f9f3b..000000000000 --- a/media/java/android/media/AudioDevicesManager.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.media; - -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.util.ArrayMap; -import android.util.Pair; -import android.util.Slog; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.HashMap; -import java.util.Iterator; - -/** - * AudioDevicesManager implements the Android Media Audio device enumeration and notification - * functionality. This functionality is in two comlementary parts. - * <ol> - * <li>{@link AudioDevicesManager#listDevices(int)} gets the list of current audio devices - * </li> - * <li>{@link AudioDevicesManager#addOnAudioDeviceConnectionListener(OnAudioDeviceConnectionListener, android.os.Handler)} - * provides a mechanism for applications to be informed of audio device connect/disconnect events. - * </li> - * </ol> - */ -public class AudioDevicesManager { - - private static String TAG = "AudioDevicesManager"; - - private static boolean DEBUG = false; - - private AudioManager mAudioManager = null; - - private OnAmPortUpdateListener mPortListener = null; - - /** - * The message sent to apps when the contents of the device list changes if they provide - * a {#link Handler} object to addOnAudioDeviceConnectionListener(). - */ - private final static int MSG_DEVICES_LIST_CHANGE = 0; - - private ArrayMap<OnAudioDeviceConnectionListener, NativeEventHandlerDelegate> - mDeviceConnectionListeners = - new ArrayMap<OnAudioDeviceConnectionListener, NativeEventHandlerDelegate>(); - - /** - * @hide - * The AudioDevicesManager class is used to enumerate the physical audio devices connected - * to the system. See also {@link AudioDeviceInfo}. - */ - public AudioDevicesManager(Context context) { - mAudioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); - mPortListener = new OnAmPortUpdateListener(); - mAudioManager.registerAudioPortUpdateListener(mPortListener); - } - - /** - * Specifies to the {@link AudioDevicesManager#listDevices(int)} method to include - * source (i.e. input) audio devices. - */ - public static final int LIST_DEVICES_INPUTS = 0x0001; - - /** - * Specifies to the {@link AudioDevicesManager#listDevices(int)} method to include - * sink (i.e. output) audio devices. - */ - public static final int LIST_DEVICES_OUTPUTS = 0x0002; - - /** - * Specifies to the {@link AudioDevicesManager#listDevices(int)} method to include both - * source and sink devices. - */ - public static final int LIST_DEVICES_ALL = LIST_DEVICES_OUTPUTS | LIST_DEVICES_INPUTS; - - /** - * Determines if a given AudioDevicePort meets the specified filter criteria. - * @param port The port to test. - * @param flags A set of bitflags specifying the criteria to test. - * @see {@link LIST_DEVICES_OUTPUTS} and {@link LIST_DEVICES_INPUTS} - **/ - private static boolean checkFlags(AudioDevicePort port, int flags) { - return port.role() == AudioPort.ROLE_SINK && (flags & LIST_DEVICES_OUTPUTS) != 0 || - port.role() == AudioPort.ROLE_SOURCE && (flags & LIST_DEVICES_INPUTS) != 0; - } - - /** - * Generates a list of AudioDeviceInfo objects corresponding to the audio devices currently - * connected to the system and meeting the criteria specified in the <code>flags</code> - * parameter. - * @param flags A set of bitflags specifying the criteria to test. - * @see {@link LIST_DEVICES_OUTPUTS}, {@link LIST_DEVICES_INPUTS} and {@link LIST_DEVICES_ALL}. - * @return A (possibly zero-length) array of AudioDeviceInfo objects. - */ - public AudioDeviceInfo[] listDevices(int flags) { - return listDevicesStatic(flags); - } - - /** - * Generates a list of AudioDeviceInfo objects corresponding to the audio devices currently - * connected to the system and meeting the criteria specified in the <code>flags</code> - * parameter. - * @param flags A set of bitflags specifying the criteria to test. - * @see {@link LIST_DEVICES_OUTPUTS}, {@link LIST_DEVICES_INPUTS} and {@link LIST_DEVICES_ALL}. - * @return A (possibly zero-length) array of AudioDeviceInfo objects. - * @hide - */ - public static AudioDeviceInfo[] listDevicesStatic(int flags) { - ArrayList<AudioDevicePort> ports = new ArrayList<AudioDevicePort>(); - int status = AudioManager.listAudioDevicePorts(ports); - if (status != AudioManager.SUCCESS) { - // fail and bail! - return new AudioDeviceInfo[0]; - } - - // figure out how many AudioDeviceInfo we need space for - int numRecs = 0; - for (AudioDevicePort port : ports) { - if (checkFlags(port, flags)) { - numRecs++; - } - } - - // Now load them up - AudioDeviceInfo[] deviceList = new AudioDeviceInfo[numRecs]; - int slot = 0; - for (AudioDevicePort port : ports) { - if (checkFlags(port, flags)) { - deviceList[slot++] = new AudioDeviceInfo(port); - } - } - - return deviceList; - } - - /** - * Adds an {@link OnAudioDeviceConnectionListener} to receive notifications of changes - * to the set of connected audio devices. - */ - public void addOnAudioDeviceConnectionListener(OnAudioDeviceConnectionListener listener, - android.os.Handler handler) { - if (listener != null && !mDeviceConnectionListeners.containsKey(listener)) { - synchronized (mDeviceConnectionListeners) { - mDeviceConnectionListeners.put( - listener, new NativeEventHandlerDelegate(listener, handler)); - } - } - } - - /** - * Removes an {@link OnAudioDeviceConnectionListener} which has been previously registered - * to receive notifications of changes to the set of connected audio devices. - */ - public void removeOnAudioDeviceConnectionListener(OnAudioDeviceConnectionListener listener) { - synchronized (mDeviceConnectionListeners) { - if (mDeviceConnectionListeners.containsKey(listener)) { - mDeviceConnectionListeners.remove(listener); - } - } - } - - /** - * Sends device list change notification to all listeners. - */ - private void broadcastDeviceListChange() { - Collection<NativeEventHandlerDelegate> values; - synchronized (mDeviceConnectionListeners) { - values = mDeviceConnectionListeners.values(); - } - for(NativeEventHandlerDelegate delegate : values) { - Handler handler = delegate.getHandler(); - if (handler != null) { - handler.sendEmptyMessage(MSG_DEVICES_LIST_CHANGE); - } - } - } - - /** - * Handles Port list update notifications from the AudioManager - */ - private class OnAmPortUpdateListener implements AudioManager.OnAudioPortUpdateListener { - static final String TAG = "OnAmPortUpdateListener"; - public void onAudioPortListUpdate(AudioPort[] portList) { - broadcastDeviceListChange(); - } - - /** - * Callback method called upon audio patch list update. - * @param patchList the updated list of audio patches - */ - public void onAudioPatchListUpdate(AudioPatch[] patchList) { - if (DEBUG) { - Slog.d(TAG, "onAudioPatchListUpdate() " + patchList.length + " patches."); - } - } - - /** - * Callback method called when the mediaserver dies - */ - public void onServiceDied() { - if (DEBUG) { - Slog.i(TAG, "onServiceDied()"); - } - - broadcastDeviceListChange(); - } - } - - //--------------------------------------------------------- - // Inner classes - //-------------------- - /** - * Helper class to handle the forwarding of native events to the appropriate listener - * (potentially) handled in a different thread. - */ - private class NativeEventHandlerDelegate { - private final Handler mHandler; - - NativeEventHandlerDelegate(final OnAudioDeviceConnectionListener listener, - Handler handler) { - // find the looper for our new event handler - Looper looper; - if (handler != null) { - looper = handler.getLooper(); - } else { - // no given handler, use the looper the addListener call was called in - looper = Looper.getMainLooper(); - } - - // construct the event handler with this looper - if (looper != null) { - // implement the event handler delegate - mHandler = new Handler(looper) { - @Override - public void handleMessage(Message msg) { - switch(msg.what) { - case MSG_DEVICES_LIST_CHANGE: - // call the OnAudioDeviceConnectionListener - if (listener != null) { - listener.onAudioDeviceConnection(); - } - break; - default: - Slog.e(TAG, "Unknown native event type: " + msg.what); - break; - } - } - }; - } else { - mHandler = null; - } - } - - Handler getHandler() { - return mHandler; - } - } -} diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 19900d001683..cba83f93380f 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -42,10 +42,13 @@ import android.os.SystemProperties; import android.os.SystemClock; import android.os.ServiceManager; import android.provider.Settings; +import android.util.ArrayMap; import android.util.Log; +import android.util.Pair; import android.view.KeyEvent; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.Iterator; @@ -628,6 +631,9 @@ public class AudioManager { mUseFixedVolume = getContext().getResources().getBoolean( com.android.internal.R.bool.config_useFixedVolume); sAudioPortEventHandler.init(); + + mPortListener = new OnAmPortUpdateListener(); + registerAudioPortUpdateListener(mPortListener); } private Context getContext() { @@ -3402,7 +3408,17 @@ public class AudioManager { * @hide */ public static int listAudioPorts(ArrayList<AudioPort> ports) { - return updateAudioPortCache(ports, null); + return updateAudioPortCache(ports, null, null); + } + + /** + * Returns a list of descriptors for all audio ports managed by the audio framework as + * it was before the last update calback. + * @param ports An AudioPort ArrayList where the list will be returned. + * @hide + */ + public static int listPreviousAudioPorts(ArrayList<AudioPort> ports) { + return updateAudioPortCache(null, null, ports); } /** @@ -3411,20 +3427,45 @@ public class AudioManager { * @hide */ public static int listAudioDevicePorts(ArrayList<AudioDevicePort> devices) { + if (devices == null) { + return ERROR_BAD_VALUE; + } ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); - int status = updateAudioPortCache(ports, null); + int status = updateAudioPortCache(ports, null, null); if (status == SUCCESS) { - devices.clear(); - for (int i = 0; i < ports.size(); i++) { - if (ports.get(i) instanceof AudioDevicePort) { - devices.add((AudioDevicePort)ports.get(i)); - } - } + filterDevicePorts(ports, devices); } return status; } /** + * Specialized version of listPreviousAudioPorts() listing only audio devices (AudioDevicePort) + * @see listPreviousAudioPorts(ArrayList<AudioPort>) + * @hide + */ + public static int listPreviousAudioDevicePorts(ArrayList<AudioDevicePort> devices) { + if (devices == null) { + return ERROR_BAD_VALUE; + } + ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); + int status = updateAudioPortCache(null, null, ports); + if (status == SUCCESS) { + filterDevicePorts(ports, devices); + } + return status; + } + + private static void filterDevicePorts(ArrayList<AudioPort> ports, + ArrayList<AudioDevicePort> devices) { + devices.clear(); + for (int i = 0; i < ports.size(); i++) { + if (ports.get(i) instanceof AudioDevicePort) { + devices.add((AudioDevicePort)ports.get(i)); + } + } + } + + /** * Create a connection between two or more devices. The framework will reject the request if * device types are not compatible or the implementation does not support the requested * configuration. @@ -3474,7 +3515,7 @@ public class AudioManager { * @hide */ public static int listAudioPatches(ArrayList<AudioPatch> patches) { - return updateAudioPortCache(null, patches); + return updateAudioPortCache(null, patches, null); } /** @@ -3540,6 +3581,7 @@ public class AudioManager { static final int AUDIOPORT_GENERATION_INIT = 0; static Integer sAudioPortGeneration = new Integer(AUDIOPORT_GENERATION_INIT); static ArrayList<AudioPort> sAudioPortsCached = new ArrayList<AudioPort>(); + static ArrayList<AudioPort> sPreviousAudioPortsCached = new ArrayList<AudioPort>(); static ArrayList<AudioPatch> sAudioPatchesCached = new ArrayList<AudioPatch>(); static int resetAudioPortGeneration() { @@ -3551,7 +3593,8 @@ public class AudioManager { return generation; } - static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches) { + static int updateAudioPortCache(ArrayList<AudioPort> ports, ArrayList<AudioPatch> patches, + ArrayList<AudioPort> previousPorts) { synchronized (sAudioPortGeneration) { if (sAudioPortGeneration == AUDIOPORT_GENERATION_INIT) { @@ -3610,6 +3653,7 @@ public class AudioManager { } } + sPreviousAudioPortsCached = sAudioPortsCached; sAudioPortsCached = newPorts; sAudioPatchesCached = newPatches; sAudioPortGeneration = portGeneration[0]; @@ -3622,6 +3666,10 @@ public class AudioManager { patches.clear(); patches.addAll(sAudioPatchesCached); } + if (previousPorts != null) { + previousPorts.clear(); + previousPorts.addAll(sPreviousAudioPortsCached); + } } return SUCCESS; } @@ -3655,4 +3703,210 @@ public class AudioManager { portCfg.format(), gainCfg); } + + private OnAmPortUpdateListener mPortListener = null; + + /** + * The message sent to apps when the contents of the device list changes if they provide + * a {#link Handler} object to addOnAudioDeviceConnectionListener(). + */ + private final static int MSG_DEVICES_LIST_CHANGE = 0; + + private ArrayMap<OnAudioDeviceConnectionListener, NativeEventHandlerDelegate> + mDeviceConnectionListeners = + new ArrayMap<OnAudioDeviceConnectionListener, NativeEventHandlerDelegate>(); + + /** + * Specifies to the {@link AudioManager#getDevices(int)} method to include + * source (i.e. input) audio devices. + */ + public static final int GET_DEVICES_INPUTS = 0x0001; + + /** + * Specifies to the {@link AudioManager#getDevices(int)} method to include + * sink (i.e. output) audio devices. + */ + public static final int GET_DEVICES_OUTPUTS = 0x0002; + + /** + * Specifies to the {@link AudioManager#getDevices(int)} method to include both + * source and sink devices. + */ + public static final int GET_DEVICES_ALL = GET_DEVICES_OUTPUTS | GET_DEVICES_INPUTS; + + /** + * Determines if a given AudioDevicePort meets the specified filter criteria. + * @param port The port to test. + * @param flags A set of bitflags specifying the criteria to test. + * @see {@link GET_DEVICES_OUTPUTS} and {@link GET_DEVICES_INPUTS} + **/ + private static boolean checkFlags(AudioDevicePort port, int flags) { + return port.role() == AudioPort.ROLE_SINK && (flags & GET_DEVICES_OUTPUTS) != 0 || + port.role() == AudioPort.ROLE_SOURCE && (flags & GET_DEVICES_INPUTS) != 0; + } + + /** + * Generates a list of AudioDeviceInfo objects corresponding to the audio devices currently + * connected to the system and meeting the criteria specified in the <code>flags</code> + * parameter. + * @param flags A set of bitflags specifying the criteria to test. + * @see {@link GET_DEVICES_OUTPUTS}, {@link GET_DEVICES_INPUTS} and {@lGET_DEVICES_CES_ALL}. + * @return A (possibly zero-length) array of AudioDeviceInfo objects. + */ + public AudioDeviceInfo[] getDevices(int flags) { + return getDevicesStatic(flags); + } + + /** + * Generates a list of AudioDeviceInfo objects corresponding to the audio devices currently + * connected to the system and meeting the criteria specified in the <code>flags</code> + * parameter. + * @param flags A set of bitflags specifying the criteria to test. + * @see {@link GET_DEVICES_OUTPUTS}, {@link GET_DEVICES_INPUTS} and {@link GET_DEVICES_ALL}. + * @return A (possibly zero-length) array of AudioDeviceInfo objects. + * @hide + */ + public static AudioDeviceInfo[] getDevicesStatic(int flags) { + ArrayList<AudioDevicePort> ports = new ArrayList<AudioDevicePort>(); + int status = AudioManager.listAudioDevicePorts(ports); + if (status != AudioManager.SUCCESS) { + // fail and bail! + return new AudioDeviceInfo[0]; + } + + // figure out how many AudioDeviceInfo we need space for + int numRecs = 0; + for (AudioDevicePort port : ports) { + if (checkFlags(port, flags)) { + numRecs++; + } + } + + // Now load them up + AudioDeviceInfo[] deviceList = new AudioDeviceInfo[numRecs]; + int slot = 0; + for (AudioDevicePort port : ports) { + if (checkFlags(port, flags)) { + deviceList[slot++] = new AudioDeviceInfo(port); + } + } + + return deviceList; + } + + /** + * Adds an {@link OnAudioDeviceConnectionListener} to receive notifications of changes + * to the set of connected audio devices. + */ + public void addOnAudioDeviceConnectionListener(OnAudioDeviceConnectionListener listener, + android.os.Handler handler) { + if (listener != null && !mDeviceConnectionListeners.containsKey(listener)) { + synchronized (mDeviceConnectionListeners) { + mDeviceConnectionListeners.put( + listener, new NativeEventHandlerDelegate(listener, handler)); + } + } + } + + /** + * Removes an {@link OnAudioDeviceConnectionListener} which has been previously registered + * to receive notifications of changes to the set of connected audio devices. + */ + public void removeOnAudioDeviceConnectionListener(OnAudioDeviceConnectionListener listener) { + synchronized (mDeviceConnectionListeners) { + if (mDeviceConnectionListeners.containsKey(listener)) { + mDeviceConnectionListeners.remove(listener); + } + } + } + + /** + * Sends device list change notification to all listeners. + */ + private void broadcastDeviceListChange() { + Collection<NativeEventHandlerDelegate> values; + synchronized (mDeviceConnectionListeners) { + values = mDeviceConnectionListeners.values(); + } + for (NativeEventHandlerDelegate delegate : values) { + Handler handler = delegate.getHandler(); + if (handler != null) { + handler.sendEmptyMessage(MSG_DEVICES_LIST_CHANGE); + } + } + } + + /** + * Handles Port list update notifications from the AudioManager + */ + private class OnAmPortUpdateListener implements AudioManager.OnAudioPortUpdateListener { + static final String TAG = "OnAmPortUpdateListener"; + public void onAudioPortListUpdate(AudioPort[] portList) { + broadcastDeviceListChange(); + } + + /** + * Callback method called upon audio patch list update. + * @param patchList the updated list of audio patches + */ + public void onAudioPatchListUpdate(AudioPatch[] patchList) {} + + /** + * Callback method called when the mediaserver dies + */ + public void onServiceDied() { + broadcastDeviceListChange(); + } + } + + //--------------------------------------------------------- + // Inner classes + //-------------------- + /** + * Helper class to handle the forwarding of native events to the appropriate listener + * (potentially) handled in a different thread. + */ + private class NativeEventHandlerDelegate { + private final Handler mHandler; + + NativeEventHandlerDelegate(final OnAudioDeviceConnectionListener listener, + Handler handler) { + // find the looper for our new event handler + Looper looper; + if (handler != null) { + looper = handler.getLooper(); + } else { + // no given handler, use the looper the addListener call was called in + looper = Looper.getMainLooper(); + } + + // construct the event handler with this looper + if (looper != null) { + // implement the event handler delegate + mHandler = new Handler(looper) { + @Override + public void handleMessage(Message msg) { + switch(msg.what) { + case MSG_DEVICES_LIST_CHANGE: + // call the OnAudioDeviceConnectionListener + if (listener != null) { + listener.onAudioDeviceConnection(); + } + break; + default: + Log.e(TAG, "Unknown native event type: " + msg.what); + break; + } + } + }; + } else { + mHandler = null; + } + } + + Handler getHandler() { + return mHandler; + } + } + } diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java index c49e8c29aebd..c152245d4f9a 100644 --- a/media/java/android/media/AudioPortEventHandler.java +++ b/media/java/android/media/AudioPortEventHandler.java @@ -84,7 +84,7 @@ class AudioPortEventHandler { ArrayList<AudioPort> ports = new ArrayList<AudioPort>(); ArrayList<AudioPatch> patches = new ArrayList<AudioPatch>(); if (msg.what != AUDIOPORT_EVENT_SERVICE_DIED) { - int status = AudioManager.updateAudioPortCache(ports, patches); + int status = AudioManager.updateAudioPortCache(ports, patches, null); if (status != AudioManager.SUCCESS) { return; } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 11671d8f30b0..c0bc6d6caea1 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -246,8 +246,8 @@ public class AudioRecord * Though some invalid parameters will result in an {@link IllegalArgumentException} exception, * other errors do not. Thus you should call {@link #getState()} immediately after construction * to confirm that the object is usable. - * @param audioSource the recording source (also referred to as capture preset). - * See {@link MediaRecorder.AudioSource} for the capture preset definitions. + * @param audioSource the recording source. + * See {@link MediaRecorder.AudioSource} for the recording source definitions. * @param sampleRateInHz the sample rate expressed in Hertz. 44100Hz is currently the only * rate that is guaranteed to work on all devices, but other rates such as 22050, * 16000, and 11025 may work on some devices. @@ -285,8 +285,8 @@ public class AudioRecord * @hide * Class constructor with {@link AudioAttributes} and {@link AudioFormat}. * @param attributes a non-null {@link AudioAttributes} instance. Use - * {@link AudioAttributes.Builder#setCapturePreset(int)} for configuring the capture - * preset for this instance. + * {@link AudioAttributes.Builder#setAudioSource(int)} for configuring the audio + * source for this instance. * @param format a non-null {@link AudioFormat} instance describing the format of the data * that will be recorded through this AudioRecord. See {@link AudioFormat.Builder} for * configuring the audio format parameters such as encoding, channel mask and sample rate. @@ -394,14 +394,14 @@ public class AudioRecord /** * Builder class for {@link AudioRecord} objects. * Use this class to configure and create an <code>AudioRecord</code> instance. By setting the - * recording preset (a.k.a. recording source) and audio format parameters, you indicate which of - * those vary from the default behavior on the device. + * recording source and audio format parameters, you indicate which of + * those vary from the default behavior on the device. * <p> Here is an example where <code>Builder</code> is used to specify all {@link AudioFormat} * parameters, to be used by a new <code>AudioRecord</code> instance: * * <pre class="prettyprint"> * AudioRecord recorder = new AudioRecord.Builder() - * .setCapturePreset(MediaRecorder.AudioSource.VOICE_COMMUNICATION) + * .setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION) * .setAudioFormat(new AudioFormat.Builder() * .setEncoding(AudioFormat.ENCODING_PCM_16BIT) * .setSampleRate(32000) @@ -411,12 +411,13 @@ public class AudioRecord * .build(); * </pre> * <p> - * If the capture preset is not set with {@link #setCapturePreset(int)}, + * If the audio source is not set with {@link #setAudioSource(int)}, * {@link MediaRecorder.AudioSource#DEFAULT} is used. * <br>If the audio format is not specified or is incomplete, its sample rate will be the * default output sample rate of the device (see * {@link AudioManager#PROPERTY_OUTPUT_SAMPLE_RATE}), its channel configuration will be - * {@link AudioFormat#CHANNEL_IN_DEFAULT}. + * {@link AudioFormat#CHANNEL_IN_MONO}, and the encoding will be + * {@link AudioFormat#ENCODING_PCM_16BIT}. * <br>If the buffer size is not specified with {@link #setBufferSizeInBytes(int)}, * the minimum buffer size for the source is used. */ @@ -433,18 +434,18 @@ public class AudioRecord } /** - * @param preset the capture preset (also referred to as the recording source). - * See {@link MediaRecorder.AudioSource} for the supported capture preset definitions. + * @param source the audio source. + * See {@link MediaRecorder.AudioSource} for the supported audio source definitions. * @return the same Builder instance. * @throws IllegalArgumentException */ - public Builder setCapturePreset(int preset) throws IllegalArgumentException { - if ( (preset < MediaRecorder.AudioSource.DEFAULT) || - (preset > MediaRecorder.getAudioSourceMax()) ) { - throw new IllegalArgumentException("Invalid audio source " + preset); + public Builder setAudioSource(int source) throws IllegalArgumentException { + if ( (source < MediaRecorder.AudioSource.DEFAULT) || + (source > MediaRecorder.getAudioSourceMax()) ) { + throw new IllegalArgumentException("Invalid audio source " + source); } mAttributes = new AudioAttributes.Builder() - .setInternalCapturePreset(preset) + .setInternalCapturePreset(source) .build(); return this; } @@ -533,7 +534,22 @@ public class AudioRecord */ public AudioRecord build() throws UnsupportedOperationException { if (mFormat == null) { - mFormat = new AudioFormat.Builder().build(); + mFormat = new AudioFormat.Builder() + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .setChannelMask(AudioFormat.CHANNEL_IN_MONO) + .build(); + } else { + if (mFormat.getEncoding() == AudioFormat.ENCODING_INVALID) { + mFormat = new AudioFormat.Builder(mFormat) + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .build(); + } + if (mFormat.getChannelMask() == AudioFormat.CHANNEL_INVALID + && mFormat.getChannelIndexMask() == AudioFormat.CHANNEL_INVALID) { + mFormat = new AudioFormat.Builder(mFormat) + .setChannelMask(AudioFormat.CHANNEL_IN_MONO) + .build(); + } } if (mAttributes == null) { mAttributes = new AudioAttributes.Builder() @@ -1202,6 +1218,14 @@ public class AudioRecord //-------------------------------------------------------------------------- // (Re)Routing Info //-------------------- + public interface OnRoutingChangedListener { + /** + * Called when the routing of an AudioRecord changes from either and explicit or + * policy rerouting. + */ + public void onRoutingChanged(AudioRecord audioRecord); + } + /** * Returns an {@link AudioDeviceInfo} identifying the current routing of this AudioRecord. */ @@ -1211,7 +1235,7 @@ public class AudioRecord return null; } AudioDeviceInfo[] devices = - AudioDevicesManager.listDevicesStatic(AudioDevicesManager.LIST_DEVICES_INPUTS); + AudioManager.getDevicesStatic(AudioManager.GET_DEVICES_INPUTS); for (int i = 0; i < devices.length; i++) { if (devices[i].getId() == deviceId) { return devices[i]; @@ -1222,17 +1246,17 @@ public class AudioRecord /** * The message sent to apps when the routing of this AudioRecord changes if they provide - * a {#link Handler} object to addOnAudioRecordRoutingListener(). + * a {#link Handler} object to addOnRoutingChangeListener(). */ - private ArrayMap<OnAudioRecordRoutingListener, NativeRoutingEventHandlerDelegate> + private ArrayMap<OnRoutingChangedListener, NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = - new ArrayMap<OnAudioRecordRoutingListener, NativeRoutingEventHandlerDelegate>(); + new ArrayMap<OnRoutingChangedListener, NativeRoutingEventHandlerDelegate>(); /** - * Adds an {@link OnAudioRecordRoutingListener} to receive notifications of routing changes + * Adds an {@link OnRoutingChangedListener} to receive notifications of routing changes * on this AudioRecord. */ - public void addOnAudioRecordRoutingListener(OnAudioRecordRoutingListener listener, + public void addOnRoutingChangedListener(OnRoutingChangedListener listener, android.os.Handler handler) { if (listener != null && !mRoutingChangeListeners.containsKey(listener)) { synchronized (mRoutingChangeListeners) { @@ -1246,10 +1270,10 @@ public class AudioRecord } /** - * Removes an {@link OnAudioRecordRoutingListener} which has been previously added + * Removes an {@link OnRoutingChangedListener} which has been previously added * to receive notifications of changes to the set of connected audio devices. */ - public void removeOnAudioRecordRoutingListener(OnAudioRecordRoutingListener listener) { + public void removeOnRoutingChangedListener(OnRoutingChangedListener listener) { synchronized (mRoutingChangeListeners) { if (mRoutingChangeListeners.containsKey(listener)) { mRoutingChangeListeners.remove(listener); @@ -1268,7 +1292,7 @@ public class AudioRecord private final Handler mHandler; NativeRoutingEventHandlerDelegate(final AudioRecord record, - final OnAudioRecordRoutingListener listener, + final OnRoutingChangedListener listener, Handler handler) { // find the looper for our new event handler Looper looper; @@ -1291,7 +1315,7 @@ public class AudioRecord switch(msg.what) { case AudioSystem.NATIVE_EVENT_ROUTING_CHANGE: if (listener != null) { - listener.onAudioRecordRouting(record); + listener.onRoutingChanged(record); } break; default: @@ -1354,7 +1378,7 @@ public class AudioRecord * @return true if successful, false if the specified {@link AudioDeviceInfo} is non-null and * does not correspond to a valid audio input device. */ - public boolean setPreferredInputDevice(AudioDeviceInfo deviceInfo) { + public boolean setPreferredDevice(AudioDeviceInfo deviceInfo) { // Do some validation.... if (deviceInfo != null && !deviceInfo.isSource()) { return false; @@ -1371,10 +1395,10 @@ public class AudioRecord } /** - * Returns the selected input specified by {@link #setPreferredInputDevice}. Note that this + * Returns the selected input specified by {@link #setPreferredDevice}. Note that this * is not guarenteed to correspond to the actual device being used for recording. */ - public AudioDeviceInfo getPreferredInputDevice() { + public AudioDeviceInfo getPreferredDevice() { synchronized (this) { return mPreferredDevice; } diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index a66a1e5272c7..eda14a75eb09 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -908,13 +908,13 @@ public class AudioTrack } /** - * Returns the current playback settings. - * See {@link #setPlaybackSettings(PlaybackSettings)} to set playback settings - * @return current {@link PlaybackSettings}. + * Returns the current playback params. + * See {@link #setPlaybackParams(PlaybackParams)} to set playback params + * @return current {@link PlaybackParams}. * @throws IllegalStateException if track is not initialized. */ - public @NonNull PlaybackSettings getPlaybackSettings() { - return native_get_playback_settings(); + public @NonNull PlaybackParams getPlaybackParams() { + return native_get_playback_params(); } /** @@ -1294,7 +1294,7 @@ public class AudioTrack * playback to last twice as long, but will also result in a pitch shift down by one octave. * The valid sample rate range is from 1 Hz to twice the value returned by * {@link #getNativeOutputSampleRate(int)}. - * Use {@link #setPlaybackSettings(PlaybackSettings)} for speed control. + * Use {@link #setPlaybackParams(PlaybackParams)} for speed control. * @param sampleRateInHz the sample rate expressed in Hz * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE}, * {@link #ERROR_INVALID_OPERATION} @@ -1311,24 +1311,24 @@ public class AudioTrack /** - * Sets the playback settings. - * This method returns failure if it cannot apply the playback settings. + * Sets the playback params. + * This method returns failure if it cannot apply the playback params. * One possible cause is that the parameters for speed or pitch are out of range. * Another possible cause is that the <code>AudioTrack</code> is streaming * (see {@link #MODE_STREAM}) and the * buffer size is too small. For speeds greater than 1.0f, the <code>AudioTrack</code> buffer * on configuration must be larger than the speed multiplied by the minimum size * {@link #getMinBufferSize(int, int, int)}) to allow proper playback. - * @param settings see {@link PlaybackSettings}. In particular, + * @param params see {@link PlaybackParams}. In particular, * speed, pitch, and audio mode should be set. - * @throws IllegalArgumentException if the settings are invalid or not accepted. + * @throws IllegalArgumentException if the params are invalid or not accepted. * @throws IllegalStateException if track is not initialized. */ - public void setPlaybackSettings(@NonNull PlaybackSettings settings) { - if (settings == null) { - throw new IllegalArgumentException("settings is null"); + public void setPlaybackParams(@NonNull PlaybackParams params) { + if (params == null) { + throw new IllegalArgumentException("params is null"); } - native_set_playback_settings(settings); + native_set_playback_params(params); } @@ -2046,7 +2046,7 @@ public class AudioTrack * @return true if succesful, false if the specified {@link AudioDeviceInfo} is non-null and * does not correspond to a valid audio output device. */ - public boolean setPreferredOutputDevice(AudioDeviceInfo deviceInfo) { + public boolean setPreferredDevice(AudioDeviceInfo deviceInfo) { // Do some validation.... if (deviceInfo != null && !deviceInfo.isSink()) { return false; @@ -2062,10 +2062,10 @@ public class AudioTrack } /** - * Returns the selected output specified by {@link #setPreferredOutputDevice}. Note that this + * Returns the selected output specified by {@link #setPreferredDevice}. Note that this * is not guaranteed to correspond to the actual device being used for playback. */ - public AudioDeviceInfo getPreferredOutputDevice() { + public AudioDeviceInfo getPreferredDevice() { synchronized (this) { return mPreferredDevice; } @@ -2074,6 +2074,14 @@ public class AudioTrack //-------------------------------------------------------------------------- // (Re)Routing Info //-------------------- + public interface OnRoutingChangedListener { + /** + * Called when the routing of an AudioTrack changes from either and explicit or + * policy rerouting. + */ + public void onRoutingChanged(AudioTrack audioTrack); + } + /** * Returns an {@link AudioDeviceInfo} identifying the current routing of this AudioTrack. */ @@ -2083,7 +2091,7 @@ public class AudioTrack return null; } AudioDeviceInfo[] devices = - AudioDevicesManager.listDevicesStatic(AudioDevicesManager.LIST_DEVICES_OUTPUTS); + AudioManager.getDevicesStatic(AudioManager.GET_DEVICES_OUTPUTS); for (int i = 0; i < devices.length; i++) { if (devices[i].getId() == deviceId) { return devices[i]; @@ -2094,17 +2102,17 @@ public class AudioTrack /** * The message sent to apps when the routing of this AudioTrack changes if they provide - * a {#link Handler} object to addOnAudioTrackRoutingListener(). + * a {#link Handler} object to addOnRoutingChangedListener(). */ - private ArrayMap<OnAudioTrackRoutingListener, NativeRoutingEventHandlerDelegate> + private ArrayMap<OnRoutingChangedListener, NativeRoutingEventHandlerDelegate> mRoutingChangeListeners = - new ArrayMap<OnAudioTrackRoutingListener, NativeRoutingEventHandlerDelegate>(); + new ArrayMap<OnRoutingChangedListener, NativeRoutingEventHandlerDelegate>(); /** - * Adds an {@link OnAudioTrackRoutingListener} to receive notifications of routing changes + * Adds an {@link OnRoutingChangedListener} to receive notifications of routing changes * on this AudioTrack. */ - public void addOnAudioTrackRoutingListener(OnAudioTrackRoutingListener listener, + public void addOnRoutingChangedListener(OnRoutingChangedListener listener, android.os.Handler handler) { if (listener != null && !mRoutingChangeListeners.containsKey(listener)) { synchronized (mRoutingChangeListeners) { @@ -2118,10 +2126,10 @@ public class AudioTrack } /** - * Removes an {@link OnAudioTrackRoutingListener} which has been previously added + * Removes an {@link OnRoutingChangedListener} which has been previously added * to receive notifications of changes to the set of connected audio devices. */ - public void removeOnAudioTrackRoutingListener(OnAudioTrackRoutingListener listener) { + public void removeOnRoutingChangedListener(OnRoutingChangedListener listener) { synchronized (mRoutingChangeListeners) { if (mRoutingChangeListeners.containsKey(listener)) { mRoutingChangeListeners.remove(listener); @@ -2236,7 +2244,7 @@ public class AudioTrack private final Handler mHandler; NativeRoutingEventHandlerDelegate(final AudioTrack track, - final OnAudioTrackRoutingListener listener, + final OnRoutingChangedListener listener, Handler handler) { // find the looper for our new event handler Looper looper; @@ -2259,7 +2267,7 @@ public class AudioTrack switch(msg.what) { case AudioSystem.NATIVE_EVENT_ROUTING_CHANGE: if (listener != null) { - listener.onAudioTrackRouting(track); + listener.onRoutingChanged(track); } break; default: @@ -2353,8 +2361,8 @@ public class AudioTrack private native final int native_set_playback_rate(int sampleRateInHz); private native final int native_get_playback_rate(); - private native final void native_set_playback_settings(@NonNull PlaybackSettings settings); - private native final @NonNull PlaybackSettings native_get_playback_settings(); + private native final void native_set_playback_params(@NonNull PlaybackParams params); + private native final @NonNull PlaybackParams native_get_playback_params(); private native final int native_set_marker_pos(int marker); private native final int native_get_marker_pos(); diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 6f7b58348758..72198b66be91 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -816,10 +816,9 @@ final public class MediaCodec { * Thrown when an internal codec error occurs. */ public final static class CodecException extends IllegalStateException { - CodecException(int errorCode, int actionCode, @Nullable String detailMessage, int reason) { + CodecException(int errorCode, int actionCode, @Nullable String detailMessage) { super(detailMessage); mErrorCode = errorCode; - mReason = reason; mActionCode = actionCode; // TODO get this from codec @@ -847,21 +846,7 @@ final public class MediaCodec { } /** - * Retrieve the reason associated with a CodecException. - * The reason could be one of {@link #REASON_HARDWARE} or {@link #REASON_RECLAIMED}. - * - */ - @ReasonCode - public int getReason() { - return mReason; - } - - /** - * Retrieve the error code associated with a CodecException. - * This is opaque diagnostic information and may depend on - * hardware or API level. - * - * @hide + * Retrieve the error code associated with a CodecException */ public int getErrorCode() { return mErrorCode; @@ -878,22 +863,21 @@ final public class MediaCodec { } /** - * This indicates the exception is caused by the hardware. + * This indicates required resource was not able to be allocated. */ - public static final int REASON_HARDWARE = 0; + public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; /** - * This indicates the exception is because the resource manager reclaimed - * the media resource used by the codec. + * This indicates the resource manager reclaimed the media resource used by the codec. * <p> * With this exception, the codec must be released, as it has moved to terminal state. */ - public static final int REASON_RECLAIMED = 1; + public static final int ERROR_RECLAIMED = 1101; /** @hide */ @IntDef({ - REASON_HARDWARE, - REASON_RECLAIMED, + ERROR_INSUFFICIENT_RESOURCE, + ERROR_RECLAIMED, }) @Retention(RetentionPolicy.SOURCE) public @interface ReasonCode {} @@ -904,7 +888,6 @@ final public class MediaCodec { private final String mDiagnosticInfo; private final int mErrorCode; - private final int mReason; private final int mActionCode; } diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 6ec10c7f8510..aaafa553a439 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -47,12 +47,12 @@ import android.graphics.SurfaceTexture; import android.media.AudioManager; import android.media.MediaFormat; import android.media.MediaTimeProvider; -import android.media.PlaybackSettings; +import android.media.PlaybackParams; import android.media.SubtitleController; import android.media.SubtitleController.Anchor; import android.media.SubtitleData; import android.media.SubtitleTrack.RenderingWidget; -import android.media.SyncSettings; +import android.media.SyncParams; import com.android.internal.app.IAppOpsService; @@ -481,7 +481,7 @@ import java.lang.ref.WeakReference; * <td>{} </p></td> * <td>This method can be called in any state and calling it does not change * the object state. </p></td></tr> - * <tr><td>setPlaybackSettings</p></td> + * <tr><td>setPlaybackParams</p></td> * <td>any </p></td> * <td>{} </p></td> * <td>This method can be called in any state and calling it does not change @@ -1408,68 +1408,68 @@ public class MediaPlayer implements SubtitleController.Listener * @throws IllegalArgumentException if audioMode is not supported. */ public void setPlaybackRate(float rate, @PlaybackRateAudioMode int audioMode) { - PlaybackSettings settings = new PlaybackSettings(); - settings.allowDefaults(); + PlaybackParams params = new PlaybackParams(); + params.allowDefaults(); switch (audioMode) { case PLAYBACK_RATE_AUDIO_MODE_DEFAULT: - settings.setSpeed(rate).setPitch(1.0f); + params.setSpeed(rate).setPitch(1.0f); break; case PLAYBACK_RATE_AUDIO_MODE_STRETCH: - settings.setSpeed(rate).setPitch(1.0f) - .setAudioFallbackMode(settings.AUDIO_FALLBACK_MODE_FAIL); + params.setSpeed(rate).setPitch(1.0f) + .setAudioFallbackMode(params.AUDIO_FALLBACK_MODE_FAIL); break; case PLAYBACK_RATE_AUDIO_MODE_RESAMPLE: - settings.setSpeed(rate).setPitch(rate); + params.setSpeed(rate).setPitch(rate); break; default: final String msg = "Audio playback mode " + audioMode + " is not supported"; throw new IllegalArgumentException(msg); } - setPlaybackSettings(settings); + setPlaybackParams(params); } /** - * Sets playback rate using {@link PlaybackSettings}. + * Sets playback rate using {@link PlaybackParams}. * - * @param settings the playback settings. + * @param params the playback params. * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings is not supported. + * @throws IllegalArgumentException if params is not supported. */ - public native void setPlaybackSettings(@NonNull PlaybackSettings settings); + public native void setPlaybackParams(@NonNull PlaybackParams params); /** - * Gets the playback settings, containing the current playback rate. + * Gets the playback params, containing the current playback rate. * - * @return the playback settings. + * @return the playback params. * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native PlaybackSettings getPlaybackSettings(); + public native PlaybackParams getPlaybackParams(); /** * Sets A/V sync mode. * - * @param settings the A/V sync settings to apply + * @param params the A/V sync params to apply * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings are not supported. + * @throws IllegalArgumentException if params are not supported. */ - public native void setSyncSettings(@NonNull SyncSettings settings); + public native void setSyncParams(@NonNull SyncParams params); /** * Gets the A/V sync mode. * - * @return the A/V sync settings + * @return the A/V sync params * * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native SyncSettings getSyncSettings(); + public native SyncParams getSyncParams(); /** * Seeks to specified time position. @@ -1507,7 +1507,7 @@ public class MediaPlayer implements SubtitleController.Listener return new MediaTimestamp( getCurrentPosition() * 1000L, System.nanoTime(), - isPlaying() ? getPlaybackSettings().getSpeed() : 0.f); + isPlaying() ? getPlaybackParams().getSpeed() : 0.f); } catch (IllegalStateException e) { return null; } @@ -2824,6 +2824,13 @@ public class MediaPlayer implements SubtitleController.Listener mSubtitleController.selectDefaultTrack(); } break; + case MEDIA_INFO_BUFFERING_START: + case MEDIA_INFO_BUFFERING_END: + TimeProvider timeProvider = mTimeProvider; + if (timeProvider != null) { + timeProvider.onBuffering(msg.arg1 == MEDIA_INFO_BUFFERING_START); + } + break; } if (mOnInfoListener != null) { @@ -3362,6 +3369,7 @@ public class MediaPlayer implements SubtitleController.Listener private MediaPlayer mPlayer; private boolean mPaused = true; private boolean mStopped = true; + private boolean mBuffering; private long mLastReportedTime; private long mTimeAdjustment; // since we are expecting only a handful listeners per stream, there is @@ -3455,12 +3463,22 @@ public class MediaPlayer implements SubtitleController.Listener } /** @hide */ + public void onBuffering(boolean buffering) { + synchronized (this) { + if (DEBUG) Log.d(TAG, "onBuffering: " + buffering); + mBuffering = buffering; + scheduleNotification(REFRESH_AND_NOTIFY_TIME, 0 /* delay */); + } + } + + /** @hide */ public void onStopped() { synchronized(this) { if (DEBUG) Log.d(TAG, "onStopped"); mPaused = true; mStopped = true; mSeeking = false; + mBuffering = false; scheduleNotification(NOTIFY_STOP, 0 /* delay */); } } @@ -3481,6 +3499,7 @@ public class MediaPlayer implements SubtitleController.Listener synchronized(this) { mStopped = false; mSeeking = true; + mBuffering = false; scheduleNotification(NOTIFY_SEEK, 0 /* delay */); } } @@ -3683,7 +3702,7 @@ public class MediaPlayer implements SubtitleController.Listener nanoTime >= mLastNanoTime + MAX_NS_WITHOUT_POSITION_CHECK) { try { mLastTimeUs = mPlayer.getCurrentPosition() * 1000L; - mPaused = !mPlayer.isPlaying(); + mPaused = !mPlayer.isPlaying() || mBuffering; if (DEBUG) Log.v(TAG, (mPaused ? "paused" : "playing") + " at " + mLastTimeUs); } catch (IllegalStateException e) { if (mPausing) { diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java index 206c171cb66a..f27e63561e84 100644 --- a/media/java/android/media/MediaRecorder.java +++ b/media/java/android/media/MediaRecorder.java @@ -185,9 +185,9 @@ public class MediaRecorder /** * Defines the audio source. * An audio source defines both a default physical source of audio signal, and a recording - * configuration; it's also known as a capture preset. These constants are for instance used + * configuration. These constants are for instance used * in {@link MediaRecorder#setAudioSource(int)} or - * {@link AudioRecord.Builder#setCapturePreset(int)}. + * {@link AudioRecord.Builder#setAudioSource(int)}. */ public final class AudioSource { diff --git a/media/java/android/media/MediaSync.java b/media/java/android/media/MediaSync.java index a5b0d3911ec1..b7ef95c89295 100644 --- a/media/java/android/media/MediaSync.java +++ b/media/java/android/media/MediaSync.java @@ -20,7 +20,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.media.AudioTrack; -import android.media.PlaybackSettings; +import android.media.PlaybackParams; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -62,7 +62,7 @@ import java.util.List; * // videoDecoder.releaseOutputBuffer(videoOutputBufferIx, videoPresentationTimeNs); * // More details are available as below. * ... - * sync.queueAudio(audioByteBuffer, bufferIndex, size, audioPresentationTimeUs); // non-blocking. + * sync.queueAudio(audioByteBuffer, bufferIndex, audioPresentationTimeUs); // non-blocking. * // The audioByteBuffer and bufferIndex will be returned via callback. * // More details are available as below. * ... @@ -112,7 +112,7 @@ import java.util.List; * initial underrun. * <p> */ -final public class MediaSync { +public final class MediaSync { /** * MediaSync callback interface. Used to notify the user asynchronously * of various MediaSync events. @@ -170,14 +170,12 @@ final public class MediaSync { private static class AudioBuffer { public ByteBuffer mByteBuffer; public int mBufferIndex; - public int mSizeInBytes; long mPresentationTimeUs; public AudioBuffer(@NonNull ByteBuffer byteBuffer, int bufferIndex, - int sizeInBytes, long presentationTimeUs) { + long presentationTimeUs) { mByteBuffer = byteBuffer; mBufferIndex = bufferIndex; - mSizeInBytes = sizeInBytes; mPresentationTimeUs = presentationTimeUs; } } @@ -413,18 +411,18 @@ final public class MediaSync { * @throws IllegalArgumentException if audioMode is not supported. */ public void setPlaybackRate(float rate, @PlaybackRateAudioMode int audioMode) { - PlaybackSettings rateSettings = new PlaybackSettings(); - rateSettings.allowDefaults(); + PlaybackParams rateParams = new PlaybackParams(); + rateParams.allowDefaults(); switch (audioMode) { case PLAYBACK_RATE_AUDIO_MODE_DEFAULT: - rateSettings.setSpeed(rate).setPitch(1.0f); + rateParams.setSpeed(rate).setPitch(1.0f); break; case PLAYBACK_RATE_AUDIO_MODE_STRETCH: - rateSettings.setSpeed(rate).setPitch(1.0f) - .setAudioFallbackMode(rateSettings.AUDIO_FALLBACK_MODE_FAIL); + rateParams.setSpeed(rate).setPitch(1.0f) + .setAudioFallbackMode(rateParams.AUDIO_FALLBACK_MODE_FAIL); break; case PLAYBACK_RATE_AUDIO_MODE_RESAMPLE: - rateSettings.setSpeed(rate).setPitch(rate); + rateParams.setSpeed(rate).setPitch(rate); break; default: { @@ -432,19 +430,19 @@ final public class MediaSync { throw new IllegalArgumentException(msg); } } - setPlaybackSettings(rateSettings); + setPlaybackParams(rateParams); } /** - * Sets playback rate using {@link PlaybackSettings}. + * Sets playback rate using {@link PlaybackParams}. * <p> - * When using MediaSync with {@link AudioTrack}, set playback settings using this + * When using MediaSync with {@link AudioTrack}, set playback params using this * call instead of calling it directly on the track, so that the sync is aware of - * the settings change. + * the params change. * <p> * This call also works if there is no audio track. * - * @param settings the playback settings to use. {@link PlaybackSettings#getSpeed + * @param params the playback params to use. {@link PlaybackParams#getSpeed * Speed} is the ratio between desired playback rate and normal one. 1.0 means * normal playback speed. 0.0 means pause. Value larger than 1.0 means faster playback, * while value between 0.0 and 1.0 for slower playback. <b>Note:</b> the normal rate @@ -453,11 +451,11 @@ final public class MediaSync { * * @throws IllegalStateException if the internal sync engine or the audio track has not * been initialized. - * @throws IllegalArgumentException if the settings are not supported. + * @throws IllegalArgumentException if the params are not supported. */ - public void setPlaybackSettings(@NonNull PlaybackSettings settings) { + public void setPlaybackParams(@NonNull PlaybackParams params) { synchronized(mAudioLock) { - mPlaybackRate = native_setPlaybackSettings(settings);; + mPlaybackRate = native_setPlaybackParams(params);; } if (mPlaybackRate != 0.0 && mAudioThread != null) { postRenderAudio(0); @@ -465,7 +463,7 @@ final public class MediaSync { } /** - * Gets the playback rate using {@link PlaybackSettings}. + * Gets the playback rate using {@link PlaybackParams}. * * @return the playback rate being used. * @@ -473,40 +471,40 @@ final public class MediaSync { * been initialized. */ @NonNull - public native PlaybackSettings getPlaybackSettings(); + public native PlaybackParams getPlaybackParams(); - private native float native_setPlaybackSettings(@NonNull PlaybackSettings settings); + private native float native_setPlaybackParams(@NonNull PlaybackParams params); /** * Sets A/V sync mode. * - * @param settings the A/V sync settings to apply + * @param params the A/V sync params to apply * * @throws IllegalStateException if the internal player engine has not been * initialized. - * @throws IllegalArgumentException if settings are not supported. + * @throws IllegalArgumentException if params are not supported. */ - public void setSyncSettings(@NonNull SyncSettings settings) { + public void setSyncParams(@NonNull SyncParams params) { synchronized(mAudioLock) { - mPlaybackRate = native_setSyncSettings(settings);; + mPlaybackRate = native_setSyncParams(params);; } if (mPlaybackRate != 0.0 && mAudioThread != null) { postRenderAudio(0); } } - private native float native_setSyncSettings(@NonNull SyncSettings settings); + private native float native_setSyncParams(@NonNull SyncParams params); /** * Gets the A/V sync mode. * - * @return the A/V sync settings + * @return the A/V sync params * * @throws IllegalStateException if the internal player engine has not been * initialized. */ @NonNull - public native SyncSettings getSyncSettings(); + public native SyncParams getSyncParams(); /** * Flushes all buffers from the sync object. @@ -567,23 +565,20 @@ final public class MediaSync { * to the client via registered callback. * @param bufferIndex the buffer index used to identify audioData. It will be returned to * the client along with audioData. This helps applications to keep track of audioData. - * @param sizeInBytes number of bytes to queue. * @param presentationTimeUs the presentation timestamp in microseconds for the first frame * in the buffer. * @throws IllegalStateException if audio track is not set or internal configureation * has not been done correctly. */ public void queueAudio( - @NonNull ByteBuffer audioData, int bufferIndex, int sizeInBytes, - long presentationTimeUs) { + @NonNull ByteBuffer audioData, int bufferIndex, long presentationTimeUs) { if (mAudioTrack == null || mAudioThread == null) { throw new IllegalStateException( "AudioTrack is NOT set or audio thread is not created"); } synchronized(mAudioLock) { - mAudioBuffers.add(new AudioBuffer( - audioData, bufferIndex, sizeInBytes, presentationTimeUs)); + mAudioBuffers.add(new AudioBuffer(audioData, bufferIndex, presentationTimeUs)); } if (mPlaybackRate != 0.0) { @@ -605,18 +600,19 @@ final public class MediaSync { } AudioBuffer audioBuffer = mAudioBuffers.get(0); + int size = audioBuffer.mByteBuffer.remaining(); int sizeWritten = mAudioTrack.write( audioBuffer.mByteBuffer, - audioBuffer.mSizeInBytes, + size, AudioTrack.WRITE_NON_BLOCKING); if (sizeWritten > 0) { if (audioBuffer.mPresentationTimeUs != -1) { native_updateQueuedAudioData( - audioBuffer.mSizeInBytes, audioBuffer.mPresentationTimeUs); + size, audioBuffer.mPresentationTimeUs); audioBuffer.mPresentationTimeUs = -1; } - if (sizeWritten == audioBuffer.mSizeInBytes) { + if (sizeWritten == size) { postReturnByteBuffer(audioBuffer); mAudioBuffers.remove(0); if (!mAudioBuffers.isEmpty()) { @@ -624,8 +620,6 @@ final public class MediaSync { } return; } - - audioBuffer.mSizeInBytes -= sizeWritten; } long pendingTimeMs = TimeUnit.MICROSECONDS.toMillis( native_getPlayTimeForPendingAudioFrames()); diff --git a/media/java/android/media/OnAudioDeviceConnectionListener.java b/media/java/android/media/OnAudioDeviceConnectionListener.java index 71c135a54731..57e9e170af7c 100644 --- a/media/java/android/media/OnAudioDeviceConnectionListener.java +++ b/media/java/android/media/OnAudioDeviceConnectionListener.java @@ -18,13 +18,13 @@ package android.media; /** * OnAudioDeviceConnectionListener defines the interface for notification listeners in the - * {@link AudioDevicesManager} + * {@link AudioManager} */ public interface OnAudioDeviceConnectionListener { /** - * Called by the {@link AudioDevicesManager} to indicate that an audio device has been + * Called by the {@link AudioManager} to indicate that an audio device has been * connected or disconnected. A listener will probably call the - * {@link AudioDevicesManager#listDevices} method to retrieve the current list of audio + * {@link AudioManager#getDevices} method to retrieve the current list of audio * devices. */ public void onAudioDeviceConnection(); diff --git a/media/java/android/media/OnAudioRecordRoutingListener.java b/media/java/android/media/OnAudioRecordRoutingListener.java deleted file mode 100644 index 8ff41c56fa93..000000000000 --- a/media/java/android/media/OnAudioRecordRoutingListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.media; - -/** - * OnAudioDeviceConnectionListener defines the interface for notification listeners in the - * {@link AudioDevicesManager} - */ -public interface OnAudioRecordRoutingListener { - /** - * Called when the routing of an AudioRecord changes from either and explicit or - * policy rerouting. - */ - public void onAudioRecordRouting(AudioRecord audioRecord); -} diff --git a/media/java/android/media/OnAudioTrackRoutingListener.java b/media/java/android/media/OnAudioTrackRoutingListener.java deleted file mode 100644 index 18c72ef7377b..000000000000 --- a/media/java/android/media/OnAudioTrackRoutingListener.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package android.media; - -/** - * OnAudioDeviceConnectionListener defines the interface for notification listeners in the - * {@link AudioDevicesManager} - */ -public interface OnAudioTrackRoutingListener { - /** - * Called when the routing of an AudioTrack changes from either and explicit or - * policy rerouting. - */ - public void onAudioTrackRouting(AudioTrack audioTrack); -} diff --git a/media/java/android/media/PlaybackSettings.java b/media/java/android/media/PlaybackParams.java index b2e1033a44c4..e41b2b67e905 100644 --- a/media/java/android/media/PlaybackSettings.java +++ b/media/java/android/media/PlaybackParams.java @@ -22,21 +22,21 @@ import java.lang.annotation.RetentionPolicy; import android.annotation.IntDef; /** - * Structure for common playback settings. + * Structure for common playback params. * - * Used by {@link AudioTrack} {@link AudioTrack#getPlaybackSettings()} and - * {@link AudioTrack#setPlaybackSettings(PlaybackSettings)} + * Used by {@link AudioTrack} {@link AudioTrack#getPlaybackParams()} and + * {@link AudioTrack#setPlaybackParams(PlaybackParams)} * to control playback behavior. * <p> <strong>audio fallback mode:</strong> * select out-of-range parameter handling. * <ul> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_DEFAULT}: + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_DEFAULT}: * System will determine best handling. </li> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_MUTE}: - * Play silence for settings normally out of range.</li> - * <li> {@link PlaybackSettings#AUDIO_FALLBACK_MODE_FAIL}: + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_MUTE}: + * Play silence for params normally out of range.</li> + * <li> {@link PlaybackParams#AUDIO_FALLBACK_MODE_FAIL}: * Return {@link java.lang.IllegalArgumentException} from - * <code>AudioTrack.setPlaybackSettings(PlaybackSettings)</code>.</li> + * <code>AudioTrack.setPlaybackParams(PlaybackParams)</code>.</li> * </ul> * <p> <strong>pitch:</strong> increases or decreases the tonal frequency of the audio content. * It is expressed as a multiplicative factor, where normal pitch is 1.0f. @@ -52,7 +52,7 @@ import android.annotation.IntDef; * similar to {@link AudioTrack#setPlaybackRate(int)}.</li> * </ul> */ -public final class PlaybackSettings { +public final class PlaybackParams { /** @hide */ @IntDef( value = { @@ -81,14 +81,14 @@ public final class PlaybackSettings { /** @hide */ public static final int AUDIO_STRETCH_MODE_VOICE = 1; - // flags to indicate which settings are actually set + // flags to indicate which params are actually set private static final int SET_SPEED = 1 << 0; private static final int SET_PITCH = 1 << 1; private static final int SET_AUDIO_FALLBACK_MODE = 1 << 2; private static final int SET_AUDIO_STRETCH_MODE = 1 << 3; private int mSet = 0; - // settings + // params private int mAudioFallbackMode = AUDIO_FALLBACK_MODE_DEFAULT; private int mAudioStretchMode = AUDIO_STRETCH_MODE_DEFAULT; private float mPitch = 1.0f; @@ -99,9 +99,9 @@ public final class PlaybackSettings { * Otherwise a {@link java.lang.IllegalArgumentException} exception * is raised when getting those properties * which have defaults but have never been set. - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings allowDefaults() { + public PlaybackParams allowDefaults() { mSet |= SET_AUDIO_FALLBACK_MODE | SET_AUDIO_STRETCH_MODE | SET_PITCH | SET_SPEED; return this; } @@ -109,9 +109,9 @@ public final class PlaybackSettings { /** * Sets the audio fallback mode. * @param audioFallbackMode - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setAudioFallbackMode(@AudioFallbackMode int audioFallbackMode) { + public PlaybackParams setAudioFallbackMode(@AudioFallbackMode int audioFallbackMode) { mAudioFallbackMode = audioFallbackMode; mSet |= SET_AUDIO_FALLBACK_MODE; return this; @@ -133,9 +133,9 @@ public final class PlaybackSettings { * @hide * Sets the audio stretch mode. * @param audioStretchMode - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setAudioStretchMode(@AudioStretchMode int audioStretchMode) { + public PlaybackParams setAudioStretchMode(@AudioStretchMode int audioStretchMode) { mAudioStretchMode = audioStretchMode; mSet |= SET_AUDIO_STRETCH_MODE; return this; @@ -157,9 +157,9 @@ public final class PlaybackSettings { /** * Sets the pitch factor. * @param pitch - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setPitch(float pitch) { + public PlaybackParams setPitch(float pitch) { mPitch = pitch; mSet |= SET_PITCH; return this; @@ -180,9 +180,9 @@ public final class PlaybackSettings { /** * Sets the speed factor. * @param speed - * @return this <code>PlaybackSettings</code> instance. + * @return this <code>PlaybackParams</code> instance. */ - public PlaybackSettings setSpeed(float speed) { + public PlaybackParams setSpeed(float speed) { mSpeed = speed; mSet |= SET_SPEED; return this; diff --git a/media/java/android/media/SyncSettings.java b/media/java/android/media/SyncParams.java index 9740147f37e2..00a8dc0115f6 100644 --- a/media/java/android/media/SyncSettings.java +++ b/media/java/android/media/SyncParams.java @@ -22,31 +22,31 @@ import java.lang.annotation.RetentionPolicy; import android.annotation.IntDef; /** - * Structure for common A/V sync settings. + * Structure for common A/V sync params. * - * Used by {@link MediaSync} {link MediaSync#getSyncSettings()} and - * {link MediaSync#setSyncSettings(SyncSettings)} + * Used by {@link MediaSync} {link MediaSync#getSyncParams()} and + * {link MediaSync#setSyncParams(SyncParams)} * to control A/V sync behavior. * <p> <strong>audio adjust mode:</strong> * select handling of audio track when changing playback speed due to sync. * <ul> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_DEFAULT}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_DEFAULT}: * System will determine best handling. </li> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_STRETCH}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_STRETCH}: * Change the speed of audio playback without altering its pitch.</li> - * <li> {@link SyncSettings#AUDIO_ADJUST_MODE_RESAMPLE}: + * <li> {@link SyncParams#AUDIO_ADJUST_MODE_RESAMPLE}: * Change the speed of audio playback by resampling the audio.</li> * </ul> * <p> <strong>sync source:</strong> select * clock source for sync. * <ul> - * <li> {@link SyncSettings#SYNC_SOURCE_DEFAULT}: + * <li> {@link SyncParams#SYNC_SOURCE_DEFAULT}: * System will determine best selection.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_SYSTEM_CLOCK}: + * <li> {@link SyncParams#SYNC_SOURCE_SYSTEM_CLOCK}: * Use system clock for sync source.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_AUDIO}: + * <li> {@link SyncParams#SYNC_SOURCE_AUDIO}: * Use audio track for sync source.</li> - * <li> {@link SyncSettings#SYNC_SOURCE_VSYNC}: + * <li> {@link SyncParams#SYNC_SOURCE_VSYNC}: * Syncronize media to vsync.</li> * </ul> * <p> <strong>tolerance:</strong> specifies the amount of allowed playback rate @@ -55,7 +55,7 @@ import android.annotation.IntDef; * <p> <strong>frameRate:</strong> initial hint for video frame rate. Used when * sync source is vsync. */ -public final class SyncSettings { +public final class SyncParams { /** @hide */ @IntDef( value = { @@ -155,14 +155,14 @@ public final class SyncSettings { */ public static final int AUDIO_ADJUST_MODE_RESAMPLE = 2; - // flags to indicate which settings are actually set + // flags to indicate which params are actually set private static final int SET_SYNC_SOURCE = 1 << 0; private static final int SET_AUDIO_ADJUST_MODE = 1 << 1; private static final int SET_TOLERANCE = 1 << 2; private static final int SET_FRAME_RATE = 1 << 3; private int mSet = 0; - // settings + // params private int mAudioAdjustMode = AUDIO_ADJUST_MODE_STRETCH; private int mSyncSource = SYNC_SOURCE_DEFAULT; private float mTolerance = 0.f; @@ -173,9 +173,9 @@ public final class SyncSettings { * Otherwise a {@link java.lang.IllegalArgumentException} exception * is raised when getting those properties * which have defaults but have never been set. - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings allowDefaults() { + public SyncParams allowDefaults() { mSet |= SET_SYNC_SOURCE | SET_AUDIO_ADJUST_MODE | SET_TOLERANCE; return this; } @@ -183,9 +183,9 @@ public final class SyncSettings { /** * Sets the audio adjust mode. * @param audioAdjustMode - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setAudioAdjustMode(@AudioAdjustMode int audioAdjustMode) { + public SyncParams setAudioAdjustMode(@AudioAdjustMode int audioAdjustMode) { mAudioAdjustMode = audioAdjustMode; mSet |= SET_AUDIO_ADJUST_MODE; return this; @@ -206,9 +206,9 @@ public final class SyncSettings { /** * Sets the sync source. * @param syncSource - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setSyncSource(@SyncSource int syncSource) { + public SyncParams setSyncSource(@SyncSource int syncSource) { mSyncSource = syncSource; mSet |= SET_SYNC_SOURCE; return this; @@ -231,9 +231,9 @@ public final class SyncSettings { * @param tolerance A non-negative number representing * the maximum deviation of the playback rate from the playback rate * set. ({@code abs(actual_rate - set_rate) / set_rate}) - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setTolerance(float tolerance) { + public SyncParams setTolerance(float tolerance) { mTolerance = tolerance; mSet |= SET_TOLERANCE; return this; @@ -257,9 +257,9 @@ public final class SyncSettings { * Sets the video frame rate hint to be used. By default the frame rate is unspecified. * @param frameRate A non-negative number used as an initial hint on * the video frame rate to be used when using vsync as the sync source. - * @return this <code>SyncSettings</code> instance. + * @return this <code>SyncParams</code> instance. */ - public SyncSettings setFrameRate(float frameRate) { + public SyncParams setFrameRate(float frameRate) { mFrameRate = frameRate; mSet |= SET_FRAME_RATE; return this; diff --git a/media/java/android/media/midi/MidiDeviceInfo.java b/media/java/android/media/midi/MidiDeviceInfo.java index 35374ed133ca..57607e9e211c 100644 --- a/media/java/android/media/midi/MidiDeviceInfo.java +++ b/media/java/android/media/midi/MidiDeviceInfo.java @@ -298,6 +298,9 @@ public final class MidiDeviceInfo implements Parcelable { @Override public String toString() { + // This is a hack to force the mProperties Bundle to unparcel so we can + // print all the names and values. + mProperties.getString(PROPERTY_NAME); return ("MidiDeviceInfo[mType=" + mType + ",mInputPortCount=" + mInputPortCount + ",mOutputPortCount=" + mOutputPortCount + diff --git a/media/java/android/media/midi/MidiDeviceStatus.java b/media/java/android/media/midi/MidiDeviceStatus.java index 7522dcf4f6b2..d4abeffb4c8b 100644 --- a/media/java/android/media/midi/MidiDeviceStatus.java +++ b/media/java/android/media/midi/MidiDeviceStatus.java @@ -89,10 +89,9 @@ public final class MidiDeviceStatus implements Parcelable { @Override public String toString() { - StringBuilder builder = new StringBuilder(mDeviceInfo.toString()); int inputPortCount = mDeviceInfo.getInputPortCount(); int outputPortCount = mDeviceInfo.getOutputPortCount(); - builder.append(" mInputPortOpen=["); + StringBuilder builder = new StringBuilder("mInputPortOpen=["); for (int i = 0; i < inputPortCount; i++) { builder.append(mInputPortOpen[i]); if (i < inputPortCount -1) { diff --git a/media/java/android/media/routing/IMediaRouteClientCallback.aidl b/media/java/android/media/routing/IMediaRouteClientCallback.aidl deleted file mode 100644 index d90ea3bf1eb1..000000000000 --- a/media/java/android/media/routing/IMediaRouteClientCallback.aidl +++ /dev/null @@ -1,41 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -import android.media.routing.MediaRouteSelector; -import android.media.routing.ParcelableConnectionInfo; -import android.media.routing.ParcelableDestinationInfo; -import android.media.routing.ParcelableRouteInfo; -import android.os.IBinder; -import android.os.Bundle; - -/** - * @hide - */ -oneway interface IMediaRouteClientCallback { - void onDestinationFound(int seq, in ParcelableDestinationInfo destination, - in ParcelableRouteInfo[] routes); - - void onDestinationLost(int seq, String id); - - void onDiscoveryFailed(int seq, int error, in CharSequence message, in Bundle extras); - - void onConnected(int seq, in ParcelableConnectionInfo connection); - - void onDisconnected(int seq); - - void onConnectionFailed(int seq, int error, in CharSequence message, in Bundle extras); -} diff --git a/media/java/android/media/routing/IMediaRouteService.aidl b/media/java/android/media/routing/IMediaRouteService.aidl deleted file mode 100644 index 493ab6d4b82f..000000000000 --- a/media/java/android/media/routing/IMediaRouteService.aidl +++ /dev/null @@ -1,46 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -import android.media.routing.IMediaRouteClientCallback; -import android.media.routing.MediaRouteSelector; -import android.os.Bundle; - -/** - * Interface to an app's MediaRouteService. - * @hide - */ -oneway interface IMediaRouteService { - void registerClient(int clientUid, String clientPackageName, - in IMediaRouteClientCallback callback); - - void unregisterClient(in IMediaRouteClientCallback callback); - - void startDiscovery(in IMediaRouteClientCallback callback, int seq, - in List<MediaRouteSelector> selectors, int flags); - - void stopDiscovery(in IMediaRouteClientCallback callback); - - void connect(in IMediaRouteClientCallback callback, int seq, - String destinationId, String routeId, int flags, in Bundle extras); - - void disconnect(in IMediaRouteClientCallback callback); - - void pauseStream(in IMediaRouteClientCallback callback); - - void resumeStream(in IMediaRouteClientCallback callback); -} - diff --git a/media/java/android/media/routing/IMediaRouter.aidl b/media/java/android/media/routing/IMediaRouter.aidl deleted file mode 100644 index 0abb25842174..000000000000 --- a/media/java/android/media/routing/IMediaRouter.aidl +++ /dev/null @@ -1,22 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -/** @hide */ -interface IMediaRouter { - -} - diff --git a/media/java/android/media/routing/IMediaRouterDelegate.aidl b/media/java/android/media/routing/IMediaRouterDelegate.aidl deleted file mode 100644 index 35f84c8accd1..000000000000 --- a/media/java/android/media/routing/IMediaRouterDelegate.aidl +++ /dev/null @@ -1,22 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -/** @hide */ -interface IMediaRouterDelegate { - -} - diff --git a/media/java/android/media/routing/IMediaRouterRoutingCallback.aidl b/media/java/android/media/routing/IMediaRouterRoutingCallback.aidl deleted file mode 100644 index 173ae55921d9..000000000000 --- a/media/java/android/media/routing/IMediaRouterRoutingCallback.aidl +++ /dev/null @@ -1,22 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -/** @hide */ -interface IMediaRouterRoutingCallback { - -} - diff --git a/media/java/android/media/routing/IMediaRouterStateCallback.aidl b/media/java/android/media/routing/IMediaRouterStateCallback.aidl deleted file mode 100644 index 0299904a7c1b..000000000000 --- a/media/java/android/media/routing/IMediaRouterStateCallback.aidl +++ /dev/null @@ -1,22 +0,0 @@ -/* 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. - */ - -package android.media.routing; - -/** @hide */ -interface IMediaRouterStateCallback { - -} - diff --git a/media/java/android/media/routing/MediaRouteSelector.aidl b/media/java/android/media/routing/MediaRouteSelector.aidl deleted file mode 100644 index 37bfa4a9c4a8..000000000000 --- a/media/java/android/media/routing/MediaRouteSelector.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 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. -*/ - -package android.media.routing; - -parcelable MediaRouteSelector; diff --git a/media/java/android/media/routing/MediaRouteSelector.java b/media/java/android/media/routing/MediaRouteSelector.java deleted file mode 100644 index 0bfc796f1480..000000000000 --- a/media/java/android/media/routing/MediaRouteSelector.java +++ /dev/null @@ -1,356 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.media.routing.MediaRouter.RouteFeatures; -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; - -import java.util.ArrayList; -import java.util.List; - -/** - * A media route selector consists of a set of constraints that are used to select - * the routes to which an application would like to connect. The constraints consist - * of a set of required or optional features and protocols. The constraints may also - * require the use of a specific media route service package or additional characteristics - * that are described by a bundle of extra parameters. - * <p> - * The application will typically create several different selectors that express - * various combinations of characteristics that it would like to use together when - * it connects to a destination media device. For each destination that is discovered, - * media route services will publish some number of routes and include information - * about which selector each route matches. The application will then choose among - * these routes to determine which best satisfies its desired purpose and connect to it. - * </p> - */ -public final class MediaRouteSelector implements Parcelable { - private final int mRequiredFeatures; - private final int mOptionalFeatures; - private final List<String> mRequiredProtocols; - private final List<String> mOptionalProtocols; - private final String mServicePackageName; - private final Bundle mExtras; - - MediaRouteSelector(int requiredFeatures, int optionalFeatures, - List<String> requiredProtocols, List<String> optionalProtocols, - String servicePackageName, Bundle extras) { - mRequiredFeatures = requiredFeatures; - mOptionalFeatures = optionalFeatures; - mRequiredProtocols = requiredProtocols; - mOptionalProtocols = optionalProtocols; - mServicePackageName = servicePackageName; - mExtras = extras; - } - - /** - * Gets the set of required route features. - * - * @return A set of required route feature flags. - */ - public @RouteFeatures int getRequiredFeatures() { - return mRequiredFeatures; - } - - /** - * Gets the set of optional route features. - * - * @return A set of optional route feature flags. - */ - public @RouteFeatures int getOptionalFeatures() { - return mOptionalFeatures; - } - - /** - * Gets the list of route protocols that a route must support in order to be selected. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @return The list of fully qualified route protocol names. - */ - public @NonNull List<String> getRequiredProtocols() { - return mRequiredProtocols; - } - - /** - * Gets the list of optional route protocols that a client may use if they are available. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @return The list of optional fully qualified route protocol names. - */ - public @NonNull List<String> getOptionalProtocols() { - return mOptionalProtocols; - } - - /** - * Returns true if the selector includes a required or optional request for - * the specified protocol using its fully qualified class name. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param clazz The protocol class. - * @return True if the protocol was requested. - */ - public boolean containsProtocol(@NonNull Class<?> clazz) { - return containsProtocol(clazz.getName()); - } - - /** - * Returns true if the selector includes a required or optional request for - * the specified protocol. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param name The name of the protocol. - * @return True if the protocol was requested. - */ - public boolean containsProtocol(@NonNull String name) { - return mRequiredProtocols.contains(name) - || mOptionalProtocols.contains(name); - } - - /** - * Gets the package name of a specific media route service that this route selector - * requires. - * - * @return The required media route service package name, or null if none. - */ - public @Nullable String getServicePackageName() { - return mServicePackageName; - } - - /** - * Gets optional extras that may be used to select or configure routes for a - * particular purpose. Some extras may be used by media route services to apply - * additional constraints or parameters for the routes to be discovered. - * - * @return The optional extras, or null if none. - */ - public @Nullable Bundle getExtras() { - return mExtras; - } - - @Override - public String toString() { - return "MediaRouteSelector{ " - + ", requiredFeatures=0x" + Integer.toHexString(mRequiredFeatures) - + ", optionalFeatures=0x" + Integer.toHexString(mOptionalFeatures) - + ", requiredProtocols=" + mRequiredProtocols - + ", optionalProtocols=" + mOptionalProtocols - + ", servicePackageName=" + mServicePackageName - + ", extras=" + mExtras + " }"; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mRequiredFeatures); - dest.writeInt(mOptionalFeatures); - dest.writeStringList(mRequiredProtocols); - dest.writeStringList(mOptionalProtocols); - dest.writeString(mServicePackageName); - dest.writeBundle(mExtras); - } - - public static final Parcelable.Creator<MediaRouteSelector> CREATOR = - new Parcelable.Creator<MediaRouteSelector>() { - @Override - public MediaRouteSelector createFromParcel(Parcel source) { - int requiredFeatures = source.readInt(); - int optionalFeatures = source.readInt(); - ArrayList<String> requiredProtocols = new ArrayList<String>(); - ArrayList<String> optionalProtocols = new ArrayList<String>(); - source.readStringList(requiredProtocols); - source.readStringList(optionalProtocols); - return new MediaRouteSelector(requiredFeatures, optionalFeatures, - requiredProtocols, optionalProtocols, - source.readString(), source.readBundle()); - } - - @Override - public MediaRouteSelector[] newArray(int size) { - return new MediaRouteSelector[size]; - } - }; - - /** - * Builder for {@link MediaRouteSelector} objects. - */ - public static final class Builder { - private int mRequiredFeatures; - private int mOptionalFeatures; - private final ArrayList<String> mRequiredProtocols = new ArrayList<String>(); - private final ArrayList<String> mOptionalProtocols = new ArrayList<String>(); - private String mServicePackageName; - private Bundle mExtras; - - /** - * Creates an initially empty selector builder. - */ - public Builder() { - } - - /** - * Sets the set of required route features. - * - * @param features A set of required route feature flags. - */ - public @NonNull Builder setRequiredFeatures(@RouteFeatures int features) { - mRequiredFeatures = features; - return this; - } - - /** - * Sets the set of optional route features. - * - * @param features A set of optional route feature flags. - */ - public @NonNull Builder setOptionalFeatures(@RouteFeatures int features) { - mOptionalFeatures = features; - return this; - } - - /** - * Adds a route protocol that a route must support in order to be selected - * using its fully qualified class name. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param clazz The protocol class. - * @return this - */ - public @NonNull Builder addRequiredProtocol(@NonNull Class<?> clazz) { - if (clazz == null) { - throw new IllegalArgumentException("clazz must not be null"); - } - return addRequiredProtocol(clazz.getName()); - } - - /** - * Adds a route protocol that a route must support in order to be selected. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param name The fully qualified name of the required protocol. - * @return this - */ - public @NonNull Builder addRequiredProtocol(@NonNull String name) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null or empty"); - } - mRequiredProtocols.add(name); - return this; - } - - /** - * Adds an optional route protocol that a client may use if available - * using its fully qualified class name. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param clazz The protocol class. - * @return this - */ - public @NonNull Builder addOptionalProtocol(@NonNull Class<?> clazz) { - if (clazz == null) { - throw new IllegalArgumentException("clazz must not be null"); - } - return addOptionalProtocol(clazz.getName()); - } - - /** - * Adds an optional route protocol that a client may use if available. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - * - * @param name The fully qualified name of the optional protocol. - * @return this - */ - public @NonNull Builder addOptionalProtocol(@NonNull String name) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null or empty"); - } - mOptionalProtocols.add(name); - return this; - } - - /** - * Sets the package name of the media route service to which this selector - * appertains. - * <p> - * If a package name is specified here then this selector will only be - * passed to media route services from that package. This has the effect - * of restricting the set of matching routes to just those that are offered - * by that package. - * </p> - * - * @param packageName The required service package name, or null if none. - * @return this - */ - public @NonNull Builder setServicePackageName(@Nullable String packageName) { - mServicePackageName = packageName; - return this; - } - - /** - * Sets optional extras that may be used to select or configure routes for a - * particular purpose. Some extras may be used by route services to specify - * additional constraints or parameters for the routes to be discovered. - * - * @param extras The optional extras, or null if none. - * @return this - */ - public @NonNull Builder setExtras(@Nullable Bundle extras) { - mExtras = extras; - return this; - } - - /** - * Builds the {@link MediaRouteSelector} object. - * - * @return The new media route selector instance. - */ - public @NonNull MediaRouteSelector build() { - return new MediaRouteSelector(mRequiredFeatures, mOptionalFeatures, - mRequiredProtocols, mOptionalProtocols, mServicePackageName, mExtras); - } - } -} diff --git a/media/java/android/media/routing/MediaRouteService.java b/media/java/android/media/routing/MediaRouteService.java deleted file mode 100644 index 4d5a8a9b4f54..000000000000 --- a/media/java/android/media/routing/MediaRouteService.java +++ /dev/null @@ -1,1023 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SdkConstant; -import android.app.Service; -import android.content.Intent; -import android.content.pm.PackageManager.NameNotFoundException; -import android.media.routing.MediaRouter.ConnectionError; -import android.media.routing.MediaRouter.ConnectionInfo; -import android.media.routing.MediaRouter.ConnectionRequest; -import android.media.routing.MediaRouter.DestinationInfo; -import android.media.routing.MediaRouter.DiscoveryError; -import android.media.routing.MediaRouter.DiscoveryRequest; -import android.media.routing.MediaRouter.RouteInfo; -import android.media.routing.MediaRouter.ServiceMetadata; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.RemoteException; -import android.util.ArrayMap; -import android.util.Log; - -import java.util.ArrayList; -import java.util.List; - -/** - * Media route services implement strategies for discovering - * and establishing connections to media devices and their routes. These services - * are also known as media route providers. - * <p> - * Each media route service subclass is responsible for enabling applications - * and the system to interact with media devices of some kind. - * For example, one particular media route service implementation might - * offer support for discovering nearby wireless display devices and streaming - * video contents to them; another media route service implementation might - * offer support for discovering nearby speakers and streaming media appliances - * and sending commands to play content on request. - * </p><p> - * Subclasses must override the {@link #onCreateClientSession} method to return - * a {@link ClientSession} object that implements the {@link ClientSession#onStartDiscovery}, - * {@link ClientSession#onStopDiscovery}, and {@link ClientSession#onConnect} methods - * to allow clients to discover and connect to media devices. - * </p><p> - * This object is not thread-safe. All callbacks are invoked on the main looper. - * </p> - * - * <h3>Clients</h3> - * <p> - * The clients of this API are media applications that would like to discover - * and connect to media devices. The client may also be the system, such as - * when the user initiates display mirroring via the Cast Screen function. - * </p><p> - * There may be multiple client sessions active at the same time. Each client - * session can request discovery and connect to routes independently of any - * other client. It is the responsibility of the media route service to maintain - * separate state for each client session and to ensure that clients cannot interfere - * with one another in harmful ways. - * </p><p> - * Notwithstanding the requirement to support any number of concurrent client - * sessions, the media route service may impose constraints on how many clients - * can connect to the same media device in a particular mode at the same time. - * In some cases, media devices may support connections from an arbitrary number - * of clients simultaneously but often it may be necessary to ensure that only - * one client is in control. When this happens, the media route service should - * report a connection error unless the connection request specifies that the - * client should take control of the media device (and forcibly disconnect other - * clients that may be using it). - * </p> - * - * <h3>Destinations</h3> - * <p> - * The media devices to which an application may send media content are referred - * to in the API as destinations. Each destination therefore represents a single - * independent device such as a speaker or TV set. Destinations are given meaningful - * names and descriptions to help the user associate them with devices in their - * environment. - * </p><p> - * Destinations may be local or remote and may be accessed through various means, - * often wirelessly. The user may install media route services to enable - * media applications to connect to a variety of destinations with different - * capabilities. - * </p> - * - * <h3>Routes</h3> - * <p> - * Routes represent possible usages or means of reaching and interacting with - * a destination. Since destinations may support many different features, they may - * each offer multiple routes for applications to choose from based on their needs. - * For example, one route might express the ability to stream locally rendered audio - * and video to the device; another route might express the ability to send a URL for - * the destination to download from the network and play all by itself. - * </p><p> - * Routes are discovered according to the set of capabilities that - * an application or the system is seeking to use at a particular time. For example, - * if an application wants to stream music to a destination then it will ask the - * {@link MediaRouter} to find routes to destinations can stream music and ignore - * all other destinations that cannot. - * </p><p> - * In general, the application will inspect the set of routes that have been - * offered then connect to the most appropriate route for its desired purpose. - * </p> - * - * <h3>Discovery</h3> - * <p> - * Discovery is the process of finding destinations based on a description of the - * kinds of routes that an application or the system would like to use. - * </p><p> - * Discovery begins when {@link ClientSession#onStartDiscovery} is called and ends when - * {@link ClientSession#onStopDiscovery} is called. There may be multiple simultaneous - * discovery requests in progress at the same time from different clients. It is up to - * the media route service to perform these requests in parallel or multiplex them - * as required. - * </p><p> - * Media route services are <em>strongly encouraged</em> to use the information - * in the discovery request to optimize discovery and avoid redundant work. - * In the case where no media device supported by the media route service - * could possibly offer the requested capabilities, the - * {@link ClientSession#onStartDiscovery} method should return <code>false</code> to - * let the system know that it can unbind from the media route service and - * release its resources. - * </p> - * - * <h3>Settings</h3> - * <p> - * Many kinds of devices can be discovered on demand simply by scanning the local network - * or using wireless protocols such as Bluetooth to find them. However, in some cases - * it may be necessary for the user to manually configure destinations before they - * can be used (or to adjust settings later). Actual user configuration of destinations - * is beyond the scope of this API but media route services may specify an activity - * in their manifest that the user can launch to perform these tasks. - * </p><p> - * Note that media route services that are installed from the store must be enabled - * by the user before they become available for applications to use. - * The {@link android.provider.Settings#ACTION_CAST_SETTINGS Settings.ACTION_CAST_SETTINGS} - * settings activity provides the ability for the user to configure media route services. - * </p> - * - * <h3>Manifest Declaration</h3> - * <p> - * Media route services must be declared in the manifest along with meta-data - * about the kinds of routes that they are capable of discovering. The system - * uses this information to optimize the set of services to which it binds in - * order to satisfy a particular discovery request. - * </p><p> - * To extend this class, you must declare the service in your manifest file with - * the {@link android.Manifest.permission#BIND_MEDIA_ROUTE_SERVICE} permission - * and include an intent filter with the {@link #SERVICE_INTERFACE} action. You must - * also add meta-data to describe the kinds of routes that your service is capable - * of discovering. - * </p><p> - * For example: - * </p><pre> - * <service android:name=".MediaRouteProvider" - * android:label="@string/service_name" - * android:permission="android.permission.BIND_MEDIA_ROUTE_SERVICE"> - * <intent-filter> - * <action android:name="android.media.routing.MediaRouteService" /> - * </intent-filter> - * - * TODO: INSERT METADATA DECLARATIONS HERE - * - * </service> - * </pre> - */ -public abstract class MediaRouteService extends Service { - private static final String TAG = "MediaRouteService"; - - private static final boolean DEBUG = true; - - private final Handler mHandler; - private final BinderService mService; - private final ArrayMap<IBinder, ClientRecord> mClientRecords = - new ArrayMap<IBinder, ClientRecord>(); - - private ServiceMetadata mMetadata; - - /** - * The {@link Intent} that must be declared as handled by the service. - */ - @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) - public static final String SERVICE_INTERFACE = - "android.media.routing.MediaRouteService"; - - /** - * Creates a media route service. - */ - public MediaRouteService() { - mHandler = new Handler(true); - mService = new BinderService(); - } - - @Override - public @Nullable IBinder onBind(Intent intent) { - if (SERVICE_INTERFACE.equals(intent.getAction())) { - return mService; - } - return null; - } - - /** - * Creates a new client session on behalf of a client. - * <p> - * The implementation should return a {@link ClientSession} for the client - * to use. The media route service must take care to manage the state of - * each client session independently from any others that might also be - * in use at the same time. - * </p> - * - * @param client Information about the client. - * @return The client session object, or null if the client is not allowed - * to interact with this media route service. - */ - public abstract @Nullable ClientSession onCreateClientSession(@NonNull ClientInfo client); - - /** - * Gets metadata about this service. - * <p> - * Use this method to obtain a {@link ServiceMetadata} object to provide when creating - * a {@link android.media.routing.MediaRouter.DestinationInfo.Builder}. - * </p> - * - * @return Metadata about this service. - */ - public @NonNull ServiceMetadata getServiceMetadata() { - if (mMetadata == null) { - try { - mMetadata = new ServiceMetadata(this); - } catch (NameNotFoundException ex) { - Log.wtf(TAG, "Could not retrieve own service metadata!"); - } - } - return mMetadata; - } - - /** - * Enables a single client to access the functionality of the media route service. - */ - public static abstract class ClientSession { - /** - * Starts discovery. - * <p> - * If the media route service is capable of discovering routes that satisfy - * the request then this method should start discovery and return true. - * Otherwise, this method should return false. If false is returned, - * then the framework will not call {@link #onStopDiscovery} since discovery - * was never actually started. - * </p><p> - * There may already be other discovery requests in progress at the same time - * for other clients; the media route service must keep track of them all. - * </p> - * - * @param req The discovery request to start. - * @param callback A callback to receive discovery events related to this - * particular request. The events that the service sends to this callback - * will be sent to the client that initiated the discovery request. - * @return True if discovery has started. False if the media route service - * is unable to discover routes that satisfy the request. - */ - public abstract boolean onStartDiscovery(@NonNull DiscoveryRequest req, - @NonNull DiscoveryCallback callback); - - /** - * Stops discovery. - * <p> - * If {@link #onStartDiscovery} returned true, then this method will eventually - * be called when the framework no longer requires this discovery request - * to be performed. - * </p><p> - * There may still be other discovery requests in progress for other clients; - * they must keep working until they have each been stopped by their client. - * </p> - */ - public abstract void onStopDiscovery(); - - /** - * Starts connecting to a route. - * - * @param req The connection request. - * @param callback A callback to receive events connection events related - * to this particular request. The events that the service sends to this callback - * will be sent to the client that initiated the discovery request. - * @return True if the connection is in progress, or false if the client - * unable to connect to the requested route. - */ - public abstract boolean onConnect(@NonNull ConnectionRequest req, - @NonNull ConnectionCallback callback); - - /** - * Called when the client requests to disconnect from the route - * or abort a connection attempt in progress. - */ - public abstract void onDisconnect(); - - /** - * Called when the client requests to pause streaming of content to - * live audio/video routes such as when it goes into the background. - * <p> - * The default implementation does nothing. - * </p> - */ - public void onPauseStream() { } - - /** - * Called when the application requests to resume streaming of content to - * live audio/video routes such as when it returns to the foreground. - * <p> - * The default implementation does nothing. - * </p> - */ - public void onResumeStream() { } - - /** - * Called when the client is releasing the session. - * <p> - * The framework automatically takes care of stopping discovery and - * terminating the connection politely before calling this method to release - * the session. - * </p><p> - * The default implementation does nothing. - * </p> - */ - public void onRelease() { } - } - - /** - * Provides events in response to a discovery request. - */ - public final class DiscoveryCallback { - private final ClientRecord mRecord; - - DiscoveryCallback(ClientRecord record) { - mRecord = record; - } - - /** - * Called by the service when a destination is found that - * offers one or more routes that satisfy the discovery request. - * <p> - * This method should be called whenever the list of available routes - * at a destination changes or whenever the properties of the destination - * itself change. - * </p> - * - * @param destination The destination that was found. - * @param routes The list of that destination's routes that satisfy the - * discovery request. - */ - public void onDestinationFound(final @NonNull DestinationInfo destination, - final @NonNull List<RouteInfo> routes) { - if (destination == null) { - throw new IllegalArgumentException("destination must not be null"); - } - if (routes == null) { - throw new IllegalArgumentException("routes must not be null"); - } - for (int i = 0; i < routes.size(); i++) { - if (routes.get(i).getDestination() != destination) { - throw new IllegalArgumentException("routes must refer to the " - + "destination"); - } - } - - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchDestinationFound(DiscoveryCallback.this, - destination, routes); - } - }); - } - - /** - * Called by the service when a destination is no longer - * reachable or is no longer offering any routes that satisfy - * the discovery request. - * - * @param destination The destination that went away. - */ - public void onDestinationLost(final @NonNull DestinationInfo destination) { - if (destination == null) { - throw new IllegalArgumentException("destination must not be null"); - } - - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchDestinationLost(DiscoveryCallback.this, destination); - } - }); - } - - /** - * Called by the service when a discovery has failed in a non-recoverable manner. - * - * @param error The error code: one of - * {@link MediaRouter#DISCOVERY_ERROR_UNKNOWN}, - * {@link MediaRouter#DISCOVERY_ERROR_ABORTED}, - * or {@link MediaRouter#DISCOVERY_ERROR_NO_CONNECTIVITY}. - * @param message The localized error message, or null if none. This message - * may be shown to the user. - * @param extras Additional information about the error which a client - * may use, or null if none. - */ - public void onDiscoveryFailed(final @DiscoveryError int error, - final @Nullable CharSequence message, final @Nullable Bundle extras) { - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchDiscoveryFailed(DiscoveryCallback.this, - error, message, extras); - } - }); - } - } - - /** - * Provides events in response to a connection request. - */ - public final class ConnectionCallback { - private final ClientRecord mRecord; - - ConnectionCallback(ClientRecord record) { - mRecord = record; - } - - /** - * Called by the service when the connection succeeds. - * - * @param connection Immutable information about the connection. - */ - public void onConnected(final @NonNull ConnectionInfo connection) { - if (connection == null) { - throw new IllegalArgumentException("connection must not be null"); - } - - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchConnected(ConnectionCallback.this, connection); - } - }); - } - - /** - * Called by the service when the connection is terminated normally. - * <p> - * Abnormal termination is reported via {@link #onConnectionFailed}. - * </p> - */ - public void onDisconnected() { - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchDisconnected(ConnectionCallback.this); - } - }); - } - - /** - * Called by the service when a connection attempt or connection in - * progress has failed in a non-recoverable manner. - * - * @param error The error code: one of - * {@link MediaRouter#CONNECTION_ERROR_ABORTED}, - * {@link MediaRouter#CONNECTION_ERROR_UNAUTHORIZED}, - * {@link MediaRouter#CONNECTION_ERROR_UNREACHABLE}, - * {@link MediaRouter#CONNECTION_ERROR_BUSY}, - * {@link MediaRouter#CONNECTION_ERROR_TIMEOUT}, - * {@link MediaRouter#CONNECTION_ERROR_BROKEN}, - * or {@link MediaRouter#CONNECTION_ERROR_BARGED}. - * @param message The localized error message, or null if none. This message - * may be shown to the user. - * @param extras Additional information about the error which a client - * may use, or null if none. - */ - public void onConnectionFailed(final @ConnectionError int error, - final @Nullable CharSequence message, final @Nullable Bundle extras) { - mHandler.post(new Runnable() { - @Override - public void run() { - mRecord.dispatchConnectionFailed(ConnectionCallback.this, - error, message, extras); - } - }); - } - } - - /** - * Identifies a client of the media route service. - */ - public static final class ClientInfo { - private final int mUid; - private final String mPackageName; - - ClientInfo(int uid, String packageName) { - mUid = uid; - mPackageName = packageName; - } - - /** - * Gets the UID of the client application. - */ - public int getUid() { - return mUid; - } - - /** - * Gets the package name of the client application. - */ - public @NonNull String getPackageName() { - return mPackageName; - } - - @Override - public @NonNull String toString() { - return "ClientInfo{ uid=" + mUid + ", package=" + mPackageName + " }"; - } - } - - private final class BinderService extends IMediaRouteService.Stub { - @Override - public void registerClient(final int clientUid, final String clientPackageName, - final IMediaRouteClientCallback callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientInfo client = new ClientInfo(clientUid, clientPackageName); - if (DEBUG) { - Log.d(TAG, "registerClient: client=" + client); - } - - ClientSession session = onCreateClientSession(client); - if (session == null) { - // request refused by service - Log.w(TAG, "Media route service refused to create session for client: " - + "client=" + client); - return; - } - - ClientRecord record = new ClientRecord(callback, client, session); - try { - callback.asBinder().linkToDeath(record, 0); - } catch (RemoteException ex) { - // client died prematurely - Log.w(TAG, "Client died prematurely while creating session: " - + "client=" + client); - record.release(); - return; - } - - mClientRecords.put(callback.asBinder(), record); - } - }); - } - - @Override - public void unregisterClient(IMediaRouteClientCallback callback) { - unregisterClient(callback, false); - } - - void unregisterClient(final IMediaRouteClientCallback callback, - final boolean died) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.remove(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "unregisterClient: client=" + record.getClientInfo() - + ", died=" + died); - } - - record.release(); - callback.asBinder().unlinkToDeath(record, 0); - } - }); - } - - @Override - public void startDiscovery(final IMediaRouteClientCallback callback, - final int seq, final List<MediaRouteSelector> selectors, - final int flags) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "startDiscovery: client=" + record.getClientInfo() - + ", seq=" + seq + ", selectors=" + selectors - + ", flags=0x" + Integer.toHexString(flags)); - } - record.startDiscovery(seq, selectors, flags); - } - }); - } - - @Override - public void stopDiscovery(final IMediaRouteClientCallback callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "stopDiscovery: client=" + record.getClientInfo()); - } - record.stopDiscovery(); - } - }); - } - - @Override - public void connect(final IMediaRouteClientCallback callback, - final int seq, final String destinationId, final String routeId, - final int flags, final Bundle extras) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "connect: client=" + record.getClientInfo() - + ", seq=" + seq + ", destinationId=" + destinationId - + ", routeId=" + routeId - + ", flags=0x" + Integer.toHexString(flags) - + ", extras=" + extras); - } - record.connect(seq, destinationId, routeId, flags, extras); - } - }); - } - - @Override - public void disconnect(final IMediaRouteClientCallback callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "disconnect: client=" + record.getClientInfo()); - } - record.disconnect(); - } - }); - } - - @Override - public void pauseStream(final IMediaRouteClientCallback callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "pauseStream: client=" + record.getClientInfo()); - } - record.pauseStream(); - } - }); - } - - @Override - public void resumeStream(final IMediaRouteClientCallback callback) { - mHandler.post(new Runnable() { - @Override - public void run() { - ClientRecord record = mClientRecords.get(callback.asBinder()); - if (record == null) { - return; // spurious - } - - if (DEBUG) { - Log.d(TAG, "resumeStream: client=" + record.getClientInfo()); - } - record.resumeStream(); - } - }); - } - } - - // Must be accessed on handler - private final class ClientRecord implements IBinder.DeathRecipient { - private final IMediaRouteClientCallback mClientCallback; - private final ClientInfo mClient; - private final ClientSession mSession; - - private int mDiscoverySeq; - private DiscoveryRequest mDiscoveryRequest; - private DiscoveryCallback mDiscoveryCallback; - private final ArrayMap<String, DestinationRecord> mDestinations = - new ArrayMap<String, DestinationRecord>(); - - private int mConnectionSeq; - private ConnectionRequest mConnectionRequest; - private ConnectionCallback mConnectionCallback; - private ConnectionInfo mConnection; - private boolean mConnectionPaused; - - public ClientRecord(IMediaRouteClientCallback callback, - ClientInfo client, ClientSession session) { - mClientCallback = callback; - mClient = client; - mSession = session; - } - - // Invoked on binder thread unlike all other methods in this class. - @Override - public void binderDied() { - mService.unregisterClient(mClientCallback, true); - } - - public ClientInfo getClientInfo() { - return mClient; - } - - public void release() { - stopDiscovery(); - disconnect(); - } - - public void startDiscovery(int seq, List<MediaRouteSelector> selectors, - int flags) { - stopDiscovery(); - - mDiscoverySeq = seq; - mDiscoveryRequest = new DiscoveryRequest(selectors); - mDiscoveryRequest.setFlags(flags); - mDiscoveryCallback = new DiscoveryCallback(this); - boolean started = mSession.onStartDiscovery(mDiscoveryRequest, mDiscoveryCallback); - if (!started) { - dispatchDiscoveryFailed(mDiscoveryCallback, - MediaRouter.DISCOVERY_ERROR_ABORTED, null, null); - clearDiscovery(); - } - } - - public void stopDiscovery() { - if (mDiscoveryRequest != null) { - mSession.onStopDiscovery(); - clearDiscovery(); - } - } - - private void clearDiscovery() { - mDestinations.clear(); - mDiscoveryRequest = null; - mDiscoveryCallback = null; - } - - public void connect(int seq, String destinationId, String routeId, - int flags, Bundle extras) { - disconnect(); - - mConnectionSeq = seq; - mConnectionCallback = new ConnectionCallback(this); - - DestinationRecord destinationRecord = mDestinations.get(destinationId); - if (destinationRecord == null) { - Log.w(TAG, "Aborting connection to route since no matching destination " - + "was found in the list of known destinations: " - + "destinationId=" + destinationId); - dispatchConnectionFailed(mConnectionCallback, - MediaRouter.CONNECTION_ERROR_ABORTED, null, null); - clearConnection(); - return; - } - - RouteInfo route = destinationRecord.getRoute(routeId); - if (route == null) { - Log.w(TAG, "Aborting connection to route since no matching route " - + "was found in the list of known routes: " - + "destination=" + destinationRecord.destination - + ", routeId=" + routeId); - dispatchConnectionFailed(mConnectionCallback, - MediaRouter.CONNECTION_ERROR_ABORTED, null, null); - clearConnection(); - return; - } - - mConnectionRequest = new ConnectionRequest(route); - mConnectionRequest.setFlags(flags); - mConnectionRequest.setExtras(extras); - boolean started = mSession.onConnect(mConnectionRequest, mConnectionCallback); - if (!started) { - dispatchConnectionFailed(mConnectionCallback, - MediaRouter.CONNECTION_ERROR_ABORTED, null, null); - clearConnection(); - } - } - - public void disconnect() { - if (mConnectionRequest != null) { - mSession.onDisconnect(); - clearConnection(); - } - } - - private void clearConnection() { - mConnectionRequest = null; - mConnectionCallback = null; - if (mConnection != null) { - mConnection.close(); - mConnection = null; - } - mConnectionPaused = false; - } - - public void pauseStream() { - if (mConnectionRequest != null && !mConnectionPaused) { - mConnectionPaused = true; - mSession.onPauseStream(); - } - } - - public void resumeStream() { - if (mConnectionRequest != null && mConnectionPaused) { - mConnectionPaused = false; - mSession.onResumeStream(); - } - } - - public void dispatchDestinationFound(DiscoveryCallback callback, - DestinationInfo destination, List<RouteInfo> routes) { - if (callback == mDiscoveryCallback) { - if (DEBUG) { - Log.d(TAG, "destinationFound: destination=" + destination - + ", routes=" + routes); - } - mDestinations.put(destination.getId(), - new DestinationRecord(destination, routes)); - - ParcelableDestinationInfo pdi = new ParcelableDestinationInfo(); - pdi.id = destination.getId(); - pdi.name = destination.getName(); - pdi.description = destination.getDescription(); - pdi.iconResourceId = destination.getIconResourceId(); - pdi.extras = destination.getExtras(); - ArrayList<ParcelableRouteInfo> pris = new ArrayList<ParcelableRouteInfo>(); - for (RouteInfo route : routes) { - int selectorIndex = mDiscoveryRequest.getSelectors().indexOf( - route.getSelector()); - if (selectorIndex < 0) { - Log.w(TAG, "Ignoring route because the selector does not match " - + "any of those that were originally supplied by the " - + "client's discovery request: destination=" + destination - + ", route=" + route); - continue; - } - - ParcelableRouteInfo pri = new ParcelableRouteInfo(); - pri.id = route.getId(); - pri.selectorIndex = selectorIndex; - pri.features = route.getFeatures(); - pri.protocols = route.getProtocols().toArray( - new String[route.getProtocols().size()]); - pri.extras = route.getExtras(); - pris.add(pri); - } - try { - mClientCallback.onDestinationFound(mDiscoverySeq, pdi, - pris.toArray(new ParcelableRouteInfo[pris.size()])); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } - } - - public void dispatchDestinationLost(DiscoveryCallback callback, - DestinationInfo destination) { - if (callback == mDiscoveryCallback) { - if (DEBUG) { - Log.d(TAG, "destinationLost: destination=" + destination); - } - - if (mDestinations.get(destination.getId()).destination == destination) { - mDestinations.remove(destination.getId()); - try { - mClientCallback.onDestinationLost(mDiscoverySeq, destination.getId()); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } - } - } - - public void dispatchDiscoveryFailed(DiscoveryCallback callback, - int error, CharSequence message, Bundle extras) { - if (callback == mDiscoveryCallback) { - if (DEBUG) { - Log.d(TAG, "discoveryFailed: error=" + error + ", message=" + message - + ", extras=" + extras); - } - - try { - mClientCallback.onDiscoveryFailed(mDiscoverySeq, error, message, extras); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } - } - - public void dispatchConnected(ConnectionCallback callback, ConnectionInfo connection) { - if (callback == mConnectionCallback) { - if (DEBUG) { - Log.d(TAG, "connected: connection=" + connection); - } - if (mConnection == null) { - mConnection = connection; - - ParcelableConnectionInfo pci = new ParcelableConnectionInfo(); - pci.audioAttributes = connection.getAudioAttributes(); - pci.presentationDisplayId = connection.getPresentationDisplay() != null ? - connection.getPresentationDisplay().getDisplayId() : -1; - pci.protocolBinders = new IBinder[connection.getProtocols().size()]; - for (int i = 0; i < pci.protocolBinders.length; i++) { - pci.protocolBinders[i] = connection.getProtocolBinder(i); - } - pci.extras = connection.getExtras(); - try { - mClientCallback.onConnected(mConnectionSeq, pci); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } else { - Log.w(TAG, "Media route service called onConnected() while already " - + "connected."); - } - } - } - - public void dispatchDisconnected(ConnectionCallback callback) { - if (callback == mConnectionCallback) { - if (DEBUG) { - Log.d(TAG, "disconnected"); - } - - if (mConnection != null) { - mConnection.close(); - mConnection = null; - - try { - mClientCallback.onDisconnected(mConnectionSeq); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } - } - } - - public void dispatchConnectionFailed(ConnectionCallback callback, - int error, CharSequence message, Bundle extras) { - if (callback == mConnectionCallback) { - if (DEBUG) { - Log.d(TAG, "connectionFailed: error=" + error + ", message=" + message - + ", extras=" + extras); - } - - try { - mClientCallback.onConnectionFailed(mConnectionSeq, error, message, extras); - } catch (RemoteException ex) { - // binder death handled elsewhere - } - } - } - } - - private static final class DestinationRecord { - public final DestinationInfo destination; - public final List<RouteInfo> routes; - - public DestinationRecord(DestinationInfo destination, List<RouteInfo> routes) { - this.destination = destination; - this.routes = routes; - } - - public RouteInfo getRoute(String routeId) { - final int count = routes.size(); - for (int i = 0; i < count; i++) { - RouteInfo route = routes.get(i); - if (route.getId().equals(routeId)) { - return route; - } - } - return null; - } - } -} diff --git a/media/java/android/media/routing/MediaRouter.java b/media/java/android/media/routing/MediaRouter.java deleted file mode 100644 index 4f6d324dd81f..000000000000 --- a/media/java/android/media/routing/MediaRouter.java +++ /dev/null @@ -1,1886 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.annotation.DrawableRes; -import android.annotation.IntDef; -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.app.Presentation; -import android.app.Service; -import android.content.ComponentName; -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.ServiceInfo; -import android.graphics.drawable.Drawable; -import android.hardware.display.DisplayManager; -import android.media.AudioAttributes; -import android.media.AudioManager; -import android.media.AudioTrack; -import android.media.VolumeProvider; -import android.media.session.MediaController; -import android.media.session.MediaSession; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.IInterface; -import android.text.TextUtils; -import android.util.ArrayMap; -import android.view.Display; - -import java.io.Closeable; -import java.io.IOException; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.List; - -/** - * Media router allows applications to discover, connect to, control, - * and send content to nearby media devices known as destinations. - * <p> - * There are generally two participants involved in media routing: an - * application that wants to send media content to a destination and a - * {@link MediaRouteService media route service} that provides the - * service of transporting that content where it needs to go on behalf of the - * application. - * </p><p> - * To send media content to a destination, the application must ask the system - * to discover available routes to destinations that provide certain capabilities, - * establish a connection to a route, then send messages through the connection to - * control the routing of audio and video streams, launch remote applications, - * and invoke other functions of the destination. - * </p><p> - * Media router objects are thread-safe. - * </p> - * - * <h3>Destinations</h3> - * <p> - * The media devices to which an application may send media content are referred - * to in the API as destinations. Each destination therefore represents a single - * independent device such as a speaker or TV set. Destinations are given meaningful - * names and descriptions to help the user associate them with devices in their - * environment. - * </p><p> - * Destinations may be local or remote and may be accessed through various means, - * often wirelessly. The user may install media route services to enable - * media applications to connect to a variety of destinations with different - * capabilities. - * </p> - * - * <h3>Routes</h3> - * <p> - * Routes represent possible usages or means of reaching and interacting with - * a destination. Since destinations may support many different features, they may - * each offer multiple routes for applications to choose from based on their needs. - * For example, one route might express the ability to stream locally rendered audio - * and video to the device; another route might express the ability to send a URL for - * the destination to download from the network and play all by itself. - * </p><p> - * Routes are discovered according to the set of capabilities that - * an application or the system is seeking to use at a particular time. For example, - * if an application wants to stream music to a destination then it will ask the - * {@link MediaRouter} to find routes to destinations can stream music and ignore - * all other destinations that cannot. - * </p><p> - * In general, the application will inspect the set of routes that have been - * offered then connect to the most appropriate route for its desired purpose. - * </p> - * - * <h3>Route Selection</h3> - * <p> - * When the user open the media route chooser activity, the system will display - * a list of nearby media destinations which have been discovered. After the - * choice is made the application may connect to one of the routes offered by - * this destination and begin communicating with the destination. - * </p><p> - * Destinations are located through a process called discovery. During discovery, - * the system will start installed {@link MediaRouteService media route services} - * to scan the network for nearby devices that offer the kinds of capabilities that the - * application is seeking to use. The application specifies the capabilities it requires by - * adding {@link MediaRouteSelector media route selectors} to the media router - * using the {@link #addSelector} method. Only destinations that provide routes - * which satisfy at least one of these media route selectors will be discovered. - * </p><p> - * Once the user has selected a destination, the application will be given a chance - * to choose one of the routes to which it would like to connect. The application - * may switch to a different route from the same destination at a later time but - * in order to connect to a new destination, the application must once again launch - * the media route chooser activity to ask the user to choose a destination. - * </p> - * - * <h3>Route Protocols</h3> - * <p> - * Route protocols express capabilities offered by routes. Each media route selector - * must specify at least one required protocol by which the routes will be selected. - * </p><p> - * The framework provides several predefined <code>MediaRouteProtocols</code> which are - * defined in the <code>android-support-media-protocols.jar</code> support library. - * Applications must statically link this library to make use of these protocols. - * </p><p> - * The static library approach is used to enable ongoing extension and refinement - * of protocols in the SDK and interoperability with the media router implementation - * for older platform versions which is offered by the framework support library. - * </p><p> - * Media route services may also define custom media route protocols of their own - * to enable applications to access specialized capabilities of certain destinations - * assuming they have linked in the required protocol code. - * </p><p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> for more information. - * </p> - * - * <h3>Connections</h3> - * <p> - * After connecting to a media route, the application can send commands to - * the route using any of the protocols that it requested. If the route supports live - * audio or video streaming then the application can create an {@link AudioTrack} or - * {@link Presentation} to route locally generated content to the destination. - * </p> - * - * <h3>Delegation</h3> - * <p> - * The creator of the media router is responsible for establishing the policy for - * discovering and connecting to destinations. UI components may observe the state - * of the media router by {@link #createDelegate creating} a {@link Delegate}. - * </p><p> - * The media router should also be attached to the {@link MediaSession media session} - * that is handling media playback lifecycle. This will allow - * authorized {@link MediaController media controllers}, possibly running in other - * processes, to provide UI to examine and change the media destination by - * {@link MediaController#createMediaRouterDelegate creating} a {@link Delegate} - * for the media router associated with the session. - * </p> - */ -public final class MediaRouter { - private final DisplayManager mDisplayManager; - - private final Object mLock = new Object(); - - private RoutingCallback mRoutingCallback; - private Handler mRoutingCallbackHandler; - - private boolean mReleased; - private int mDiscoveryState; - private int mConnectionState; - private final ArrayList<MediaRouteSelector> mSelectors = - new ArrayList<MediaRouteSelector>(); - private final ArrayMap<DestinationInfo, List<RouteInfo>> mDiscoveredDestinations = - new ArrayMap<DestinationInfo, List<RouteInfo>>(); - private RouteInfo mSelectedRoute; - private ConnectionInfo mConnection; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { DISCOVERY_STATE_STOPPED, DISCOVERY_STATE_STARTED }) - public @interface DiscoveryState { } - - /** - * Discovery state: Discovery is not currently in progress. - */ - public static final int DISCOVERY_STATE_STOPPED = 0; - - /** - * Discovery state: Discovery is being performed. - */ - public static final int DISCOVERY_STATE_STARTED = 1; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, value = { DISCOVERY_FLAG_BACKGROUND }) - public @interface DiscoveryFlags { } - - /** - * Discovery flag: Indicates that the client has requested passive discovery in - * the background. The media route service should try to use less power and rely - * more on its internal caches to minimize its impact. - */ - public static final int DISCOVERY_FLAG_BACKGROUND = 1 << 0; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { DISCOVERY_ERROR_UNKNOWN, DISCOVERY_ERROR_ABORTED, - DISCOVERY_ERROR_NO_CONNECTIVITY }) - public @interface DiscoveryError { } - - /** - * Discovery error: Unknown error; refer to the error message for details. - */ - public static final int DISCOVERY_ERROR_UNKNOWN = 0; - - /** - * Discovery error: The media router or media route service has decided not to - * handle the discovery request for some reason. - */ - public static final int DISCOVERY_ERROR_ABORTED = 1; - - /** - * Discovery error: The media route service is unable to perform discovery - * due to a lack of connectivity such as because the radio is disabled. - */ - public static final int DISCOVERY_ERROR_NO_CONNECTIVITY = 2; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { CONNECTION_STATE_DISCONNECTED, CONNECTION_STATE_CONNECTING, - CONNECTION_STATE_CONNECTED }) - public @interface ConnectionState { } - - /** - * Connection state: No destination has been selected. Media content should - * be sent to the default output. - */ - public static final int CONNECTION_STATE_DISCONNECTED = 0; - - /** - * Connection state: The application is in the process of connecting to - * a route offered by the selected destination. - */ - public static final int CONNECTION_STATE_CONNECTING = 1; - - /** - * Connection state: The application has connected to a route offered by - * the selected destination. - */ - public static final int CONNECTION_STATE_CONNECTED = 2; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, value = { CONNECTION_FLAG_BARGE }) - public @interface ConnectionFlags { } - - /** - * Connection flag: Indicates that the client has requested to barge in and evict - * other clients that might have already connected to the destination and that - * would otherwise prevent this client from connecting. When this flag is not - * set, the media route service should be polite and report - * {@link MediaRouter#CONNECTION_ERROR_BUSY} in case the destination is - * already occupied and cannot accept additional connections. - */ - public static final int CONNECTION_FLAG_BARGE = 1 << 0; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { CONNECTION_ERROR_UNKNOWN, CONNECTION_ERROR_ABORTED, - CONNECTION_ERROR_UNAUTHORIZED, CONNECTION_ERROR_UNAUTHORIZED, - CONNECTION_ERROR_BUSY, CONNECTION_ERROR_TIMEOUT, CONNECTION_ERROR_BROKEN }) - public @interface ConnectionError { } - - /** - * Connection error: Unknown error; refer to the error message for details. - */ - public static final int CONNECTION_ERROR_UNKNOWN = 0; - - /** - * Connection error: The media router or media route service has decided not to - * handle the connection request for some reason. - */ - public static final int CONNECTION_ERROR_ABORTED = 1; - - /** - * Connection error: The device has refused the connection from this client. - * This error should be avoided because the media route service should attempt - * to filter out devices that the client cannot access as it performs discovery - * on behalf of that client. - */ - public static final int CONNECTION_ERROR_UNAUTHORIZED = 2; - - /** - * Connection error: The device is unreachable over the network. - */ - public static final int CONNECTION_ERROR_UNREACHABLE = 3; - - /** - * Connection error: The device is already busy serving another client and - * the connection request did not ask to barge in. - */ - public static final int CONNECTION_ERROR_BUSY = 4; - - /** - * Connection error: A timeout occurred during connection. - */ - public static final int CONNECTION_ERROR_TIMEOUT = 5; - - /** - * Connection error: The connection to the device was severed unexpectedly. - */ - public static final int CONNECTION_ERROR_BROKEN = 6; - - /** - * Connection error: The connection was terminated because a different client barged - * in and took control of the destination. - */ - public static final int CONNECTION_ERROR_BARGED = 7; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { DISCONNECTION_REASON_APPLICATION_REQUEST, - DISCONNECTION_REASON_USER_REQUEST, DISCONNECTION_REASON_ERROR }) - public @interface DisconnectionReason { } - - /** - * Disconnection reason: The application requested disconnection itself. - */ - public static final int DISCONNECTION_REASON_APPLICATION_REQUEST = 0; - - /** - * Disconnection reason: The user requested disconnection. - */ - public static final int DISCONNECTION_REASON_USER_REQUEST = 1; - - /** - * Disconnection reason: An error occurred. - */ - public static final int DISCONNECTION_REASON_ERROR = 2; - - /** @hide */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(flag = true, value = { ROUTE_FEATURE_LIVE_AUDIO, ROUTE_FEATURE_LIVE_VIDEO }) - public @interface RouteFeatures { } - - /** - * Route feature: Live audio. - * <p> - * A route that supports live audio streams audio rendered by the application - * to the destination. - * </p><p> - * To take advantage of live audio routing, the application must render its - * media using the audio attributes specified by {@link #getPreferredAudioAttributes}. - * </p> - * - * @see #getPreferredAudioAttributes - * @see android.media.AudioAttributes - */ - public static final int ROUTE_FEATURE_LIVE_AUDIO = 1 << 0; - - /** - * Route feature: Live video. - * <p> - * A route that supports live video streams video rendered by the application - * to the destination. - * </p><p> - * To take advantage of live video routing, the application must render its - * media to a {@link android.app.Presentation presentation window} on the - * display specified by {@link #getPreferredPresentationDisplay}. - * </p> - * - * @see #getPreferredPresentationDisplay - * @see android.app.Presentation - */ - public static final int ROUTE_FEATURE_LIVE_VIDEO = 1 << 1; - - /** - * Creates a media router. - * - * @param context The context with which the router is associated. - */ - public MediaRouter(@NonNull Context context) { - if (context == null) { - throw new IllegalArgumentException("context must not be null"); - } - - mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE); - } - - /** @hide */ - public IMediaRouter getBinder() { - // todo - return null; - } - - /** - * Disconnects from the selected destination and releases the media router. - * <p> - * This method should be called by the application when it no longer requires - * the media router to ensure that all bound resources may be cleaned up. - * </p> - */ - public void release() { - synchronized (mLock) { - mReleased = true; - // todo - } - } - - /** - * Returns true if the media router has been released. - */ - public boolean isReleased() { - synchronized (mLock) { - return mReleased; - } - } - - /** - * Gets the current route discovery state. - * - * @return The current discovery state: one of {@link #DISCOVERY_STATE_STOPPED}, - * {@link #DISCOVERY_STATE_STARTED}. - */ - public @DiscoveryState int getDiscoveryState() { - synchronized (mLock) { - return mDiscoveryState; - } - } - - /** - * Gets the current route connection state. - * - * @return The current state: one of {@link #CONNECTION_STATE_DISCONNECTED}, - * {@link #CONNECTION_STATE_CONNECTING} or {@link #CONNECTION_STATE_CONNECTED}. - */ - public @ConnectionState int getConnectionState() { - synchronized (mLock) { - return mConnectionState; - } - } - - /** - * Creates a media router delegate through which the destination of the media - * router may be controlled. - * <p> - * This is the point of entry for UI code that initiates discovery and - * connection to routes. - * </p> - */ - public @NonNull Delegate createDelegate() { - return null; // todo - } - - /** - * Sets a callback to participate in route discovery, filtering, and connection - * establishment. - * - * @param callback The callback to set, or null if none. - * @param handler The handler to receive callbacks, or null to use the current thread. - */ - public void setRoutingCallback(@Nullable RoutingCallback callback, - @Nullable Handler handler) { - synchronized (mLock) { - if (callback == null) { - mRoutingCallback = null; - mRoutingCallbackHandler = null; - } else { - mRoutingCallback = callback; - mRoutingCallbackHandler = handler != null ? handler : new Handler(); - } - } - } - - /** - * Adds a media route selector to use to find destinations that have - * routes with the specified capabilities during route discovery. - */ - public void addSelector(@NonNull MediaRouteSelector selector) { - if (selector == null) { - throw new IllegalArgumentException("selector must not be null"); - } - - synchronized (mLock) { - if (!mSelectors.contains(selector)) { - mSelectors.add(selector); - // todo - } - } - } - - /** - * Removes a media route selector. - */ - public void removeSelector(@NonNull MediaRouteSelector selector) { - if (selector == null) { - throw new IllegalArgumentException("selector must not be null"); - } - - synchronized (mLock) { - if (mSelectors.remove(selector)) { - // todo - } - } - } - - /** - * Removes all media route selectors. - * <p> - * Note that at least one selector must be added in order to perform discovery. - * </p> - */ - public void clearSelectors() { - synchronized (mLock) { - if (!mSelectors.isEmpty()) { - mSelectors.clear(); - // todo - } - } - } - - /** - * Gets a list of all media route selectors to consider during discovery. - */ - public @NonNull List<MediaRouteSelector> getSelectors() { - synchronized (mLock) { - return new ArrayList<MediaRouteSelector>(mSelectors); - } - } - - /** - * Gets the connection to the currently selected route. - * - * @return The connection to the currently selected route, or null if not connected. - */ - public @NonNull ConnectionInfo getConnection() { - synchronized (mLock) { - return mConnection; - } - } - - /** - * Gets the list of discovered destinations. - * <p> - * This list is only valid while discovery is running and is null otherwise. - * </p> - * - * @return The list of discovered destinations, or null if discovery is not running. - */ - public @NonNull List<DestinationInfo> getDiscoveredDestinations() { - synchronized (mLock) { - if (mDiscoveryState == DISCOVERY_STATE_STARTED) { - return new ArrayList<DestinationInfo>(mDiscoveredDestinations.keySet()); - } - return null; - } - } - - /** - * Gets the list of discovered routes for a particular destination. - * <p> - * This list is only valid while discovery is running and is null otherwise. - * </p> - * - * @param destination The destination for which to get the list of discovered routes. - * @return The list of discovered routes for the destination, or null if discovery - * is not running. - */ - public @NonNull List<RouteInfo> getDiscoveredRoutes(@NonNull DestinationInfo destination) { - if (destination == null) { - throw new IllegalArgumentException("destination must not be null"); - } - synchronized (mLock) { - if (mDiscoveryState == DISCOVERY_STATE_STARTED) { - List<RouteInfo> routes = mDiscoveredDestinations.get(destination); - if (routes != null) { - return new ArrayList<RouteInfo>(routes); - } - } - return null; - } - } - - /** - * Gets the destination that has been selected. - * - * @return The selected destination, or null if disconnected. - */ - public @Nullable DestinationInfo getSelectedDestination() { - synchronized (mLock) { - return mSelectedRoute != null ? mSelectedRoute.getDestination() : null; - } - } - - /** - * Gets the route that has been selected. - * - * @return The selected destination, or null if disconnected. - */ - public @Nullable RouteInfo getSelectedRoute() { - synchronized (mLock) { - return mSelectedRoute; - } - } - - /** - * Gets the preferred audio attributes that should be used to stream live audio content - * based on the connected route. - * <p> - * Use an {@link AudioTrack} to send audio content to the destination with these - * audio attributes. - * </p><p> - * The preferred audio attributes may change when a connection is established but it - * will remain constant until disconnected. - * </p> - * - * @return The preferred audio attributes to use. When connected, returns the - * route's audio attributes or null if it does not support live audio streaming. - * Otherwise returns audio attributes associated with {@link AudioAttributes#USAGE_MEDIA}. - */ - public @Nullable AudioAttributes getPreferredAudioAttributes() { - synchronized (mLock) { - if (mConnection != null) { - return mConnection.getAudioAttributes(); - } - return new AudioAttributes.Builder() - .setLegacyStreamType(AudioManager.STREAM_MUSIC) - .build(); - } - } - - /** - * Gets the preferred presentation display that should be used to stream live video content - * based on the connected route. - * <p> - * Use a {@link Presentation} to send video content to the destination with this display. - * </p><p> - * The preferred presentation display may change when a connection is established but it - * will remain constant until disconnected. - * </p> - * - * @return The preferred presentation display to use. When connected, returns - * the route's presentation display or null if it does not support live video - * streaming. Otherwise returns the first available - * {@link DisplayManager#DISPLAY_CATEGORY_PRESENTATION presentation display}, - * such as a mirrored wireless or HDMI display or null if none. - */ - public @Nullable Display getPreferredPresentationDisplay() { - synchronized (mLock) { - if (mConnection != null) { - return mConnection.getPresentationDisplay(); - } - Display[] displays = mDisplayManager.getDisplays( - DisplayManager.DISPLAY_CATEGORY_PRESENTATION); - return displays.length != 0 ? displays[0] : null; - } - } - - /** - * Gets the preferred volume provider that should be used to control the volume - * of content rendered on the currently selected route. - * <p> - * The preferred volume provider may change when a connection is established but it - * will remain the same until disconnected. - * </p> - * - * @return The preferred volume provider to use, or null if the currently - * selected route does not support remote volume adjustment or if the connection - * is not yet established. If no route is selected, returns null to indicate - * that system volume control should be used. - */ - public @Nullable VolumeProvider getPreferredVolumeProvider() { - synchronized (mLock) { - if (mConnection != null) { - return mConnection.getVolumeProvider(); - } - return null; - } - } - - /** - * Requests to pause streaming of live audio or video routes. - * Should be called when the application is going into the background and is - * no longer rendering content locally. - * <p> - * This method does nothing unless a connection has been established. - * </p> - */ - public void pauseStream() { - // todo - } - - /** - * Requests to resume streaming of live audio or video routes. - * May be called when the application is returning to the foreground and is - * about to resume rendering content locally. - * <p> - * This method does nothing unless a connection has been established. - * </p> - */ - public void resumeStream() { - // todo - } - - /** - * This class is used by UI components to let the user discover and - * select a destination to which the media router should connect. - * <p> - * This API has somewhat more limited functionality than the {@link MediaRouter} - * itself because it is designed to allow applications to control - * the destination of media router instances that belong to other processes. - * </p><p> - * To control the destination of your own media router, call - * {@link #createDelegate} to obtain a local delegate object. - * </p><p> - * To control the destination of a media router that belongs to another process, - * first obtain a {@link MediaController} that is associated with the media playback - * that is occurring in that process, then call - * {@link MediaController#createMediaRouterDelegate} to obtain an instance of - * its destination controls. Note that special permissions may be required to - * obtain the {@link MediaController} instance in the first place. - * </p> - */ - public static final class Delegate { - /** - * Returns true if the media router has been released. - */ - public boolean isReleased() { - // todo - return false; - } - - /** - * Gets the current route discovery state. - * - * @return The current discovery state: one of {@link #DISCOVERY_STATE_STOPPED}, - * {@link #DISCOVERY_STATE_STARTED}. - */ - public @DiscoveryState int getDiscoveryState() { - // todo - return -1; - } - - /** - * Gets the current route connection state. - * - * @return The current state: one of {@link #CONNECTION_STATE_DISCONNECTED}, - * {@link #CONNECTION_STATE_CONNECTING} or {@link #CONNECTION_STATE_CONNECTED}. - */ - public @ConnectionState int getConnectionState() { - // todo - return -1; - } - - /** - * Gets the currently selected destination. - * - * @return The destination information, or null if none. - */ - public @Nullable DestinationInfo getSelectedDestination() { - return null; - } - - /** - * Gets the list of discovered destinations. - * <p> - * This list is only valid while discovery is running and is null otherwise. - * </p> - * - * @return The list of discovered destinations, or null if discovery is not running. - */ - public @NonNull List<DestinationInfo> getDiscoveredDestinations() { - return null; - } - - /** - * Adds a callback to receive state changes. - * - * @param callback The callback to set, or null if none. - * @param handler The handler to receive callbacks, or null to use the current thread. - */ - public void addStateCallback(@Nullable StateCallback callback, - @Nullable Handler handler) { - if (callback == null) { - throw new IllegalArgumentException("callback must not be null"); - } - if (handler == null) { - handler = new Handler(); - } - // todo - } - - /** - * Removes a callback for state changes. - * - * @param callback The callback to set, or null if none. - */ - public void removeStateCallback(@Nullable StateCallback callback) { - // todo - } - - /** - * Starts performing discovery. - * <p> - * Performing discovery is expensive. Make sure to call {@link #stopDiscovery} - * as soon as possible once a new destination has been selected to allow the system - * to stop services associated with discovery. - * </p> - * - * @param flags The discovery flags, such as {@link MediaRouter#DISCOVERY_FLAG_BACKGROUND}. - */ - public void startDiscovery(@DiscoveryFlags int flags) { - // todo - } - - /** - * Stops performing discovery. - */ - public void stopDiscovery() { - // todo - } - - /** - * Connects to a destination during route discovery. - * <p> - * This method may only be called while route discovery is active and the - * destination appears in the - * {@link #getDiscoveredDestinations list of discovered destinations}. - * If the media router is already connected to a route then it will first disconnect - * from the current route then connect to the new route. - * </p> - * - * @param destination The destination to which the media router should connect. - * @param flags The connection flags, such as {@link MediaRouter#CONNECTION_FLAG_BARGE}. - */ - public void connect(@NonNull DestinationInfo destination, @DiscoveryFlags int flags) { - // todo - } - - /** - * Disconnects from the currently selected destination. - * <p> - * Does nothing if not currently connected. - * </p> - * - * @param reason The reason for the disconnection: one of - * {@link #DISCONNECTION_REASON_APPLICATION_REQUEST}, - * {@link #DISCONNECTION_REASON_USER_REQUEST}, or {@link #DISCONNECTION_REASON_ERROR}. - */ - public void disconnect(@DisconnectionReason int reason) { - // todo - } - } - - /** - * Describes immutable properties of a connection to a route. - */ - public static final class ConnectionInfo { - private final RouteInfo mRoute; - private final AudioAttributes mAudioAttributes; - private final Display mPresentationDisplay; - private final VolumeProvider mVolumeProvider; - private final IBinder[] mProtocolBinders; - private final Object[] mProtocolInstances; - private final Bundle mExtras; - private final ArrayList<Closeable> mCloseables; - - private static final Class<?>[] MEDIA_ROUTE_PROTOCOL_CTOR_PARAMETERS = - new Class<?>[] { IBinder.class }; - - ConnectionInfo(RouteInfo route, - AudioAttributes audioAttributes, Display display, - VolumeProvider volumeProvider, IBinder[] protocolBinders, - Bundle extras, ArrayList<Closeable> closeables) { - mRoute = route; - mAudioAttributes = audioAttributes; - mPresentationDisplay = display; - mVolumeProvider = volumeProvider; - mProtocolBinders = protocolBinders; - mProtocolInstances = new Object[mProtocolBinders.length]; - mExtras = extras; - mCloseables = closeables; - } - - /** - * Gets the route that is connected. - */ - public @NonNull RouteInfo getRoute() { - return mRoute; - } - - /** - * Gets the audio attributes which the client should use to stream audio - * to the destination, or null if the route does not support live audio streaming. - */ - public @Nullable AudioAttributes getAudioAttributes() { - return mAudioAttributes; - } - - /** - * Gets the display which the client should use to stream video to the - * destination using a {@link Presentation}, or null if the route does not - * support live video streaming. - */ - public @Nullable Display getPresentationDisplay() { - return mPresentationDisplay; - } - - /** - * Gets the route's volume provider, or null if none. - */ - public @Nullable VolumeProvider getVolumeProvider() { - return mVolumeProvider; - } - - /** - * Gets the set of supported route features. - */ - public @RouteFeatures int getFeatures() { - return mRoute.getFeatures(); - } - - /** - * Gets the list of supported route protocols. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @NonNull List<String> getProtocols() { - return mRoute.getProtocols(); - } - - /** - * Gets an instance of a route protocol object that wraps the protocol binder - * and provides easy access to the protocol's functionality. - * <p> - * This is a convenience method which invokes {@link #getProtocolBinder(String)} - * using the name of the provided class then passes the resulting {@link IBinder} - * to a single-argument constructor of that class. - * </p><p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - @SuppressWarnings("unchecked") - public @Nullable <T> T getProtocolObject(Class<T> clazz) { - int index = getProtocols().indexOf(clazz.getName()); - if (index < 0) { - return null; - } - if (mProtocolInstances[index] == null && mProtocolBinders[index] != null) { - final Constructor<T> ctor; - try { - ctor = clazz.getConstructor(MEDIA_ROUTE_PROTOCOL_CTOR_PARAMETERS); - } catch (NoSuchMethodException ex) { - throw new RuntimeException("Could not find public constructor " - + "with IBinder argument in protocol class: " + clazz.getName(), ex); - } - try { - mProtocolInstances[index] = ctor.newInstance(mProtocolBinders[index]); - } catch (InstantiationException | IllegalAccessException - | InvocationTargetException ex) { - throw new RuntimeException("Could create instance of protocol class: " - + clazz.getName(), ex); - } - } - return (T)mProtocolInstances[index]; - } - - /** - * Gets the {@link IBinder} that provides access to the specified route protocol - * or null if the protocol is not supported. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @Nullable IBinder getProtocolBinder(@NonNull String name) { - int index = getProtocols().indexOf(name); - return index >= 0 ? mProtocolBinders[index] : null; - } - - /** - * Gets the {@link IBinder} that provides access to the specified route protocol - * at the given index in the protocol list or null if the protocol is not supported. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @Nullable IBinder getProtocolBinder(int index) { - return mProtocolBinders[index]; - } - - /** - * Gets optional extra media route service or protocol specific information about - * the connection. Use the service or protocol name as the prefix for - * any extras to avoid namespace collisions. - */ - public @Nullable Bundle getExtras() { - return mExtras; - } - - /** - * Closes all closeables associated with the connection when the connection - * is being torn down. - */ - void close() { - final int count = mCloseables.size(); - for (int i = 0; i < count; i++) { - try { - mCloseables.get(i).close(); - } catch (IOException ex) { - } - } - } - - @Override - public @NonNull String toString() { - return "ConnectionInfo{ route=" + mRoute - + ", audioAttributes=" + mAudioAttributes - + ", presentationDisplay=" + mPresentationDisplay - + ", volumeProvider=" + mVolumeProvider - + ", protocolBinders=" + mProtocolBinders + " }"; - } - - /** - * Builds {@link ConnectionInfo} objects. - */ - public static final class Builder { - private final RouteInfo mRoute; - private AudioAttributes mAudioAttributes; - private Display mPresentationDisplay; - private VolumeProvider mVolumeProvider; - private final IBinder[] mProtocols; - private Bundle mExtras; - private final ArrayList<Closeable> mCloseables = new ArrayList<Closeable>(); - - /** - * Creates a builder for connection information. - * - * @param route The route that is connected. - */ - public Builder(@NonNull RouteInfo route) { - if (route == null) { - throw new IllegalArgumentException("route"); - } - mRoute = route; - mProtocols = new IBinder[route.getProtocols().size()]; - } - - /** - * Sets the audio attributes which the client should use to stream audio - * to the destination, or null if the route does not support live audio streaming. - */ - public @NonNull Builder setAudioAttributes( - @Nullable AudioAttributes audioAttributes) { - mAudioAttributes = audioAttributes; - return this; - } - - /** - * Sets the display which the client should use to stream video to the - * destination using a {@link Presentation}, or null if the route does not - * support live video streaming. - */ - public @NonNull Builder setPresentationDisplay(@Nullable Display display) { - mPresentationDisplay = display; - return this; - } - - /** - * Sets the route's volume provider, or null if none. - */ - public @NonNull Builder setVolumeProvider(@Nullable VolumeProvider provider) { - mVolumeProvider = provider; - return this; - } - - /** - * Sets the binder stub of a supported route protocol using - * the protocol's fully qualified class name. The protocol must be one - * of those that was indicated as being supported by the route. - * <p> - * If the stub implements {@link Closeable} then it will automatically - * be closed when the client disconnects from the route. - * </p><p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @NonNull Builder setProtocolStub(@NonNull Class<?> clazz, - @NonNull IInterface stub) { - if (clazz == null) { - throw new IllegalArgumentException("clazz must not be null"); - } - if (stub == null) { - throw new IllegalArgumentException("stub must not be null"); - } - if (stub instanceof Closeable) { - mCloseables.add((Closeable)stub); - } - return setProtocolBinder(clazz.getName(), stub.asBinder()); - } - - /** - * Sets the binder interface of a supported route protocol by name. - * The protocol must be one of those that was indicated as being supported - * by the route. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @NonNull Builder setProtocolBinder(@NonNull String name, - @NonNull IBinder binder) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null or empty"); - } - if (binder == null) { - throw new IllegalArgumentException("binder must not be null"); - } - int index = mRoute.getProtocols().indexOf(name); - if (index < 0) { - throw new IllegalArgumentException("name must specify a protocol that " - + "the route actually declared that it supports: " - + "name=" + name + ", protocols=" + mRoute.getProtocols()); - } - mProtocols[index] = binder; - return this; - } - - /** - * Sets optional extra media route service or protocol specific information about - * the connection. Use the service or protocol name as the prefix for - * any extras to avoid namespace collisions. - */ - public @NonNull Builder setExtras(@Nullable Bundle extras) { - mExtras = extras; - return this; - } - - /** - * Builds the {@link ConnectionInfo} object. - */ - public @NonNull ConnectionInfo build() { - return new ConnectionInfo(mRoute, - mAudioAttributes, mPresentationDisplay, - mVolumeProvider, mProtocols, mExtras, mCloseables); - } - } - } - - /** - * Describes one particular way of routing media content to a destination - * according to the capabilities specified by a media route selector on behalf - * of an application. - */ - public static final class RouteInfo { - private final String mId; - private final DestinationInfo mDestination; - private final MediaRouteSelector mSelector; - private final int mFeatures; - private final ArrayList<String> mProtocols; - private final Bundle mExtras; - - RouteInfo(String id, DestinationInfo destination, MediaRouteSelector selector, - int features, ArrayList<String> protocols, Bundle extras) { - mId = id; - mDestination = destination; - mSelector = selector; - mFeatures = features; - mProtocols = protocols; - mExtras = extras; - } - - /** - * Gets the route's stable identifier. - * <p> - * The id is intended to uniquely identify the route among all routes that - * are offered by a particular destination in such a way that the client can - * refer to it at a later time. - * </p> - */ - public @NonNull String getId() { - return mId; - } - - /** - * Gets the destination that is offering this route. - */ - public @NonNull DestinationInfo getDestination() { - return mDestination; - } - - /** - * Gets the media route selector provided by the client for which this - * route was created. - * <p> - * It is implied that this route supports all of the required capabilities - * that were expressed in the selector. - * </p> - */ - public @NonNull MediaRouteSelector getSelector() { - return mSelector; - } - - /** - * Gets the set of supported route features. - */ - public @RouteFeatures int getFeatures() { - return mFeatures; - } - - /** - * Gets the list of supported route protocols. - * <p> - * Refer to <code>android.support.media.protocols.MediaRouteProtocol</code> - * for more information. - * </p> - */ - public @NonNull List<String> getProtocols() { - return mProtocols; - } - - /** - * Gets optional extra information about the route, or null if none. - */ - public @Nullable Bundle getExtras() { - return mExtras; - } - - @Override - public @NonNull String toString() { - return "RouteInfo{ id=" + mId + ", destination=" + mDestination - + ", features=0x" + Integer.toHexString(mFeatures) - + ", selector=" + mSelector + ", protocols=" + mProtocols - + ", extras=" + mExtras + " }"; - } - - /** - * Builds {@link RouteInfo} objects. - */ - public static final class Builder { - private final DestinationInfo mDestination; - private final String mId; - private final MediaRouteSelector mSelector; - private int mFeatures; - private final ArrayList<String> mProtocols = new ArrayList<String>(); - private Bundle mExtras; - - /** - * Creates a builder for route information. - * - * @param id The route's stable identifier. - * @param destination The destination of this route. - * @param selector The media route selector provided by the client for which - * this route was created. This must be one of the selectors that was - * included in the discovery request. - */ - public Builder(@NonNull String id, @NonNull DestinationInfo destination, - @NonNull MediaRouteSelector selector) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("id must not be null or empty"); - } - if (destination == null) { - throw new IllegalArgumentException("destination must not be null"); - } - if (selector == null) { - throw new IllegalArgumentException("selector must not be null"); - } - mDestination = destination; - mId = id; - mSelector = selector; - } - - /** - * Sets the set of supported route features. - */ - public @NonNull Builder setFeatures(@RouteFeatures int features) { - mFeatures = features; - return this; - } - - /** - * Adds a supported route protocol using its fully qualified class name. - * <p> - * If the protocol was not requested by the client in its selector - * then it will be silently discarded. - * </p> - */ - public @NonNull <T extends IInterface> Builder addProtocol(@NonNull Class<T> clazz) { - if (clazz == null) { - throw new IllegalArgumentException("clazz must not be null"); - } - return addProtocol(clazz.getName()); - } - - /** - * Adds a supported route protocol by name. - * <p> - * If the protocol was not requested by the client in its selector - * then it will be silently discarded. - * </p> - */ - public @NonNull Builder addProtocol(@NonNull String name) { - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null"); - } - if (mSelector.containsProtocol(name)) { - mProtocols.add(name); - } - return this; - } - - /** - * Sets optional extra information about the route, or null if none. - */ - public @NonNull Builder setExtras(@Nullable Bundle extras) { - mExtras = extras; - return this; - } - - /** - * Builds the {@link RouteInfo} object. - * <p> - * Ensures that all required protocols have been supplied. - * </p> - */ - public @NonNull RouteInfo build() { - int missingFeatures = mSelector.getRequiredFeatures() & ~mFeatures; - if (missingFeatures != 0) { - throw new IllegalStateException("The media route selector " - + "specified required features which this route does " - + "not appear to support so it should not have been published: " - + "missing 0x" + Integer.toHexString(missingFeatures)); - } - for (String protocol : mSelector.getRequiredProtocols()) { - if (!mProtocols.contains(protocol)) { - throw new IllegalStateException("The media route selector " - + "specified required protocols which this route " - + "does not appear to support so it should not have " - + "been published: missing " + protocol); - } - } - return new RouteInfo(mId, mDestination, mSelector, - mFeatures, mProtocols, mExtras); - } - } - } - - /** - * Describes a destination for media content such as a device, - * an individual port on a device, or a group of devices. - */ - public static final class DestinationInfo { - private final String mId; - private final ServiceMetadata mService; - private final CharSequence mName; - private final CharSequence mDescription; - private final int mIconResourceId; - private final Bundle mExtras; - - DestinationInfo(String id, ServiceMetadata service, - CharSequence name, CharSequence description, - int iconResourceId, Bundle extras) { - mId = id; - mService = service; - mName = name; - mDescription = description; - mIconResourceId = iconResourceId; - mExtras = extras; - } - - /** - * Gets the destination's stable identifier. - * <p> - * The id is intended to uniquely identify the destination among all destinations - * provided by the media route service in such a way that the client can - * refer to it at a later time. Ideally, the id should be resilient to - * user-initiated actions such as changes to the name or description - * of the destination. - * </p> - */ - public @NonNull String getId() { - return mId; - } - - /** - * Gets metadata about the service that is providing access to this destination. - */ - public @NonNull ServiceMetadata getServiceMetadata() { - return mService; - } - - /** - * Gets the destination's name for display to the user. - */ - public @NonNull CharSequence getName() { - return mName; - } - - /** - * Gets the destination's description for display to the user, or null if none. - */ - public @Nullable CharSequence getDescription() { - return mDescription; - } - - /** - * Gets an icon resource from the service's package which is used - * to identify the destination, or -1 if none. - */ - public @DrawableRes int getIconResourceId() { - return mIconResourceId; - } - - /** - * Loads the icon drawable, or null if none. - */ - public @Nullable Drawable loadIcon(@NonNull PackageManager pm) { - return mIconResourceId >= 0 ? mService.getDrawable(pm, mIconResourceId) : null; - } - - /** - * Gets optional extra information about the destination, or null if none. - */ - public @Nullable Bundle getExtras() { - return mExtras; - } - - @Override - public @NonNull String toString() { - return "DestinationInfo{ id=" + mId + ", service=" + mService + ", name=" + mName - + ", description=" + mDescription + ", iconResourceId=" + mIconResourceId - + ", extras=" + mExtras + " }"; - } - - /** - * Builds {@link DestinationInfo} objects. - */ - public static final class Builder { - private final String mId; - private final ServiceMetadata mService; - private final CharSequence mName; - private CharSequence mDescription; - private int mIconResourceId = -1; - private Bundle mExtras; - - /** - * Creates a builder for destination information. - * - * @param id The destination's stable identifier. - * @param service Metatada about the service that is providing access to - * this destination. - * @param name The destination's name for display to the user. - */ - public Builder(@NonNull String id, @NonNull ServiceMetadata service, - @NonNull CharSequence name) { - if (TextUtils.isEmpty(id)) { - throw new IllegalArgumentException("id must not be null or empty"); - } - if (service == null) { - throw new IllegalArgumentException("service must not be null"); - } - if (TextUtils.isEmpty(name)) { - throw new IllegalArgumentException("name must not be null or empty"); - } - mId = id; - mService = service; - mName = name; - } - - /** - * Sets the destination's description for display to the user, or null if none. - */ - public @NonNull Builder setDescription(@Nullable CharSequence description) { - mDescription = description; - return this; - } - - /** - * Sets an icon resource from this package used to identify the destination, - * or -1 if none. - */ - public @NonNull Builder setIconResourceId(@DrawableRes int resid) { - mIconResourceId = resid; - return this; - } - - /** - * Gets optional extra information about the destination, or null if none. - */ - public @NonNull Builder setExtras(@Nullable Bundle extras) { - mExtras = extras; - return this; - } - - /** - * Builds the {@link DestinationInfo} object. - */ - public @NonNull DestinationInfo build() { - return new DestinationInfo(mId, mService, mName, mDescription, - mIconResourceId, mExtras); - } - } - } - - /** - * Describes metadata about a {@link MediaRouteService} which is providing - * access to certain kinds of destinations. - */ - public static final class ServiceMetadata { - private final ServiceInfo mService; - private CharSequence mLabel; - private Drawable mIcon; - - ServiceMetadata(Service service) throws NameNotFoundException { - mService = service.getPackageManager().getServiceInfo( - new ComponentName(service, service.getClass()), - PackageManager.GET_META_DATA); - } - - ServiceMetadata(ServiceInfo service) { - mService = service; - } - - /** - * Gets the service's component information including it name, label and icon. - */ - public @NonNull ServiceInfo getService() { - return mService; - } - - /** - * Gets the service's component name. - */ - public @NonNull ComponentName getComponentName() { - return new ComponentName(mService.packageName, mService.name); - } - - /** - * Gets the service's package name. - */ - public @NonNull String getPackageName() { - return mService.packageName; - } - - /** - * Gets the service's name for display to the user, or null if none. - */ - public @NonNull CharSequence getLabel(@NonNull PackageManager pm) { - if (mLabel == null) { - mLabel = mService.loadLabel(pm); - } - return mLabel; - } - - /** - * Gets the icon drawable, or null if none. - */ - public @Nullable Drawable getIcon(@NonNull PackageManager pm) { - if (mIcon == null) { - mIcon = mService.loadIcon(pm); - } - return mIcon; - } - - // TODO: add service metadata - - Drawable getDrawable(PackageManager pm, int resid) { - return pm.getDrawable(getPackageName(), resid, mService.applicationInfo); - } - - @Override - public @NonNull String toString() { - return "ServiceInfo{ service=" + getComponentName().toShortString() + " }"; - } - } - - /** - * Describes a request to discover routes on behalf of an application. - */ - public static final class DiscoveryRequest { - private final ArrayList<MediaRouteSelector> mSelectors = - new ArrayList<MediaRouteSelector>(); - private int mFlags; - - DiscoveryRequest(@NonNull List<MediaRouteSelector> selectors) { - setSelectors(selectors); - } - - /** - * Sets the list of media route selectors to consider during discovery. - */ - public void setSelectors(@NonNull List<MediaRouteSelector> selectors) { - if (selectors == null) { - throw new IllegalArgumentException("selectors"); - } - mSelectors.clear(); - mSelectors.addAll(selectors); - } - - /** - * Gets the list of media route selectors to consider during discovery. - */ - public @NonNull List<MediaRouteSelector> getSelectors() { - return mSelectors; - } - - /** - * Gets discovery flags, such as {@link MediaRouter#DISCOVERY_FLAG_BACKGROUND}. - */ - public @DiscoveryFlags int getFlags() { - return mFlags; - } - - /** - * Sets discovery flags, such as {@link MediaRouter#DISCOVERY_FLAG_BACKGROUND}. - */ - public void setFlags(@DiscoveryFlags int flags) { - mFlags = flags; - } - - @Override - public @NonNull String toString() { - return "DiscoveryRequest{ selectors=" + mSelectors - + ", flags=0x" + Integer.toHexString(mFlags) - + " }"; - } - } - - /** - * Describes a request to connect to a previously discovered route on - * behalf of an application. - */ - public static final class ConnectionRequest { - private RouteInfo mRoute; - private int mFlags; - private Bundle mExtras; - - ConnectionRequest(@NonNull RouteInfo route) { - setRoute(route); - } - - /** - * Gets the route to which to connect. - */ - public @NonNull RouteInfo getRoute() { - return mRoute; - } - - /** - * Sets the route to which to connect. - */ - public void setRoute(@NonNull RouteInfo route) { - if (route == null) { - throw new IllegalArgumentException("route must not be null"); - } - mRoute = route; - } - - /** - * Gets connection flags, such as {@link MediaRouter#CONNECTION_FLAG_BARGE}. - */ - public @ConnectionFlags int getFlags() { - return mFlags; - } - - /** - * Sets connection flags, such as {@link MediaRouter#CONNECTION_FLAG_BARGE}. - */ - public void setFlags(@ConnectionFlags int flags) { - mFlags = flags; - } - - /** - * Gets optional extras supplied by the application as part of the call to - * connect, or null if none. The media route service may use this - * information to configure the route during connection. - */ - public @Nullable Bundle getExtras() { - return mExtras; - } - - /** - * Sets optional extras supplied by the application as part of the call to - * connect, or null if none. The media route service may use this - * information to configure the route during connection. - */ - public void setExtras(@Nullable Bundle extras) { - mExtras = extras; - } - - @Override - public @NonNull String toString() { - return "ConnectionRequest{ route=" + mRoute - + ", flags=0x" + Integer.toHexString(mFlags) - + ", extras=" + mExtras + " }"; - } - } - - /** - * Callback interface to specify policy for route discovery, filtering, - * and connection establishment as well as observe media router state changes. - */ - public static abstract class RoutingCallback extends StateCallback { - /** - * Called to prepare a discovery request object to specify the desired - * media route selectors when the media router has been asked to start discovery. - * <p> - * By default, the discovery request contains all of the selectors which - * have been added to the media router. Subclasses may override the list of - * selectors by modifying the discovery request object before returning. - * </p> - * - * @param request The discovery request object which may be modified by - * this method to alter how discovery will be performed. - * @param selectors The immutable list of media route selectors which were - * added to the media router. - * @return True to allow discovery to proceed or false to abort it. - * By default, this methods returns true. - */ - public boolean onPrepareDiscoveryRequest(@NonNull DiscoveryRequest request, - @NonNull List<MediaRouteSelector> selectors) { - return true; - } - - /** - * Called to prepare a connection request object to specify the desired - * route and connection parameters when the media router has been asked to - * connect to a particular destination. - * <p> - * By default, the connection request specifies the first available route - * to the destination. Subclasses may override the route and destination - * or set additional connection parameters by modifying the connection request - * object before returning. - * </p> - * - * @param request The connection request object which may be modified by - * this method to alter how the connection will be established. - * @param destination The destination to which the media router was asked - * to connect. - * @param routes The list of routes that belong to that destination sorted - * in the same order as their matching media route selectors which were - * used during discovery. - * @return True to allow the connection to proceed or false to abort it. - * By default, this methods returns true. - */ - public boolean onPrepareConnectionRequest( - @NonNull ConnectionRequest request, - @NonNull DestinationInfo destination, @NonNull List<RouteInfo> routes) { - return true; - } - } - - /** - * Callback class to receive events from a {@link MediaRouter.Delegate}. - */ - public static abstract class StateCallback { - /** - * Called when the media router has been released. - */ - public void onReleased() { } - - /** - * Called when the discovery state has changed. - * - * @param state The new discovery state: one of - * {@link #DISCOVERY_STATE_STOPPED} or {@link #DISCOVERY_STATE_STARTED}. - */ - public void onDiscoveryStateChanged(@DiscoveryState int state) { } - - /** - * Called when the connection state has changed. - * - * @param state The new connection state: one of - * {@link #CONNECTION_STATE_DISCONNECTED}, {@link #CONNECTION_STATE_CONNECTING} - * or {@link #CONNECTION_STATE_CONNECTED}. - */ - public void onConnectionStateChanged(@ConnectionState int state) { } - - /** - * Called when the selected destination has changed. - * - * @param destination The new selected destination, or null if none. - */ - public void onSelectedDestinationChanged(@Nullable DestinationInfo destination) { } - - /** - * Called when route discovery has started. - */ - public void onDiscoveryStarted() { } - - /** - * Called when route discovery has stopped normally. - * <p> - * Abnormal termination is reported via {@link #onDiscoveryFailed}. - * </p> - */ - public void onDiscoveryStopped() { } - - /** - * Called when discovery has failed in a non-recoverable manner. - * - * @param error The error code: one of - * {@link MediaRouter#DISCOVERY_ERROR_UNKNOWN}, - * {@link MediaRouter#DISCOVERY_ERROR_ABORTED}, - * or {@link MediaRouter#DISCOVERY_ERROR_NO_CONNECTIVITY}. - * @param message The localized error message, or null if none. This message - * may be shown to the user. - * @param extras Additional information about the error which a client - * may use, or null if none. - */ - public void onDiscoveryFailed(@DiscoveryError int error, @Nullable CharSequence message, - @Nullable Bundle extras) { } - - /** - * Called when a new destination is found or has changed during discovery. - * <p> - * Certain destinations may be omitted because they have been filtered - * out by the media router's routing callback. - * </p> - * - * @param destination The destination that was found. - */ - public void onDestinationFound(@NonNull DestinationInfo destination) { } - - /** - * Called when a destination is no longer reachable or is no longer - * offering any routes that satisfy the discovery request. - * - * @param destination The destination that went away. - */ - public void onDestinationLost(@NonNull DestinationInfo destination) { } - - /** - * Called when a connection attempt begins. - */ - public void onConnecting() { } - - /** - * Called when the connection succeeds. - */ - public void onConnected() { } - - /** - * Called when the connection is terminated normally. - * <p> - * Abnormal termination is reported via {@link #onConnectionFailed}. - * </p> - */ - public void onDisconnected() { } - - /** - * Called when a connection attempt or connection in - * progress has failed in a non-recoverable manner. - * - * @param error The error code: one of - * {@link MediaRouter#CONNECTION_ERROR_ABORTED}, - * {@link MediaRouter#CONNECTION_ERROR_UNAUTHORIZED}, - * {@link MediaRouter#CONNECTION_ERROR_UNREACHABLE}, - * {@link MediaRouter#CONNECTION_ERROR_BUSY}, - * {@link MediaRouter#CONNECTION_ERROR_TIMEOUT}, - * {@link MediaRouter#CONNECTION_ERROR_BROKEN}, - * or {@link MediaRouter#CONNECTION_ERROR_BARGED}. - * @param message The localized error message, or null if none. This message - * may be shown to the user. - * @param extras Additional information about the error which a client - * may use, or null if none. - */ - public void onConnectionFailed(@ConnectionError int error, - @Nullable CharSequence message, @Nullable Bundle extras) { } - } -} diff --git a/media/java/android/media/routing/ParcelableConnectionInfo.aidl b/media/java/android/media/routing/ParcelableConnectionInfo.aidl deleted file mode 100644 index 4a9ec9481c13..000000000000 --- a/media/java/android/media/routing/ParcelableConnectionInfo.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 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. -*/ - -package android.media.routing; - -parcelable ParcelableConnectionInfo; diff --git a/media/java/android/media/routing/ParcelableConnectionInfo.java b/media/java/android/media/routing/ParcelableConnectionInfo.java deleted file mode 100644 index 45cfe9fcf2f5..000000000000 --- a/media/java/android/media/routing/ParcelableConnectionInfo.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.media.AudioAttributes; -import android.os.Bundle; -import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Internal parcelable representation of a media route connection. - */ -class ParcelableConnectionInfo implements Parcelable { - public AudioAttributes audioAttributes; - public int presentationDisplayId = -1; - // todo: volume - public IBinder[] protocolBinders; - public Bundle extras; - - public static final Parcelable.Creator<ParcelableConnectionInfo> CREATOR = - new Parcelable.Creator<ParcelableConnectionInfo>() { - @Override - public ParcelableConnectionInfo createFromParcel(Parcel source) { - ParcelableConnectionInfo info = new ParcelableConnectionInfo(); - if (source.readInt() != 0) { - info.audioAttributes = AudioAttributes.CREATOR.createFromParcel(source); - } - info.presentationDisplayId = source.readInt(); - info.protocolBinders = source.createBinderArray(); - info.extras = source.readBundle(); - return info; - } - - @Override - public ParcelableConnectionInfo[] newArray(int size) { - return new ParcelableConnectionInfo[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - if (audioAttributes != null) { - dest.writeInt(1); - audioAttributes.writeToParcel(dest, flags); - } else { - dest.writeInt(0); - } - dest.writeInt(presentationDisplayId); - dest.writeBinderArray(protocolBinders); - dest.writeBundle(extras); - } -} diff --git a/media/java/android/media/routing/ParcelableDestinationInfo.aidl b/media/java/android/media/routing/ParcelableDestinationInfo.aidl deleted file mode 100644 index bf1c198e5dca..000000000000 --- a/media/java/android/media/routing/ParcelableDestinationInfo.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 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. -*/ - -package android.media.routing; - -parcelable ParcelableDestinationInfo; diff --git a/media/java/android/media/routing/ParcelableDestinationInfo.java b/media/java/android/media/routing/ParcelableDestinationInfo.java deleted file mode 100644 index eca5eec8c069..000000000000 --- a/media/java/android/media/routing/ParcelableDestinationInfo.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; - -/** - * Internal parcelable representation of a media destination. - */ -class ParcelableDestinationInfo implements Parcelable { - public String id; - public CharSequence name; - public CharSequence description; - public int iconResourceId; - public Bundle extras; - - public static final Parcelable.Creator<ParcelableDestinationInfo> CREATOR = - new Parcelable.Creator<ParcelableDestinationInfo>() { - @Override - public ParcelableDestinationInfo createFromParcel(Parcel source) { - ParcelableDestinationInfo info = new ParcelableDestinationInfo(); - info.id = source.readString(); - info.name = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); - info.description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(source); - info.iconResourceId = source.readInt(); - info.extras = source.readBundle(); - return info; - } - - @Override - public ParcelableDestinationInfo[] newArray(int size) { - return new ParcelableDestinationInfo[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - TextUtils.writeToParcel(name, dest, flags); - TextUtils.writeToParcel(description, dest, flags); - dest.writeInt(iconResourceId); - dest.writeBundle(extras); - } -} diff --git a/media/java/android/media/routing/ParcelableRouteInfo.aidl b/media/java/android/media/routing/ParcelableRouteInfo.aidl deleted file mode 100644 index 126afaa9d037..000000000000 --- a/media/java/android/media/routing/ParcelableRouteInfo.aidl +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright 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. -*/ - -package android.media.routing; - -parcelable ParcelableRouteInfo; diff --git a/media/java/android/media/routing/ParcelableRouteInfo.java b/media/java/android/media/routing/ParcelableRouteInfo.java deleted file mode 100644 index fb1a547c7ca7..000000000000 --- a/media/java/android/media/routing/ParcelableRouteInfo.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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. - */ -package android.media.routing; - -import android.os.Bundle; -import android.os.Parcel; -import android.os.Parcelable; - -/** - * Internal parcelable representation of a media route. - */ -class ParcelableRouteInfo implements Parcelable { - public String id; - public int selectorIndex; // index of selector within list used for discovery - public int features; - public String[] protocols; - public Bundle extras; - - public static final Parcelable.Creator<ParcelableRouteInfo> CREATOR = - new Parcelable.Creator<ParcelableRouteInfo>() { - @Override - public ParcelableRouteInfo createFromParcel(Parcel source) { - ParcelableRouteInfo info = new ParcelableRouteInfo(); - info.id = source.readString(); - info.selectorIndex = source.readInt(); - info.features = source.readInt(); - info.protocols = source.createStringArray(); - info.extras = source.readBundle(); - return info; - } - - @Override - public ParcelableRouteInfo[] newArray(int size) { - return new ParcelableRouteInfo[size]; - } - }; - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeString(id); - dest.writeInt(selectorIndex); - dest.writeInt(features); - dest.writeStringArray(protocols); - dest.writeBundle(extras); - } -} diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl index af3b72e7f49f..bd0019f0f1d8 100644 --- a/media/java/android/media/session/ISession.aidl +++ b/media/java/android/media/session/ISession.aidl @@ -19,7 +19,6 @@ import android.app.PendingIntent; import android.content.pm.ParceledListSlice; import android.media.AudioAttributes; import android.media.MediaMetadata; -import android.media.routing.IMediaRouter; import android.media.session.ISessionController; import android.media.session.PlaybackState; import android.media.session.MediaSession; @@ -35,7 +34,6 @@ interface ISession { ISessionController getController(); void setFlags(int flags); void setActive(boolean active); - void setMediaRouter(in IMediaRouter router); void setMediaButtonReceiver(in PendingIntent mbr); void setLaunchPendingIntent(in PendingIntent pi); void destroy(); diff --git a/media/java/android/media/session/ISessionController.aidl b/media/java/android/media/session/ISessionController.aidl index 8d58a607f39d..285e5f7a0880 100644 --- a/media/java/android/media/session/ISessionController.aidl +++ b/media/java/android/media/session/ISessionController.aidl @@ -20,8 +20,6 @@ import android.content.Intent; import android.content.pm.ParceledListSlice; import android.media.MediaMetadata; import android.media.Rating; -import android.media.routing.IMediaRouterDelegate; -import android.media.routing.IMediaRouterStateCallback; import android.media.session.ISessionControllerCallback; import android.media.session.MediaSession; import android.media.session.ParcelableVolumeInfo; @@ -51,8 +49,6 @@ interface ISessionController { void adjustVolume(int direction, int flags, String packageName); void setVolumeTo(int value, int flags, String packageName); - IMediaRouterDelegate createMediaRouterDelegate(IMediaRouterStateCallback callback); - // These commands are for the TransportControls void play(); void playFromMediaId(String mediaId, in Bundle extras); diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java index dd81a228b51b..2acee0475b0b 100644 --- a/media/java/android/media/session/MediaController.java +++ b/media/java/android/media/session/MediaController.java @@ -26,7 +26,6 @@ import android.media.AudioManager; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; -import android.media.routing.MediaRouter; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -120,17 +119,6 @@ public final class MediaController { } /** - * Creates a media router delegate through which the destination of the media - * router may be observed and controlled. - * - * @return The media router delegate, or null if the media session does - * not support media routing. - */ - public @Nullable MediaRouter.Delegate createMediaRouterDelegate() { - return new MediaRouter.Delegate(); - } - - /** * Send the specified media button event to the session. Only media keys can * be sent by this method, other keys will be ignored. * diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java index cee82b4612d6..e1e9b792810f 100644 --- a/media/java/android/media/session/MediaSession.java +++ b/media/java/android/media/session/MediaSession.java @@ -29,7 +29,6 @@ import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; -import android.media.routing.MediaRouter; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -225,23 +224,6 @@ public final class MediaSession { } /** - * Associates a {@link MediaRouter} with this session to control the destination - * of media content. - * <p> - * A media router may only be associated with at most one session at a time. - * </p> - * - * @param router The media router, or null to remove the current association. - */ - public void setMediaRouter(@Nullable MediaRouter router) { - try { - mBinder.setMediaRouter(router != null ? router.getBinder() : null); - } catch (RemoteException e) { - Log.wtf(TAG, "Failure in setMediaButtonReceiver.", e); - } - } - - /** * Set a pending intent for your media button receiver to allow restarting * playback after the session has been stopped. If your app is started in * this way an {@link Intent#ACTION_MEDIA_BUTTON} intent will be sent via diff --git a/media/jni/Android.mk b/media/jni/Android.mk index dbb53b48f77f..51d014038779 100644 --- a/media/jni/Android.mk +++ b/media/jni/Android.mk @@ -20,7 +20,7 @@ LOCAL_SRC_FILES:= \ android_media_MediaScanner.cpp \ android_media_MediaSync.cpp \ android_media_ResampleInputStream.cpp \ - android_media_SyncSettings.cpp \ + android_media_SyncParams.cpp \ android_media_Utils.cpp \ android_mtp_MtpDatabase.cpp \ android_mtp_MtpDevice.cpp \ diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp index f808c0d1cf54..31fb37cf0a68 100644 --- a/media/jni/android_media_MediaCodec.cpp +++ b/media/jni/android_media_MediaCodec.cpp @@ -70,10 +70,10 @@ static struct CodecActionCodes { jint codecActionRecoverable; } gCodecActionCodes; -static struct ExceptionReason { - jint reasonHardware; - jint reasonReclaimed; -} gExceptionReason; +static struct CodecErrorCodes { + jint errorInsufficientResource; + jint errorReclaimed; +} gCodecErrorCodes; static struct { jclass clazz; @@ -600,7 +600,7 @@ static jthrowable createCodecException( env, env->FindClass("android/media/MediaCodec$CodecException")); CHECK(clazz.get() != NULL); - const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;I)V"); + const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;)V"); CHECK(ctor != NULL); ScopedLocalRef<jstring> msgObj( @@ -619,9 +619,19 @@ static jthrowable createCodecException( break; } - int reason = - (err == DEAD_OBJECT) ? gExceptionReason.reasonReclaimed : gExceptionReason.reasonHardware; - return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get(), reason); + /* translate OS errors to Java API CodecException errorCodes */ + switch (err) { + case NO_MEMORY: + err = gCodecErrorCodes.errorInsufficientResource; + break; + case DEAD_OBJECT: + err = gCodecErrorCodes.errorReclaimed; + break; + default: /* Other error codes go out as is. */ + break; + } + + return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get()); } void JMediaCodec::handleCallback(const sp<AMessage> &msg) { @@ -1636,14 +1646,14 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) { gCodecActionCodes.codecActionRecoverable = env->GetStaticIntField(clazz.get(), field); - field = env->GetStaticFieldID(clazz.get(), "REASON_HARDWARE", "I"); + field = env->GetStaticFieldID(clazz.get(), "ERROR_INSUFFICIENT_RESOURCE", "I"); CHECK(field != NULL); - gExceptionReason.reasonHardware = + gCodecErrorCodes.errorInsufficientResource = env->GetStaticIntField(clazz.get(), field); - field = env->GetStaticFieldID(clazz.get(), "REASON_RECLAIMED", "I"); + field = env->GetStaticFieldID(clazz.get(), "ERROR_RECLAIMED", "I"); CHECK(field != NULL); - gExceptionReason.reasonReclaimed = + gCodecErrorCodes.errorReclaimed = env->GetStaticIntField(clazz.get(), field); clazz.reset(env->FindClass("android/view/Surface")); @@ -1693,6 +1703,11 @@ static void android_media_MediaCodec_native_setup( String8::format("Failed to initialize %s, error %#x", tmp, err)); env->ReleaseStringUTFChars(name, tmp); return; + } if (err == NO_MEMORY) { + throwCodecException(env, err, ACTION_CODE_TRANSIENT, + String8::format("Failed to initialize %s, error %#x", tmp, err)); + env->ReleaseStringUTFChars(name, tmp); + return; } else if (err != OK) { // believed possible to try again jniThrowException(env, "java/io/IOException", diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 5b55a612e33a..d8041f4bff04 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -38,8 +38,8 @@ #include "utils/KeyedVector.h" #include "utils/String8.h" #include "android_media_MediaDataSource.h" -#include "android_media_PlaybackSettings.h" -#include "android_media_SyncSettings.h" +#include "android_media_PlaybackParams.h" +#include "android_media_SyncParams.h" #include "android_media_Utils.h" #include "android_os_Parcel.h" @@ -69,8 +69,8 @@ struct fields_t { }; static fields_t fields; -static PlaybackSettings::fields_t gPlaybackSettingsFields; -static SyncSettings::fields_t gSyncSettingsFields; +static PlaybackParams::fields_t gPlaybackParamsFields; +static SyncParams::fields_t gSyncParamsFields; static Mutex sLock; @@ -428,7 +428,7 @@ android_media_MediaPlayer_isPlaying(JNIEnv *env, jobject thiz) } static void -android_media_MediaPlayer_setPlaybackSettings(JNIEnv *env, jobject thiz, jobject settings) +android_media_MediaPlayer_setPlaybackParams(JNIEnv *env, jobject thiz, jobject params) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -436,32 +436,32 @@ android_media_MediaPlayer_setPlaybackSettings(JNIEnv *env, jobject thiz, jobject return; } - PlaybackSettings pbs; - pbs.fillFromJobject(env, gPlaybackSettingsFields, settings); - ALOGV("setPlaybackSettings: %d:%f %d:%f %d:%u %d:%u", - pbs.speedSet, pbs.audioRate.mSpeed, - pbs.pitchSet, pbs.audioRate.mPitch, - pbs.audioFallbackModeSet, pbs.audioRate.mFallbackMode, - pbs.audioStretchModeSet, pbs.audioRate.mStretchMode); + PlaybackParams pbp; + pbp.fillFromJobject(env, gPlaybackParamsFields, params); + ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", + pbp.speedSet, pbp.audioRate.mSpeed, + pbp.pitchSet, pbp.audioRate.mPitch, + pbp.audioFallbackModeSet, pbp.audioRate.mFallbackMode, + pbp.audioStretchModeSet, pbp.audioRate.mStretchMode); AudioPlaybackRate rate; status_t err = mp->getPlaybackSettings(&rate); if (err == OK) { bool updatedRate = false; - if (pbs.speedSet) { - rate.mSpeed = pbs.audioRate.mSpeed; + if (pbp.speedSet) { + rate.mSpeed = pbp.audioRate.mSpeed; updatedRate = true; } - if (pbs.pitchSet) { - rate.mPitch = pbs.audioRate.mPitch; + if (pbp.pitchSet) { + rate.mPitch = pbp.audioRate.mPitch; updatedRate = true; } - if (pbs.audioFallbackModeSet) { - rate.mFallbackMode = pbs.audioRate.mFallbackMode; + if (pbp.audioFallbackModeSet) { + rate.mFallbackMode = pbp.audioRate.mFallbackMode; updatedRate = true; } - if (pbs.audioStretchModeSet) { - rate.mStretchMode = pbs.audioRate.mStretchMode; + if (pbp.audioStretchModeSet) { + rate.mStretchMode = pbp.audioRate.mStretchMode; updatedRate = true; } if (updatedRate) { @@ -474,7 +474,7 @@ android_media_MediaPlayer_setPlaybackSettings(JNIEnv *env, jobject thiz, jobject } static jobject -android_media_MediaPlayer_getPlaybackSettings(JNIEnv *env, jobject thiz) +android_media_MediaPlayer_getPlaybackParams(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -482,24 +482,24 @@ android_media_MediaPlayer_getPlaybackSettings(JNIEnv *env, jobject thiz) return NULL; } - PlaybackSettings pbs; - AudioPlaybackRate &audioRate = pbs.audioRate; + PlaybackParams pbp; + AudioPlaybackRate &audioRate = pbp.audioRate; process_media_player_call( env, thiz, mp->getPlaybackSettings(&audioRate), "java/lang/IllegalStateException", "unexpected error"); ALOGV("getPlaybackSettings: %f %f %d %d", audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode); - pbs.speedSet = true; - pbs.pitchSet = true; - pbs.audioFallbackModeSet = true; - pbs.audioStretchModeSet = true; + pbp.speedSet = true; + pbp.pitchSet = true; + pbp.audioFallbackModeSet = true; + pbp.audioStretchModeSet = true; - return pbs.asJobject(env, gPlaybackSettingsFields); + return pbp.asJobject(env, gPlaybackParamsFields); } static void -android_media_MediaPlayer_setSyncSettings(JNIEnv *env, jobject thiz, jobject settings) +android_media_MediaPlayer_setSyncParams(JNIEnv *env, jobject thiz, jobject params) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -507,33 +507,33 @@ android_media_MediaPlayer_setSyncSettings(JNIEnv *env, jobject thiz, jobject set return; } - SyncSettings scs; - scs.fillFromJobject(env, gSyncSettingsFields, settings); - ALOGV("setSyncSettings: %d:%d %d:%d %d:%f %d:%f", - scs.syncSourceSet, scs.sync.mSource, - scs.audioAdjustModeSet, scs.sync.mAudioAdjustMode, - scs.toleranceSet, scs.sync.mTolerance, - scs.frameRateSet, scs.frameRate); + SyncParams scp; + scp.fillFromJobject(env, gSyncParamsFields, params); + ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f", + scp.syncSourceSet, scp.sync.mSource, + scp.audioAdjustModeSet, scp.sync.mAudioAdjustMode, + scp.toleranceSet, scp.sync.mTolerance, + scp.frameRateSet, scp.frameRate); AVSyncSettings avsync; float videoFrameRate; status_t err = mp->getSyncSettings(&avsync, &videoFrameRate); if (err == OK) { - bool updatedSync = scs.frameRateSet; - if (scs.syncSourceSet) { - avsync.mSource = scs.sync.mSource; + bool updatedSync = scp.frameRateSet; + if (scp.syncSourceSet) { + avsync.mSource = scp.sync.mSource; updatedSync = true; } - if (scs.audioAdjustModeSet) { - avsync.mAudioAdjustMode = scs.sync.mAudioAdjustMode; + if (scp.audioAdjustModeSet) { + avsync.mAudioAdjustMode = scp.sync.mAudioAdjustMode; updatedSync = true; } - if (scs.toleranceSet) { - avsync.mTolerance = scs.sync.mTolerance; + if (scp.toleranceSet) { + avsync.mTolerance = scp.sync.mTolerance; updatedSync = true; } if (updatedSync) { - err = mp->setSyncSettings(avsync, scs.frameRateSet ? scs.frameRate : -1.f); + err = mp->setSyncSettings(avsync, scp.frameRateSet ? scp.frameRate : -1.f); } } process_media_player_call( @@ -542,7 +542,7 @@ android_media_MediaPlayer_setSyncSettings(JNIEnv *env, jobject thiz, jobject set } static jobject -android_media_MediaPlayer_getSyncSettings(JNIEnv *env, jobject thiz) +android_media_MediaPlayer_getSyncParams(JNIEnv *env, jobject thiz) { sp<MediaPlayer> mp = getMediaPlayer(env, thiz); if (mp == NULL) { @@ -550,30 +550,30 @@ android_media_MediaPlayer_getSyncSettings(JNIEnv *env, jobject thiz) return NULL; } - SyncSettings scs; - scs.frameRate = -1.f; + SyncParams scp; + scp.frameRate = -1.f; process_media_player_call( - env, thiz, mp->getSyncSettings(&scs.sync, &scs.frameRate), + env, thiz, mp->getSyncSettings(&scp.sync, &scp.frameRate), "java/lang/IllegalStateException", "unexpected error"); ALOGV("getSyncSettings: %d %d %f %f", - scs.sync.mSource, scs.sync.mAudioAdjustMode, scs.sync.mTolerance, scs.frameRate); + scp.sync.mSource, scp.sync.mAudioAdjustMode, scp.sync.mTolerance, scp.frameRate); - // sanity check settings - if (scs.sync.mSource >= AVSYNC_SOURCE_MAX - || scs.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX - || scs.sync.mTolerance < 0.f - || scs.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) { + // sanity check params + if (scp.sync.mSource >= AVSYNC_SOURCE_MAX + || scp.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX + || scp.sync.mTolerance < 0.f + || scp.sync.mTolerance >= AVSYNC_TOLERANCE_MAX) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return NULL; } - scs.syncSourceSet = true; - scs.audioAdjustModeSet = true; - scs.toleranceSet = true; - scs.frameRateSet = scs.frameRate >= 0.f; + scp.syncSourceSet = true; + scp.audioAdjustModeSet = true; + scp.toleranceSet = true; + scp.frameRateSet = scp.frameRate >= 0.f; - return scs.asJobject(env, gSyncSettingsFields); + return scp.asJobject(env, gSyncParamsFields); } static void @@ -860,8 +860,8 @@ android_media_MediaPlayer_native_init(JNIEnv *env) env->DeleteLocalRef(clazz); - gPlaybackSettingsFields.init(env); - gSyncSettingsFields.init(env); + gPlaybackParamsFields.init(env); + gSyncParamsFields.init(env); } static void @@ -1050,10 +1050,10 @@ static JNINativeMethod gMethods[] = { {"_stop", "()V", (void *)android_media_MediaPlayer_stop}, {"getVideoWidth", "()I", (void *)android_media_MediaPlayer_getVideoWidth}, {"getVideoHeight", "()I", (void *)android_media_MediaPlayer_getVideoHeight}, - {"setPlaybackSettings", "(Landroid/media/PlaybackSettings;)V", (void *)android_media_MediaPlayer_setPlaybackSettings}, - {"getPlaybackSettings", "()Landroid/media/PlaybackSettings;", (void *)android_media_MediaPlayer_getPlaybackSettings}, - {"setSyncSettings", "(Landroid/media/SyncSettings;)V", (void *)android_media_MediaPlayer_setSyncSettings}, - {"getSyncSettings", "()Landroid/media/SyncSettings;", (void *)android_media_MediaPlayer_getSyncSettings}, + {"setPlaybackParams", "(Landroid/media/PlaybackParams;)V", (void *)android_media_MediaPlayer_setPlaybackParams}, + {"getPlaybackParams", "()Landroid/media/PlaybackParams;", (void *)android_media_MediaPlayer_getPlaybackParams}, + {"setSyncParams", "(Landroid/media/SyncParams;)V", (void *)android_media_MediaPlayer_setSyncParams}, + {"getSyncParams", "()Landroid/media/SyncParams;", (void *)android_media_MediaPlayer_getSyncParams}, {"seekTo", "(I)V", (void *)android_media_MediaPlayer_seekTo}, {"_pause", "()V", (void *)android_media_MediaPlayer_pause}, {"isPlaying", "()Z", (void *)android_media_MediaPlayer_isPlaying}, diff --git a/media/jni/android_media_MediaSync.cpp b/media/jni/android_media_MediaSync.cpp index 5c1890137ecb..8e0ed641eb0d 100644 --- a/media/jni/android_media_MediaSync.cpp +++ b/media/jni/android_media_MediaSync.cpp @@ -21,8 +21,8 @@ #include "android_media_MediaSync.h" #include "android_media_AudioTrack.h" -#include "android_media_PlaybackSettings.h" -#include "android_media_SyncSettings.h" +#include "android_media_PlaybackParams.h" +#include "android_media_SyncParams.h" #include "android_runtime/AndroidRuntime.h" #include "android_runtime/android_view_Surface.h" #include "jni.h" @@ -49,8 +49,8 @@ struct fields_t { }; static fields_t gFields; -static PlaybackSettings::fields_t gPlaybackSettingsFields; -static SyncSettings::fields_t gSyncSettingsFields; +static PlaybackParams::fields_t gPlaybackParamsFields; +static SyncParams::fields_t gSyncParamsFields; //////////////////////////////////////////////////////////////////////////////// @@ -78,20 +78,20 @@ sp<const MediaClock> JMediaSync::getMediaClock() { return mSync->getMediaClock(); } -status_t JMediaSync::setPlaybackSettings(const AudioPlaybackRate& rate) { +status_t JMediaSync::setPlaybackParams(const AudioPlaybackRate& rate) { return mSync->setPlaybackSettings(rate); } -void JMediaSync::getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */) { +void JMediaSync::getPlaybackParams(AudioPlaybackRate* rate /* nonnull */) { mSync->getPlaybackSettings(rate); } -status_t JMediaSync::setSyncSettings(const AVSyncSettings& syncSettings) { - return mSync->setSyncSettings(syncSettings); +status_t JMediaSync::setSyncParams(const AVSyncSettings& syncParams) { + return mSync->setSyncSettings(syncParams); } -void JMediaSync::getSyncSettings(AVSyncSettings* syncSettings /* nonnull */) { - mSync->getSyncSettings(syncSettings); +void JMediaSync::getSyncParams(AVSyncSettings* syncParams /* nonnull */) { + mSync->getSyncSettings(syncParams); } status_t JMediaSync::setVideoFrameRateHint(float rate) { @@ -308,24 +308,24 @@ static jlong android_media_MediaSync_native_getPlayTimeForPendingAudioFrames( return (jlong)playTimeUs; } -static jfloat android_media_MediaSync_setPlaybackSettings( - JNIEnv *env, jobject thiz, jobject settings) { +static jfloat android_media_MediaSync_setPlaybackParams( + JNIEnv *env, jobject thiz, jobject params) { sp<JMediaSync> sync = getMediaSync(env, thiz); if (sync == NULL) { throwExceptionAsNecessary(env, INVALID_OPERATION); return (jfloat)0.f; } - PlaybackSettings pbs; - pbs.fillFromJobject(env, gPlaybackSettingsFields, settings); - ALOGV("setPlaybackSettings: %d:%f %d:%f %d:%u %d:%u", + PlaybackParams pbs; + pbs.fillFromJobject(env, gPlaybackParamsFields, params); + ALOGV("setPlaybackParams: %d:%f %d:%f %d:%u %d:%u", pbs.speedSet, pbs.audioRate.mSpeed, pbs.pitchSet, pbs.audioRate.mPitch, pbs.audioFallbackModeSet, pbs.audioRate.mFallbackMode, pbs.audioStretchModeSet, pbs.audioRate.mStretchMode); AudioPlaybackRate rate; - sync->getPlaybackSettings(&rate); + sync->getPlaybackParams(&rate); bool updatedRate = false; if (pbs.speedSet) { rate.mSpeed = pbs.audioRate.mSpeed; @@ -344,7 +344,7 @@ static jfloat android_media_MediaSync_setPlaybackSettings( updatedRate = true; } if (updatedRate) { - status_t err = sync->setPlaybackSettings(rate); + status_t err = sync->setPlaybackParams(rate); if (err != OK) { throwExceptionAsNecessary(env, err); return (jfloat)0.f; @@ -359,7 +359,7 @@ static jfloat android_media_MediaSync_setPlaybackSettings( return (jfloat)mediaClock->getPlaybackRate(); } -static jobject android_media_MediaSync_getPlaybackSettings( +static jobject android_media_MediaSync_getPlaybackParams( JNIEnv *env, jobject thiz) { sp<JMediaSync> sync = getMediaSync(env, thiz); if (sync == NULL) { @@ -367,10 +367,10 @@ static jobject android_media_MediaSync_getPlaybackSettings( return NULL; } - PlaybackSettings pbs; + PlaybackParams pbs; AudioPlaybackRate &audioRate = pbs.audioRate; - sync->getPlaybackSettings(&audioRate); - ALOGV("getPlaybackSettings: %f %f %d %d", + sync->getPlaybackParams(&audioRate); + ALOGV("getPlaybackParams: %f %f %d %d", audioRate.mSpeed, audioRate.mPitch, audioRate.mFallbackMode, audioRate.mStretchMode); pbs.speedSet = true; @@ -378,27 +378,27 @@ static jobject android_media_MediaSync_getPlaybackSettings( pbs.audioFallbackModeSet = true; pbs.audioStretchModeSet = true; - return pbs.asJobject(env, gPlaybackSettingsFields); + return pbs.asJobject(env, gPlaybackParamsFields); } -static jfloat android_media_MediaSync_setSyncSettings( - JNIEnv *env, jobject thiz, jobject settings) { +static jfloat android_media_MediaSync_setSyncParams( + JNIEnv *env, jobject thiz, jobject params) { sp<JMediaSync> sync = getMediaSync(env, thiz); if (sync == NULL) { throwExceptionAsNecessary(env, INVALID_OPERATION); return (jfloat)0.f; } - SyncSettings scs; - scs.fillFromJobject(env, gSyncSettingsFields, settings); - ALOGV("setSyncSettings: %d:%d %d:%d %d:%f %d:%f", + SyncParams scs; + scs.fillFromJobject(env, gSyncParamsFields, params); + ALOGV("setSyncParams: %d:%d %d:%d %d:%f %d:%f", scs.syncSourceSet, scs.sync.mSource, scs.audioAdjustModeSet, scs.sync.mAudioAdjustMode, scs.toleranceSet, scs.sync.mTolerance, scs.frameRateSet, scs.frameRate); AVSyncSettings avsync; - sync->getSyncSettings(&avsync); + sync->getSyncParams(&avsync); bool updatedSync = false; status_t err = OK; if (scs.syncSourceSet) { @@ -414,7 +414,7 @@ static jfloat android_media_MediaSync_setSyncSettings( updatedSync = true; } if (updatedSync) { - err = sync->setSyncSettings(avsync); + err = sync->setSyncParams(avsync); } if (scs.frameRateSet && err == OK) { @@ -433,21 +433,21 @@ static jfloat android_media_MediaSync_setSyncSettings( return (jfloat)mediaClock->getPlaybackRate(); } -static jobject android_media_MediaSync_getSyncSettings(JNIEnv *env, jobject thiz) { +static jobject android_media_MediaSync_getSyncParams(JNIEnv *env, jobject thiz) { sp<JMediaSync> sync = getMediaSync(env, thiz); if (sync == NULL) { throwExceptionAsNecessary(env, INVALID_OPERATION); return NULL; } - SyncSettings scs; - sync->getSyncSettings(&scs.sync); + SyncParams scs; + sync->getSyncParams(&scs.sync); scs.frameRate = sync->getVideoFrameRate(); - ALOGV("getSyncSettings: %d %d %f %f", + ALOGV("getSyncParams: %d %d %f %f", scs.sync.mSource, scs.sync.mAudioAdjustMode, scs.sync.mTolerance, scs.frameRate); - // sanity check settings + // sanity check params if (scs.sync.mSource >= AVSYNC_SOURCE_MAX || scs.sync.mAudioAdjustMode >= AVSYNC_AUDIO_ADJUST_MODE_MAX || scs.sync.mTolerance < 0.f @@ -461,7 +461,7 @@ static jobject android_media_MediaSync_getSyncSettings(JNIEnv *env, jobject thiz scs.toleranceSet = true; scs.frameRateSet = scs.frameRate >= 0.f; - return scs.asJobject(env, gSyncSettingsFields); + return scs.asJobject(env, gSyncParamsFields); } static void android_media_MediaSync_native_init(JNIEnv *env) { @@ -486,8 +486,8 @@ static void android_media_MediaSync_native_init(JNIEnv *env) { env->GetFieldID(clazz.get(), "clockRate", "F"); CHECK(gFields.mediaTimestampClockRateID != NULL); - gSyncSettingsFields.init(env); - gPlaybackSettingsFields.init(env); + gSyncParamsFields.init(env); + gPlaybackParamsFields.init(env); } static void android_media_MediaSync_native_setup(JNIEnv *env, jobject thiz) { @@ -530,17 +530,17 @@ static JNINativeMethod gMethods[] = { { "native_release", "()V", (void *)android_media_MediaSync_release }, - { "native_setPlaybackSettings", "(Landroid/media/PlaybackSettings;)F", - (void *)android_media_MediaSync_setPlaybackSettings }, + { "native_setPlaybackParams", "(Landroid/media/PlaybackParams;)F", + (void *)android_media_MediaSync_setPlaybackParams }, - { "getPlaybackSettings", "()Landroid/media/PlaybackSettings;", - (void *)android_media_MediaSync_getPlaybackSettings }, + { "getPlaybackParams", "()Landroid/media/PlaybackParams;", + (void *)android_media_MediaSync_getPlaybackParams }, - { "native_setSyncSettings", "(Landroid/media/SyncSettings;)F", - (void *)android_media_MediaSync_setSyncSettings }, + { "native_setSyncParams", "(Landroid/media/SyncParams;)F", + (void *)android_media_MediaSync_setSyncParams }, - { "getSyncSettings", "()Landroid/media/SyncSettings;", - (void *)android_media_MediaSync_getSyncSettings }, + { "getSyncParams", "()Landroid/media/SyncParams;", + (void *)android_media_MediaSync_getSyncParams }, { "native_finalize", "()V", (void *)android_media_MediaSync_native_finalize }, }; diff --git a/media/jni/android_media_MediaSync.h b/media/jni/android_media_MediaSync.h index fa5e5e0301f9..22c77c766247 100644 --- a/media/jni/android_media_MediaSync.h +++ b/media/jni/android_media_MediaSync.h @@ -26,7 +26,7 @@ namespace android { struct AudioPlaybackRate; class AudioTrack; -struct IGraphicBufferProducer; +class IGraphicBufferProducer; struct MediaClock; class MediaSync; @@ -42,10 +42,10 @@ struct JMediaSync : public RefBase { status_t getPlayTimeForPendingAudioFrames(int64_t *outTimeUs); - status_t setPlaybackSettings(const AudioPlaybackRate& rate); - void getPlaybackSettings(AudioPlaybackRate* rate /* nonnull */); - status_t setSyncSettings(const AVSyncSettings& syncSettings); - void getSyncSettings(AVSyncSettings* syncSettings /* nonnull */); + status_t setPlaybackParams(const AudioPlaybackRate& rate); + void getPlaybackParams(AudioPlaybackRate* rate /* nonnull */); + status_t setSyncParams(const AVSyncSettings& syncParams); + void getSyncParams(AVSyncSettings* syncParams /* nonnull */); status_t setVideoFrameRateHint(float rate); float getVideoFrameRate(); diff --git a/media/jni/android_media_PlaybackSettings.h b/media/jni/android_media_PlaybackParams.h index 1f4f25610396..5bf13e95642b 100644 --- a/media/jni/android_media_PlaybackSettings.h +++ b/media/jni/android_media_PlaybackParams.h @@ -14,15 +14,15 @@ * limitations under the License. */ -#ifndef _ANDROID_MEDIA_PLAYBACK_SETTINGS_H_ -#define _ANDROID_MEDIA_PLAYBACK_SETTINGS_H_ +#ifndef _ANDROID_MEDIA_PLAYBACK_PARAMS_H_ +#define _ANDROID_MEDIA_PLAYBACK_PARAMS_H_ #include <media/AudioResamplerPublic.h> namespace android { // This entire class is inline as it is used from both core and media -struct PlaybackSettings { +struct PlaybackParams { AudioPlaybackRate audioRate; bool speedSet; bool pitchSet; @@ -44,7 +44,7 @@ struct PlaybackSettings { jint set_audio_stretch_mode; void init(JNIEnv *env) { - jclass lclazz = env->FindClass("android/media/PlaybackSettings"); + jclass lclazz = env->FindClass("android/media/PlaybackParams"); if (lclazz == NULL) { return; } @@ -80,14 +80,14 @@ struct PlaybackSettings { } }; - void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject settings) { - audioRate.mSpeed = env->GetFloatField(settings, fields.speed); - audioRate.mPitch = env->GetFloatField(settings, fields.pitch); + void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params) { + audioRate.mSpeed = env->GetFloatField(params, fields.speed); + audioRate.mPitch = env->GetFloatField(params, fields.pitch); audioRate.mFallbackMode = - (AudioTimestretchFallbackMode)env->GetIntField(settings, fields.audio_fallback_mode); + (AudioTimestretchFallbackMode)env->GetIntField(params, fields.audio_fallback_mode); audioRate.mStretchMode = - (AudioTimestretchStretchMode)env->GetIntField(settings, fields.audio_stretch_mode); - int set = env->GetIntField(settings, fields.set); + (AudioTimestretchStretchMode)env->GetIntField(params, fields.audio_stretch_mode); + int set = env->GetIntField(params, fields.set); speedSet = set & fields.set_speed; pitchSet = set & fields.set_pitch; @@ -96,25 +96,25 @@ struct PlaybackSettings { } jobject asJobject(JNIEnv *env, const fields_t& fields) { - jobject settings = env->NewObject(fields.clazz, fields.constructID); - if (settings == NULL) { + jobject params = env->NewObject(fields.clazz, fields.constructID); + if (params == NULL) { return NULL; } - env->SetFloatField(settings, fields.speed, (jfloat)audioRate.mSpeed); - env->SetFloatField(settings, fields.pitch, (jfloat)audioRate.mPitch); - env->SetIntField(settings, fields.audio_fallback_mode, (jint)audioRate.mFallbackMode); - env->SetIntField(settings, fields.audio_stretch_mode, (jint)audioRate.mStretchMode); + env->SetFloatField(params, fields.speed, (jfloat)audioRate.mSpeed); + env->SetFloatField(params, fields.pitch, (jfloat)audioRate.mPitch); + env->SetIntField(params, fields.audio_fallback_mode, (jint)audioRate.mFallbackMode); + env->SetIntField(params, fields.audio_stretch_mode, (jint)audioRate.mStretchMode); env->SetIntField( - settings, fields.set, + params, fields.set, (speedSet ? fields.set_speed : 0) | (pitchSet ? fields.set_pitch : 0) | (audioFallbackModeSet ? fields.set_audio_fallback_mode : 0) | (audioStretchModeSet ? fields.set_audio_stretch_mode : 0)); - return settings; + return params; } }; } // namespace android -#endif // _ANDROID_MEDIA_PLAYBACK_SETTINGS_H_ +#endif // _ANDROID_MEDIA_PLAYBACK_PARAMS_H_ diff --git a/media/jni/android_media_SyncSettings.cpp b/media/jni/android_media_SyncParams.cpp index 5da35e751f57..d9b2f1d7f43c 100644 --- a/media/jni/android_media_SyncSettings.cpp +++ b/media/jni/android_media_SyncParams.cpp @@ -14,14 +14,14 @@ * limitations under the License. */ -#include "android_media_SyncSettings.h" +#include "android_media_SyncParams.h" #include "JNIHelp.h" namespace android { -void SyncSettings::fields_t::init(JNIEnv *env) { - jclass lclazz = env->FindClass("android/media/SyncSettings"); +void SyncParams::fields_t::init(JNIEnv *env) { + jclass lclazz = env->FindClass("android/media/SyncParams"); if (lclazz == NULL) { return; } @@ -51,17 +51,17 @@ void SyncSettings::fields_t::init(JNIEnv *env) { env->DeleteLocalRef(lclazz); } -void SyncSettings::fields_t::exit(JNIEnv *env) { +void SyncParams::fields_t::exit(JNIEnv *env) { env->DeleteGlobalRef(clazz); clazz = NULL; } -void SyncSettings::fillFromJobject(JNIEnv *env, const fields_t& fields, jobject settings) { - sync.mSource = (AVSyncSource)env->GetIntField(settings, fields.sync_source); - sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)env->GetIntField(settings, fields.audio_adjust_mode); - sync.mTolerance = env->GetFloatField(settings, fields.tolerance); - frameRate = env->GetFloatField(settings, fields.frame_rate); - int set = env->GetIntField(settings, fields.set); +void SyncParams::fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params) { + sync.mSource = (AVSyncSource)env->GetIntField(params, fields.sync_source); + sync.mAudioAdjustMode = (AVSyncAudioAdjustMode)env->GetIntField(params, fields.audio_adjust_mode); + sync.mTolerance = env->GetFloatField(params, fields.tolerance); + frameRate = env->GetFloatField(params, fields.frame_rate); + int set = env->GetIntField(params, fields.set); syncSourceSet = set & fields.set_sync_source; audioAdjustModeSet = set & fields.set_audio_adjust_mode; @@ -69,23 +69,23 @@ void SyncSettings::fillFromJobject(JNIEnv *env, const fields_t& fields, jobject frameRateSet = set & fields.set_frame_rate; } -jobject SyncSettings::asJobject(JNIEnv *env, const fields_t& fields) { - jobject settings = env->NewObject(fields.clazz, fields.constructID); - if (settings == NULL) { +jobject SyncParams::asJobject(JNIEnv *env, const fields_t& fields) { + jobject params = env->NewObject(fields.clazz, fields.constructID); + if (params == NULL) { return NULL; } - env->SetIntField(settings, fields.sync_source, (jint)sync.mSource); - env->SetIntField(settings, fields.audio_adjust_mode, (jint)sync.mAudioAdjustMode); - env->SetFloatField(settings, fields.tolerance, (jfloat)sync.mTolerance); - env->SetFloatField(settings, fields.frame_rate, (jfloat)frameRate); + env->SetIntField(params, fields.sync_source, (jint)sync.mSource); + env->SetIntField(params, fields.audio_adjust_mode, (jint)sync.mAudioAdjustMode); + env->SetFloatField(params, fields.tolerance, (jfloat)sync.mTolerance); + env->SetFloatField(params, fields.frame_rate, (jfloat)frameRate); env->SetIntField( - settings, fields.set, + params, fields.set, (syncSourceSet ? fields.set_sync_source : 0) | (audioAdjustModeSet ? fields.set_audio_adjust_mode : 0) | (toleranceSet ? fields.set_tolerance : 0) | (frameRateSet ? fields.set_frame_rate : 0)); - return settings; + return params; } } // namespace android diff --git a/media/jni/android_media_SyncSettings.h b/media/jni/android_media_SyncParams.h index 23530db4eabb..543d79a8efa1 100644 --- a/media/jni/android_media_SyncSettings.h +++ b/media/jni/android_media_SyncParams.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef _ANDROID_MEDIA_SYNC_SETTINGS_H_ -#define _ANDROID_MEDIA_SYNC_SETTINGS_H_ +#ifndef _ANDROID_MEDIA_SYNC_PARAMS_H_ +#define _ANDROID_MEDIA_SYNC_PARAMS_H_ #include "jni.h" @@ -23,7 +23,7 @@ namespace android { -struct SyncSettings { +struct SyncParams { AVSyncSettings sync; float frameRate; @@ -53,13 +53,13 @@ struct SyncSettings { void exit(JNIEnv *env); }; - // fills this from an android.media.SyncSettings object - void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject settings); + // fills this from an android.media.SyncParams object + void fillFromJobject(JNIEnv *env, const fields_t& fields, jobject params); - // returns this as a android.media.SyncSettings object + // returns this as a android.media.SyncParams object jobject asJobject(JNIEnv *env, const fields_t& fields); }; } // namespace android -#endif // _ANDROID_MEDIA_SYNC_SETTINGS_H_ +#endif // _ANDROID_MEDIA_SYNC_PARAMS_H_ diff --git a/media/lib/remotedisplay/java/com/android/media/remotedisplay/RemoteDisplayProvider.java b/media/lib/remotedisplay/java/com/android/media/remotedisplay/RemoteDisplayProvider.java index e2df77c711c0..4d3edb896eb5 100644 --- a/media/lib/remotedisplay/java/com/android/media/remotedisplay/RemoteDisplayProvider.java +++ b/media/lib/remotedisplay/java/com/android/media/remotedisplay/RemoteDisplayProvider.java @@ -287,7 +287,7 @@ public abstract class RemoteDisplayProvider { */ public PendingIntent getSettingsPendingIntent() { if (mSettingsPendingIntent == null) { - Intent settingsIntent = new Intent(Settings.ACTION_WIFI_DISPLAY_SETTINGS); + Intent settingsIntent = new Intent(Settings.ACTION_CAST_SETTINGS); settingsIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_CLEAR_TOP); diff --git a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java index 63a8da722665..0ccbf6af2c61 100644 --- a/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java +++ b/media/packages/BluetoothMidiService/src/com/android/bluetoothmidiservice/BluetoothMidiDevice.java @@ -92,7 +92,6 @@ public final class BluetoothMidiDevice { mBluetoothGatt.discoverServices()); } else if (newState == BluetoothProfile.STATE_DISCONNECTED) { Log.i(TAG, "Disconnected from GATT server."); - // FIXME synchronize? close(); } } @@ -121,8 +120,8 @@ public final class BluetoothMidiDevice { } } } else { - Log.w(TAG, "onServicesDiscovered received: " + status); - // FIXME - report error back to client? + Log.e(TAG, "onServicesDiscovered received: " + status); + close(); } } @@ -137,9 +136,12 @@ public final class BluetoothMidiDevice { BluetoothGattDescriptor descriptor = characteristic.getDescriptor( CLIENT_CHARACTERISTIC_CONFIG); - // FIXME null check - descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); - mBluetoothGatt.writeDescriptor(descriptor); + if (descriptor != null) { + descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); + mBluetoothGatt.writeDescriptor(descriptor); + } else { + Log.e(TAG, "No CLIENT_CHARACTERISTIC_CONFIG for device " + mBluetoothDevice); + } } @Override @@ -244,16 +246,18 @@ public final class BluetoothMidiDevice { }.start(); } - void close() { + private void close() { + synchronized (mBluetoothDevice) { mEventScheduler.close(); - if (mDeviceServer != null) { - IoUtils.closeQuietly(mDeviceServer); - mDeviceServer = null; - mService.deviceClosed(mBluetoothDevice); - } - if (mBluetoothGatt != null) { - mBluetoothGatt.close(); - mBluetoothGatt = null; + if (mDeviceServer != null) { + IoUtils.closeQuietly(mDeviceServer); + mDeviceServer = null; + mService.deviceClosed(mBluetoothDevice); + } + if (mBluetoothGatt != null) { + mBluetoothGatt.close(); + mBluetoothGatt = null; + } } } diff --git a/native/android/sensor.cpp b/native/android/sensor.cpp index 4e7c6bededba..26b41e85fddd 100644 --- a/native/android/sensor.cpp +++ b/native/android/sensor.cpp @@ -35,9 +35,27 @@ using android::Sensor; using android::SensorManager; using android::SensorEventQueue; using android::String8; +using android::String16; /*****************************************************************************/ +android::Mutex android::SensorManager::sLock; +std::map<String16, SensorManager*> android::SensorManager::sPackageInstances; + +ASensorManager* ASensorManager_getInstance() +{ + return ASensorManager_getInstanceForPackage(NULL); +} + +ASensorManager* ASensorManager_getInstanceForPackage(const char* packageName) +{ + if (packageName) { + return &SensorManager::getInstanceForPackage(String16(packageName)); + } else { + return &SensorManager::getInstanceForPackage(String16()); + } +} + int ASensorManager_getSensorList(ASensorManager* manager, ASensorList* list) { diff --git a/native/graphics/jni/Android.mk b/native/graphics/jni/Android.mk index f89a5af42058..1b684bb4e28b 100644 --- a/native/graphics/jni/Android.mk +++ b/native/graphics/jni/Android.mk @@ -32,7 +32,7 @@ LOCAL_MODULE:= libjnigraphics LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code # TODO: This is to work around b/19059885. Remove after root cause is fixed -LOCAL_LDFLAGS_arm := -Wl,--hash-style=sysv +LOCAL_LDFLAGS_arm := -Wl,--hash-style=both include $(BUILD_SHARED_LIBRARY) diff --git a/native/graphics/jni/bitmap.cpp b/native/graphics/jni/bitmap.cpp index 05218336878c..6d2de98759c8 100644 --- a/native/graphics/jni/bitmap.cpp +++ b/native/graphics/jni/bitmap.cpp @@ -62,7 +62,7 @@ int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } - SkPixelRef* pixelRef = GraphicsJNI::getSkPixelRef(env, jbitmap); + SkPixelRef* pixelRef = GraphicsJNI::refSkPixelRef(env, jbitmap); if (!pixelRef) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } @@ -71,9 +71,9 @@ int AndroidBitmap_lockPixels(JNIEnv* env, jobject jbitmap, void** addrPtr) { void* addr = pixelRef->pixels(); if (NULL == addr) { pixelRef->unlockPixels(); + pixelRef->unref(); return ANDROID_BITMAP_RESULT_ALLOCATION_FAILED; } - pixelRef->ref(); if (addrPtr) { *addrPtr = addr; @@ -86,7 +86,7 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { return ANDROID_BITMAP_RESULT_BAD_PARAMETER; } - SkPixelRef* pixelRef = GraphicsJNI::getSkPixelRef(env, jbitmap); + SkPixelRef* pixelRef = GraphicsJNI::refSkPixelRef(env, jbitmap); if (!pixelRef) { return ANDROID_BITMAP_RESULT_JNI_EXCEPTION; } @@ -98,6 +98,12 @@ int AndroidBitmap_unlockPixels(JNIEnv* env, jobject jbitmap) { pixelRef->notifyPixelsChanged(); pixelRef->unlockPixels(); + // Awkward in that we need to double-unref as the call to get the SkPixelRef + // did a ref(), so we need to unref() for the local ref and for the previous + // AndroidBitmap_lockPixels(). However this keeps GraphicsJNI a bit safer + // if others start using it without knowing about android::Bitmap's "fun" + // ref counting mechanism(s). + pixelRef->unref(); pixelRef->unref(); return ANDROID_BITMAP_RESULT_SUCCESS; diff --git a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml index a11bed053ea4..2f0a411448a5 100644 --- a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml +++ b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml @@ -10,6 +10,13 @@ android:layout_height="match_parent" android:orientation="vertical" > + <TextView + android:id="@+id/url_bar" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textSize="20sp" + android:singleLine="true" /> + <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java index b86fc4b3315d..1019e6cfcfb3 100644 --- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java +++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java @@ -35,13 +35,13 @@ import android.util.ArrayMap; import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.webkit.SslErrorHandler; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; +import android.widget.TextView; import java.io.IOException; import java.net.HttpURLConnection; @@ -221,6 +221,7 @@ public class CaptivePortalLoginActivity extends Activity { } private class MyWebViewClient extends WebViewClient { + private static final String INTERNAL_ASSETS = "file:///android_asset/"; private boolean firstPageLoad = true; @Override @@ -240,6 +241,12 @@ public class CaptivePortalLoginActivity extends Activity { view.loadUrl(mURL.toString()); return; } + // For internally generated pages, leave URL bar listing prior URL as this is the URL + // the page refers to. + if (!url.startsWith(INTERNAL_ASSETS)) { + final TextView myUrlBar = (TextView) findViewById(R.id.url_bar); + myUrlBar.setText(url); + } testForCaptivePortal(); } @@ -252,17 +259,15 @@ public class CaptivePortalLoginActivity extends Activity { @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { Log.w(TAG, "SSL error; displaying broken lock icon."); - view.loadDataWithBaseURL("file:///android_asset/", SSL_ERROR_HTML, "text/HTML", - "UTF-8", null); + view.loadDataWithBaseURL(INTERNAL_ASSETS, SSL_ERROR_HTML, "text/HTML", "UTF-8", null); } } private class MyWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { - ProgressBar myProgressBar = (ProgressBar) findViewById(R.id.progress_bar); + final ProgressBar myProgressBar = (ProgressBar) findViewById(R.id.progress_bar); myProgressBar.setProgress(newProgress); - myProgressBar.setVisibility(newProgress == 100 ? View.GONE : View.VISIBLE); } } } diff --git a/packages/DocumentsUI/AndroidManifest.xml b/packages/DocumentsUI/AndroidManifest.xml index bf50017a23c0..382b2d09c88a 100644 --- a/packages/DocumentsUI/AndroidManifest.xml +++ b/packages/DocumentsUI/AndroidManifest.xml @@ -47,17 +47,6 @@ </intent-filter> </activity> - <activity - android:name=".StandaloneActivity" - android:theme="@style/StandaloneTheme" - android:icon="@drawable/ic_doc_text" - android:enabled="false"> - <intent-filter> - <action android:name="android.intent.action.MAIN" /> - <category android:name="android.intent.category.LAUNCHER" /> - </intent-filter> - </activity> - <provider android:name=".RecentsProvider" android:authorities="com.android.documentsui.recents" diff --git a/packages/DocumentsUI/res/values-ur-rPK/strings.xml b/packages/DocumentsUI/res/values-ur-rPK/strings.xml index 31c1909860f6..472b489a9dad 100644 --- a/packages/DocumentsUI/res/values-ur-rPK/strings.xml +++ b/packages/DocumentsUI/res/values-ur-rPK/strings.xml @@ -31,7 +31,7 @@ <string name="menu_delete" msgid="8138799623850614177">"حذف کریں"</string> <string name="menu_select" msgid="8711270657353563424">"\"<xliff:g id="DIRECTORY">^1</xliff:g>\" منتخب کریں"</string> <string name="menu_select_all" msgid="4320518282375109902">"سبھی منتخب کریں"</string> - <string name="menu_copy" msgid="3612326052677229148">"اس پر کاپی ہو رہی ہے…"</string> + <string name="menu_copy" msgid="3612326052677229148">"اس میں کاپی کریں…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"داخلی اسٹوریج دکھائیں"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD کارڈ دکھائیں"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"داخلی اسٹوریج چھپائیں"</string> diff --git a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml index 1b15b9f91433..5ebc8b3ff0dd 100644 --- a/packages/DocumentsUI/res/values-uz-rUZ/strings.xml +++ b/packages/DocumentsUI/res/values-uz-rUZ/strings.xml @@ -20,9 +20,9 @@ <string name="title_open" msgid="4353228937663917801">"Ochish"</string> <string name="title_save" msgid="2433679664882857999">"Saqlash"</string> <string name="menu_create_dir" msgid="5947289605844398389">"Jild yaratish"</string> - <string name="menu_grid" msgid="6878021334497835259">"Katakchalar ko‘rinishida"</string> + <string name="menu_grid" msgid="6878021334497835259">"Katak ko‘rinishida"</string> <string name="menu_list" msgid="7279285939892417279">"Ro‘yxat ko‘rinishida"</string> - <string name="menu_sort" msgid="7677740407158414452">"Saralash:"</string> + <string name="menu_sort" msgid="7677740407158414452">"Saralash"</string> <string name="menu_search" msgid="3816712084502856974">"Izlash"</string> <string name="menu_settings" msgid="6008033148948428823">"Sozlamalar"</string> <string name="menu_open" msgid="432922957274920903">"Ochish"</string> @@ -31,7 +31,7 @@ <string name="menu_delete" msgid="8138799623850614177">"O‘chirish"</string> <string name="menu_select" msgid="8711270657353563424">"“<xliff:g id="DIRECTORY">^1</xliff:g>” jildini tanlash"</string> <string name="menu_select_all" msgid="4320518282375109902">"Barchasini tanlash"</string> - <string name="menu_copy" msgid="3612326052677229148">"...ga nusxalash"</string> + <string name="menu_copy" msgid="3612326052677229148">"Nusxalash…"</string> <string name="menu_advanced_show" product="nosdcard" msgid="4693652895715631401">"Ichki xotirani ko‘rsatish"</string> <string name="menu_advanced_show" product="default" msgid="5792182900084144261">"SD kartani ko‘rsatish"</string> <string name="menu_advanced_hide" product="nosdcard" msgid="4218809952721972589">"Ichki xotirani berkitish"</string> @@ -39,7 +39,7 @@ <string name="menu_file_size_show" msgid="3240323619260823076">"Fayl hajmini ko‘rsatish"</string> <string name="menu_file_size_hide" msgid="8881975928502581042">"Fayl hajmini berkitish"</string> <string name="button_copy" msgid="8706475544635021302">"Nusxalash"</string> - <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> belgilandi"</string> + <string name="mode_selected_count" msgid="459111894725594625">"<xliff:g id="COUNT">%1$d</xliff:g> ta tanlandi"</string> <string name="sort_name" msgid="9183560467917256779">"Nomi bo‘yicha"</string> <string name="sort_date" msgid="586080032956151448">"Tahrir sanasi bo‘yicha"</string> <string name="sort_size" msgid="3350681319735474741">"Hajmi bo‘yicha"</string> @@ -54,7 +54,7 @@ <string name="root_type_shortcut" msgid="3318760609471618093">"Yorliqlar"</string> <string name="root_type_device" msgid="7121342474653483538">"Qurilmalar"</string> <string name="root_type_apps" msgid="8838065367985945189">"Ko‘proq dasturlar"</string> - <string name="empty" msgid="7858882803708117596">"Hech nima yo‘q"</string> + <string name="empty" msgid="7858882803708117596">"Hech narsa yo‘q"</string> <string name="toast_no_application" msgid="1339885974067891667">"Fayl ochilmadi"</string> <string name="toast_failed_delete" msgid="2180678019407244069">"Ba’zi hujjatlar o‘chirilmadi"</string> <string name="share_via" msgid="8966594246261344259">"Quyidagi orqali ulashish"</string> diff --git a/packages/DocumentsUI/res/values/styles.xml b/packages/DocumentsUI/res/values/styles.xml index 97509f7cb0bc..6d741aae8786 100644 --- a/packages/DocumentsUI/res/values/styles.xml +++ b/packages/DocumentsUI/res/values/styles.xml @@ -36,20 +36,4 @@ <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item> </style> - <style name="StandaloneTheme" parent="@android:style/Theme.Material.DayNight.DarkActionBar"> - <item name="android:actionBarWidgetTheme">@null</item> - - <item name="android:colorPrimaryDark">@*android:color/material_blue_grey_900</item> - <item name="android:colorPrimary">@*android:color/material_blue_grey_800</item> - <item name="android:colorAccent">@*android:color/material_deep_teal_500</item> - - <item name="android:listDivider">@*android:drawable/list_divider_material</item> - - <item name="android:windowActionBar">false</item> - <item name="android:windowActionModeOverlay">true</item> - <item name="android:windowNoTitle">true</item> - - <item name="android:windowSoftInputMode">stateUnspecified|adjustUnspecified</item> - </style> - </resources> diff --git a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java index 202402f007b4..6e050c65c8e3 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/CopyService.java +++ b/packages/DocumentsUI/src/com/android/documentsui/CopyService.java @@ -156,7 +156,7 @@ public class CopyService extends IntentService { if (mFailedFiles.size() > 0) { final Context context = getApplicationContext(); - final Intent navigateIntent = new Intent(context, StandaloneActivity.class); + final Intent navigateIntent = new Intent(context, DocumentsActivity.class); navigateIntent.putExtra(EXTRA_STACK, (Parcelable) stack); navigateIntent.putExtra(EXTRA_FAILURE, FAILURE_COPY); navigateIntent.putParcelableArrayListExtra(EXTRA_SRC_LIST, mFailedFiles); @@ -200,7 +200,7 @@ public class CopyService extends IntentService { mIsCancelled = false; final Context context = getApplicationContext(); - final Intent navigateIntent = new Intent(context, StandaloneActivity.class); + final Intent navigateIntent = new Intent(context, DocumentsActivity.class); navigateIntent.putExtra(EXTRA_STACK, (Parcelable) stack); mProgressBuilder = new Notification.Builder(this) diff --git a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java index e58c6373d98b..cded7171ffa1 100644 --- a/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +++ b/packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java @@ -27,6 +27,7 @@ import static com.android.documentsui.DirectoryFragment.ANIM_DOWN; import static com.android.documentsui.DirectoryFragment.ANIM_NONE; import static com.android.documentsui.DirectoryFragment.ANIM_UP; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -66,6 +67,7 @@ import android.widget.Toolbar; import com.android.documentsui.RecentsProvider.RecentColumns; import com.android.documentsui.RecentsProvider.ResumeColumns; import com.android.documentsui.model.DocumentInfo; +import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; @@ -189,6 +191,16 @@ public class DocumentsActivity extends BaseActivity { } else { new RestoreStackTask().execute(); } + + // Show a failure dialog if there was a failed operation. + final Intent intent = getIntent(); + final DocumentStack dstStack = intent.getParcelableExtra(CopyService.EXTRA_STACK); + final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0); + if (failure != 0) { + final ArrayList<DocumentInfo> failedSrcList = + intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST); + FailureDialogFragment.show(getFragmentManager(), failure, failedSrcList, dstStack); + } } else { onCurrentDirectoryChanged(ANIM_NONE); } diff --git a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java b/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java deleted file mode 100644 index 1f629736a763..000000000000 --- a/packages/DocumentsUI/src/com/android/documentsui/StandaloneActivity.java +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (C) 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. - */ - -package com.android.documentsui; - -import static com.android.documentsui.DirectoryFragment.ANIM_DOWN; -import static com.android.documentsui.DirectoryFragment.ANIM_NONE; -import static com.android.documentsui.DirectoryFragment.ANIM_UP; -import android.app.Activity; -import android.app.FragmentManager; -import android.content.ActivityNotFoundException; -import android.content.ClipData; -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.graphics.Point; -import android.net.Uri; -import android.os.Bundle; -import android.provider.DocumentsContract; -import android.provider.DocumentsContract.Root; -import android.util.Log; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.WindowManager; -import android.widget.BaseAdapter; -import android.widget.Spinner; -import android.widget.Toast; -import android.widget.Toolbar; - -import com.android.documentsui.FailureDialogFragment; -import com.android.documentsui.RecentsProvider.ResumeColumns; -import com.android.documentsui.model.DocumentInfo; -import com.android.documentsui.model.DocumentStack; -import com.android.documentsui.model.DurableUtils; -import com.android.documentsui.model.RootInfo; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Activity providing a directly launchable file management activity. - */ -public class StandaloneActivity extends BaseActivity { - public static final String TAG = "StandaloneFileManagement"; - - private Toolbar mToolbar; - private Spinner mToolbarStack; - private Toolbar mRootsToolbar; - private DirectoryContainerView mDirectoryContainer; - private State mState; - private ItemSelectedListener mStackListener; - private BaseAdapter mStackAdapter; - - public StandaloneActivity() { - super(TAG); - } - - @Override - public void onCreate(Bundle icicle) { - super.onCreate(icicle); - - setResult(Activity.RESULT_CANCELED); - setContentView(R.layout.activity); - - final Context context = this; - - mDirectoryContainer = (DirectoryContainerView) findViewById(R.id.container_directory); - - mState = (icicle != null) - ? icicle.<State>getParcelable(EXTRA_STATE) - : buildDefaultState(); - - mToolbar = (Toolbar) findViewById(R.id.toolbar); - mToolbar.setTitleTextAppearance(context, - android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Title); - - mStackAdapter = new StackAdapter(); - mStackListener = new ItemSelectedListener(); - mToolbarStack = (Spinner) findViewById(R.id.stack); - mToolbarStack.setOnItemSelectedListener(mStackListener); - - mRootsToolbar = (Toolbar) findViewById(R.id.roots_toolbar); - if (mRootsToolbar != null) { - mRootsToolbar.setTitleTextAppearance(context, - android.R.style.TextAppearance_DeviceDefault_Widget_ActionBar_Title); - } - - setActionBar(mToolbar); - - RootsFragment.show(getFragmentManager(), null); - if (!mState.restored) { - new RestoreStackTask().execute(); - - // Show a failure dialog if there was a failed operation. - final Intent intent = getIntent(); - final DocumentStack dstStack = intent.getParcelableExtra(CopyService.EXTRA_STACK); - final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0); - if (failure != 0) { - final ArrayList<DocumentInfo> failedSrcList = - intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST); - FailureDialogFragment.show(getFragmentManager(), failure, failedSrcList, dstStack); - } - } else { - onCurrentDirectoryChanged(ANIM_NONE); - } - } - - private State buildDefaultState() { - State state = new State(); - - final Intent intent = getIntent(); - state.action = State.ACTION_BROWSE_ALL; - state.acceptMimes = new String[] { "*/*" }; - state.allowMultiple = true; - state.acceptMimes = new String[] { intent.getType() }; - state.localOnly = intent.getBooleanExtra(Intent.EXTRA_LOCAL_ONLY, false); - state.forceAdvanced = intent.getBooleanExtra(DocumentsContract.EXTRA_SHOW_ADVANCED, false); - state.showAdvanced = state.forceAdvanced - | LocalPreferences.getDisplayAdvancedDevices(this); - state.showSize = true; - final DocumentStack stack = intent.getParcelableExtra(CopyService.EXTRA_STACK); - if (stack != null) - state.stack = stack; - - return state; - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - updateActionBar(); - } - - @Override - public void updateActionBar() { - final RootInfo root = getCurrentRoot(); - mToolbar.setNavigationIcon( - root != null ? root.loadToolbarIcon(mToolbar.getContext()) : null); - mToolbar.setNavigationContentDescription(R.string.drawer_open); - mToolbar.setNavigationOnClickListener(null); - - if (mSearchManager.isExpanded()) { - mToolbar.setTitle(null); - mToolbarStack.setVisibility(View.GONE); - mToolbarStack.setAdapter(null); - } else { - if (mState.stack.size() <= 1) { - mToolbar.setTitle(root.title); - mToolbarStack.setVisibility(View.GONE); - mToolbarStack.setAdapter(null); - } else { - mToolbar.setTitle(null); - mToolbarStack.setVisibility(View.VISIBLE); - mToolbarStack.setAdapter(mStackAdapter); - - mStackListener.mIgnoreNextNavigation = true; - mToolbarStack.setSelection(mStackAdapter.getCount() - 1); - } - } - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - boolean showMenu = super.onCreateOptionsMenu(menu); - - expandMenus(menu); - return showMenu; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - boolean shown = super.onPrepareOptionsMenu(menu); - - final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); - - final MenuItem createDir = menu.findItem(R.id.menu_create_dir); - final MenuItem advanced = menu.findItem(R.id.menu_advanced); - final MenuItem fileSize = menu.findItem(R.id.menu_file_size); - final MenuItem settings = menu.findItem(R.id.menu_settings); - - createDir.setVisible(cwd != null - && cwd.isCreateSupported() - && !mSearchManager.isSearching() - && !root.isDownloads()); - - fileSize.setVisible(cwd != null); - advanced.setVisible(cwd != null); - - settings.setVisible((root.flags & Root.FLAG_HAS_SETTINGS) != 0); - - return shown; - } - - @Override - public void onBackPressed() { - if (!mState.stackTouched) { - super.onBackPressed(); - return; - } - - final int size = mState.stack.size(); - if (size > 1) { - mState.stack.pop(); - onCurrentDirectoryChanged(ANIM_UP); - } else { - super.onBackPressed(); - } - } - - @Override - public State getDisplayState() { - return mState; - } - - @Override - void onDirectoryChanged(int anim) { - final FragmentManager fm = getFragmentManager(); - final RootInfo root = getCurrentRoot(); - final DocumentInfo cwd = getCurrentDirectory(); - - mDirectoryContainer.setDrawDisappearingFirst(anim == ANIM_DOWN); - - if (cwd == null) { - DirectoryFragment.showRecentsOpen(fm, anim); - - // Start recents in grid when requesting visual things - final boolean visualMimes = MimePredicate.mimeMatches( - MimePredicate.VISUAL_MIMES, mState.acceptMimes); - mState.userMode = visualMimes ? State.MODE_GRID : State.MODE_LIST; - mState.derivedMode = mState.userMode; - } else { - if (mState.currentSearch != null) { - // Ongoing search - DirectoryFragment.showSearch(fm, root, mState.currentSearch, anim); - } else { - // Normal boring directory - DirectoryFragment.showNormal(fm, root, cwd, anim); - } - } - } - - @Override - public void onDocumentPicked(DocumentInfo doc) { - if (doc.isDirectory()) { - mState.stack.push(doc); - mState.stackTouched = true; - onCurrentDirectoryChanged(ANIM_DOWN); - } else { - // Fall back to viewing - final Intent view = new Intent(Intent.ACTION_VIEW); - view.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - view.setData(doc.derivedUri); - - try { - startActivity(view); - } catch (ActivityNotFoundException ex2) { - Toast.makeText(this, R.string.toast_no_application, Toast.LENGTH_SHORT).show(); - } - } - } - - public void onDocumentsPicked(List<DocumentInfo> docs) { - // TODO - } - - @Override - void saveStackBlocking() { - final ContentResolver resolver = getContentResolver(); - final ContentValues values = new ContentValues(); - - final byte[] rawStack = DurableUtils.writeToArrayOrNull( - getDisplayState().stack); - - // Remember location for next app launch - final String packageName = getCallingPackageMaybeExtra(); - values.clear(); - values.put(ResumeColumns.STACK, rawStack); - values.put(ResumeColumns.EXTERNAL, 0); - resolver.insert(RecentsProvider.buildResume(packageName), values); - } - - @Override - void onTaskFinished(Uri... uris) { - Log.d(TAG, "onFinished() " + Arrays.toString(uris)); - - final Intent intent = new Intent(); - if (uris.length == 1) { - intent.setData(uris[0]); - } else if (uris.length > 1) { - final ClipData clipData = new ClipData( - null, mState.acceptMimes, new ClipData.Item(uris[0])); - for (int i = 1; i < uris.length; i++) { - clipData.addItem(new ClipData.Item(uris[i])); - } - intent.setClipData(clipData); - } - - intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION - | Intent.FLAG_GRANT_WRITE_URI_PERMISSION - | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - - setResult(Activity.RESULT_OK, intent); - finish(); - } -} diff --git a/packages/Keyguard/res/values-af/strings.xml b/packages/Keyguard/res/values-af/strings.xml index 0eb378fee909..1deb4ca936e1 100644 --- a/packages/Keyguard/res/values-af/strings.xml +++ b/packages/Keyguard/res/values-af/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart is PUK-geslote."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ontsluit tans SIM-kaart…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Patroon ontsluit."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Gesigslot."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ontsluit."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Wagwoord ontsluit."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Patroonarea."</string> diff --git a/packages/Keyguard/res/values-am/strings.xml b/packages/Keyguard/res/values-am/strings.xml index c95b404fd42e..3fada1995f3b 100644 --- a/packages/Keyguard/res/values-am/strings.xml +++ b/packages/Keyguard/res/values-am/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ሲም ካርድ በፒዩኬ ተዘግቷል።"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ሲም ካርዱን በመክፈት ላይ…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"በስርዓተ-ጥለት መክፈት።"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"በፊት መክፈት።"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"በይለፍ ቃል መክፈት።"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"የስርዓተ-ጥለት አካባቢ።"</string> diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml index 5b919ba489fa..00482e4656cd 100644 --- a/packages/Keyguard/res/values-ar/strings.xml +++ b/packages/Keyguard/res/values-ar/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"شريحة SIM مؤمّنة بكود PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"جارٍ إلغاء تأمين شريحة SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القفل باستخدام النقش."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"تأمين الجهاز بالوجه."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القفل باستخدام رمز PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"إلغاء القفل باستخدام كلمة المرور."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"منطقة النقش."</string> diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml index 97b04e49e006..225239a3be2b 100644 --- a/packages/Keyguard/res/values-bg/strings.xml +++ b/packages/Keyguard/res/values-bg/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картата е заключена с PUK код."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картата се отключва…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отключване с фигура."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отключване с лице."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отключване с ПИН код."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отключване с парола."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област на фигурата."</string> diff --git a/packages/Keyguard/res/values-bn-rBD/strings.xml b/packages/Keyguard/res/values-bn-rBD/strings.xml index a67143a63d12..a26bedeac8fc 100644 --- a/packages/Keyguard/res/values-bn-rBD/strings.xml +++ b/packages/Keyguard/res/values-bn-rBD/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"সিম কার্ডটি PUK কোড দিয়ে লক করা আছে৷"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"সিম কার্ড আনলক করা হচ্ছে…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"প্যাটার্ন দিয়ে আনলক৷"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"মুখের সাহায্যে আনলক করুন৷"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"পিন দিয়ে আনলক৷"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"পাসওয়ার্ড দিয়ে আনলক৷"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"প্যাটার্ন এলাকা৷"</string> diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml index 6541d80067f0..c9a41a860786 100644 --- a/packages/Keyguard/res/values-ca/strings.xml +++ b/packages/Keyguard/res/values-ca/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La targeta SIM està bloquejada pel PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"S\'està desbloquejant la targeta SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig mitjançant patró"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueig facial"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig mitjançant PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueig mitjançant contrasenya"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Àrea de patró"</string> diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml index b264141aec3c..ee26e16c0be6 100644 --- a/packages/Keyguard/res/values-cs/strings.xml +++ b/packages/Keyguard/res/values-cs/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta je zablokována pomocí kódu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokování SIM karty…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odemknutí gestem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odemknutí obličejem."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odemknutí kódem PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odemknutí heslem."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast pro zadání bezpečnostního gesta."</string> diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index a60a433b8350..363cfbcd8f11 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kort er låst med PUK-koden."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortet låses op…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås op med mønster."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås op med ansigt."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås op med pinkode."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås op med adgangskode."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> diff --git a/packages/Keyguard/res/values-de/strings.xml b/packages/Keyguard/res/values-de/strings.xml index b46284a0e59a..8c7ac5567599 100644 --- a/packages/Keyguard/res/values-de/strings.xml +++ b/packages/Keyguard/res/values-de/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-Karte ist gesperrt. PUK-Eingabe erforderlich."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-Karte wird entsperrt…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Entsperrung mit Muster"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Entsperrung mit PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Entsperrung mit Passwort"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bereich für Muster"</string> diff --git a/packages/Keyguard/res/values-el/strings.xml b/packages/Keyguard/res/values-el/strings.xml index ff67a6fe32cc..7afc5e5740f4 100644 --- a/packages/Keyguard/res/values-el/strings.xml +++ b/packages/Keyguard/res/values-el/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Η κάρτα SIM είναι κλειδωμένη με κωδικό PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ξεκλείδωμα κάρτας SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ξεκλείδωμα μοτίβου."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ξεκλείδωμα κωδικού ασφαλείας"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ξεκλείδωμα κωδικού πρόσβασης."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Περιοχή μοτίβου."</string> diff --git a/packages/Keyguard/res/values-en-rAU/strings.xml b/packages/Keyguard/res/values-en-rAU/strings.xml index 3b1adc92f8db..053b9d1fdae2 100644 --- a/packages/Keyguard/res/values-en-rAU/strings.xml +++ b/packages/Keyguard/res/values-en-rAU/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml index 3b1adc92f8db..053b9d1fdae2 100644 --- a/packages/Keyguard/res/values-en-rGB/strings.xml +++ b/packages/Keyguard/res/values-en-rGB/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml index 3b1adc92f8db..053b9d1fdae2 100644 --- a/packages/Keyguard/res/values-en-rIN/strings.xml +++ b/packages/Keyguard/res/values-en-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml index e130c90f8f22..e5b21574110b 100644 --- a/packages/Keyguard/res/values-es-rUS/strings.xml +++ b/packages/Keyguard/res/values-es-rUS/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada por código PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string> diff --git a/packages/Keyguard/res/values-es/strings.xml b/packages/Keyguard/res/values-es/strings.xml index e7f0a50b744f..1bd1903c790f 100644 --- a/packages/Keyguard/res/values-es/strings.xml +++ b/packages/Keyguard/res/values-es/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada con el código PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string> diff --git a/packages/Keyguard/res/values-et-rEE/strings.xml b/packages/Keyguard/res/values-et-rEE/strings.xml index 3175e7bcf3b3..b194924d77ac 100644 --- a/packages/Keyguard/res/values-et-rEE/strings.xml +++ b/packages/Keyguard/res/values-et-rEE/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart on PUK-lukus."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kaardi avamine ..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Näoga avamine."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parooliga avamine."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mustri ala."</string> diff --git a/packages/Keyguard/res/values-eu-rES/strings.xml b/packages/Keyguard/res/values-eu-rES/strings.xml index 6a18667827a7..9e1853b3c300 100644 --- a/packages/Keyguard/res/values-eu-rES/strings.xml +++ b/packages/Keyguard/res/values-eu-rES/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM txartela PUK bidez blokeatuta dago."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM txartela desblokeatzen…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ereduaren bidez desblokeatzea."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Aurpegiaren bidez desblokeatzea."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN kodearen bidez desblokeatzea."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pasahitzaren bidez desblokeatzea."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eredua marrazteko eremua."</string> diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml index b0bb6e63d41d..12c171d0d1c5 100644 --- a/packages/Keyguard/res/values-fa/strings.xml +++ b/packages/Keyguard/res/values-fa/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"سیم کارت با PUK قفل شده است."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"درحال بازگشایی قفل سیم کارت..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"باز کردن قفل با الگو."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"باز کردن قفل با چهره."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"باز کردن قفل با پین."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"باز کردن قفل با گذرواژه."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ناحیه الگو."</string> diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml index 459b32b5f200..838f65a160ca 100644 --- a/packages/Keyguard/res/values-fi/strings.xml +++ b/packages/Keyguard/res/values-fi/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortti on PUK-lukittu."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortin lukitusta poistetaan…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lukituksen poisto salasanalla."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face Unlock"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lukituksen poisto PIN-koodilla."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lukituksen poisto salasanalla."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kuvioalue."</string> diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml index 992faf81f18c..6d6c9a3f661e 100644 --- a/packages/Keyguard/res/values-fr-rCA/strings.xml +++ b/packages/Keyguard/res/values-fr-rCA/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par NIP"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string> diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml index 48b5bc39d3d9..54be3304aca0 100644 --- a/packages/Keyguard/res/values-fr/strings.xml +++ b/packages/Keyguard/res/values-fr/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Déverrouillage par reconnaissance faciale"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par code PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string> diff --git a/packages/Keyguard/res/values-gl-rES/strings.xml b/packages/Keyguard/res/values-gl-rES/strings.xml index 8b6b0ba9170f..86e3f2fea273 100644 --- a/packages/Keyguard/res/values-gl-rES/strings.xml +++ b/packages/Keyguard/res/values-gl-rES/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A tarxeta SIM está bloqueada mediante un PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarxeta SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo mediante padrón"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueo facial"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo mediante PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo mediante contrasinal"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona do padrón"</string> diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml index aa3275928f76..0330ca989ce5 100644 --- a/packages/Keyguard/res/values-hi/strings.xml +++ b/packages/Keyguard/res/values-hi/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK द्वारा लॉक किया हुआ है."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक हो रहा है…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलॉक."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलॉक."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"आकार क्षेत्र."</string> diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml index cd280e3d703b..6a323947bb5e 100644 --- a/packages/Keyguard/res/values-hr/strings.xml +++ b/packages/Keyguard/res/values-hr/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kartica zaključana je PUK-om."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Otključavanje SIM kartice…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Uzorak za otključavanje."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Otključavanje licem."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje zaporkom."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Područje uzorka."</string> diff --git a/packages/Keyguard/res/values-hu/strings.xml b/packages/Keyguard/res/values-hu/strings.xml index ead2f87524eb..b3018dc581f1 100644 --- a/packages/Keyguard/res/values-hu/strings.xml +++ b/packages/Keyguard/res/values-hu/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A SIM kártya le van zárva a PUK kóddal."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kártya feloldása..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Feloldás mintával"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Arcalapú feloldás"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Feloldás PIN kóddal"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Feloldás jelszóval"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mintaterület"</string> diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml index 9b94ba0e2194..7c2f4d82aacf 100644 --- a/packages/Keyguard/res/values-hy-rAM/strings.xml +++ b/packages/Keyguard/res/values-hy-rAM/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM քարտը PUK-ով կողպված է:"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM քարտը ապակողպվում է..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Սխեմայով ապակողպում:"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Դեմքով ապակողպում:"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-ն ապակողպված է:"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Գաղտնաբառի ապակողպում:"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Սխեմայի տարածք:"</string> diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml index 93484d2d3787..60ef81fe73d4 100644 --- a/packages/Keyguard/res/values-in/strings.xml +++ b/packages/Keyguard/res/values-in/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartu SIM terkunci PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kartu SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci dengan pola."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Buka kunci dengan face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci dengan PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci dengan sandi."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area pola."</string> diff --git a/packages/Keyguard/res/values-is-rIS/strings.xml b/packages/Keyguard/res/values-is-rIS/strings.xml index 9e88318a3090..e43d46845791 100644 --- a/packages/Keyguard/res/values-is-rIS/strings.xml +++ b/packages/Keyguard/res/values-is-rIS/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortið er PUK-læst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Tekur SIM-kort úr lás…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Opnun með mynstri."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Opnun með andliti."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Opnun með PIN-númeri."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Opnun með aðgangsorði."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Svæði mynsturs."</string> diff --git a/packages/Keyguard/res/values-it/strings.xml b/packages/Keyguard/res/values-it/strings.xml index c0c690be1f00..ce5710106f32 100644 --- a/packages/Keyguard/res/values-it/strings.xml +++ b/packages/Keyguard/res/values-it/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La SIM è bloccata tramite PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Sblocco scheda SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Sblocco con sequenza."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Sblocco col sorriso."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Sblocco con PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Sblocco con password."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area sequenza."</string> diff --git a/packages/Keyguard/res/values-iw/strings.xml b/packages/Keyguard/res/values-iw/strings.xml index f817096f1d5f..7d51b71d20f5 100644 --- a/packages/Keyguard/res/values-iw/strings.xml +++ b/packages/Keyguard/res/values-iw/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"כרטיס SIM נעול באמצעות PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"מבטל נעילה של כרטיס SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה באמצעות ציור קו."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ביטול נעילה באמצעות זיהוי פנים."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות מספר PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה באמצעות סיסמה."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"אזור ציור קו."</string> diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml index 5f923566dab3..65949c6cb67c 100644 --- a/packages/Keyguard/res/values-ja/strings.xml +++ b/packages/Keyguard/res/values-ja/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIMカードはPUKでロックされています。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIMカードをロック解除しています…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"パターンロックを解除します。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"フェイスアンロックを行います。"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PINロックを解除します。"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"パスワードロックを解除します。"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"パターンエリアです。"</string> diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml index 8ed74c745a29..c97e32b60c63 100644 --- a/packages/Keyguard/res/values-ka-rGE/strings.xml +++ b/packages/Keyguard/res/values-ka-rGE/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ბარათი დაბლოკილია PUK კოდით."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"მიმდინარეობს SIM ბარათის განბლოკვა…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"განბლოკვა ნიმუშით."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"განბლოკვა სახით"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"განბლოკვა Pin-ით."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პაროლის განბლოკვა"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string> diff --git a/packages/Keyguard/res/values-kk-rKZ/strings.xml b/packages/Keyguard/res/values-kk-rKZ/strings.xml index 2b38a2a23838..fa0934d8670a 100644 --- a/packages/Keyguard/res/values-kk-rKZ/strings.xml +++ b/packages/Keyguard/res/values-kk-rKZ/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картасының PUK коды бекітілген."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картасының бекітпесін ашуда…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Кескін арқылы ашу."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Бет-әлпет арқылы ашу."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin арқылы ашу."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Кілтсөз арқылы ашу."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Кескін арқылы ашу аймағы."</string> diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml index c278a474cda7..3a909a942588 100644 --- a/packages/Keyguard/res/values-km-rKH/strings.xml +++ b/packages/Keyguard/res/values-km-rKH/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ស៊ីមកាតជាប់កូដ PUK ។"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"កំពុងដោះសោស៊ីមកាត..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំដោះសោ។"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ដោះសោតាមទម្រង់មុខ។"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះសោ។"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យសម្ងាត់ដោះសោ។"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃលំនាំ។"</string> diff --git a/packages/Keyguard/res/values-kn-rIN/strings.xml b/packages/Keyguard/res/values-kn-rIN/strings.xml index a5631a62607f..c97040e0b716 100644 --- a/packages/Keyguard/res/values-kn-rIN/strings.xml +++ b/packages/Keyguard/res/values-kn-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು PUK-ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ನಮೂನೆ ಅನ್ಲಾಕ್."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ಮುಖದ ಅನ್ಲಾಕ್."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ಪಿನ್ ಅನ್ಲಾಕ್."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ಪಾಸ್ವರ್ಡ್ ಅನ್ಲಾಕ್."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ನಮೂನೆ ಪ್ರದೇಶ."</string> diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml index 37bf289a36cd..336cfbf3014f 100644 --- a/packages/Keyguard/res/values-ko/strings.xml +++ b/packages/Keyguard/res/values-ko/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 카드가 PUK 잠김 상태입니다."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM 카드 잠금해제 중..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"패턴을 사용하여 잠금해제합니다."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"얼굴 인식을 사용하여 잠금해제합니다."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"핀을 사용하여 잠금해제합니다."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"비밀번호를 사용하여 잠금해제합니다."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"패턴을 그리는 부분입니다."</string> diff --git a/packages/Keyguard/res/values-ky-rKG/strings.xml b/packages/Keyguard/res/values-ky-rKG/strings.xml index cf7a07c71743..303dabd78e4e 100644 --- a/packages/Keyguard/res/values-ky-rKG/strings.xml +++ b/packages/Keyguard/res/values-ky-rKG/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карта PUK-бөгөттө."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-карта бөгөттөн чыгарылууда…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Үлгү менен ачуу."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Жүзүнөн таануу"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Пин код менен ачуу."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Сырсөз менен ачуу."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Үлгү аймагы."</string> diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml index bcc1cf133dae..8e4ae991be92 100644 --- a/packages/Keyguard/res/values-lo-rLA/strings.xml +++ b/packages/Keyguard/res/values-lo-rLA/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ຊິມກາດຖືກລັອກດ້ວຍລະຫັດ PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ກຳລັງປົດລັອກຊິມກາດ..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອກດ້ວຍຮູບແບບ."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ປົດລັອກດ້ວຍໜ້າ."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອກດ້ວຍ PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ການປົດລັອກດ້ວຍລະຫັດຜ່ານ."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບແບບ."</string> diff --git a/packages/Keyguard/res/values-lt/strings.xml b/packages/Keyguard/res/values-lt/strings.xml index 3bbf54f5dcf9..bde5357fe724 100644 --- a/packages/Keyguard/res/values-lt/strings.xml +++ b/packages/Keyguard/res/values-lt/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kortelė užrakinta PUK kodu."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Atrakinama SIM kortelė…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Atrakinimas pagal piešinį."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Atrakinimas pagal veidą."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Atrakinimas įvedus PIN kodą."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Atrakinimas įvedus slaptažodį."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Atrakinimo pagal piešinį sritis."</string> diff --git a/packages/Keyguard/res/values-lv/strings.xml b/packages/Keyguard/res/values-lv/strings.xml index 3b03d0d5b1ff..a3c9c79fd0d0 100644 --- a/packages/Keyguard/res/values-lv/strings.xml +++ b/packages/Keyguard/res/values-lv/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karte ir bloķēta ar PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Notiek SIM kartes atbloķēšana..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Autorizācija ar kombināciju."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Autorizācija pēc sejas."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Autorizācija ar PIN kodu."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Autorizācija ar paroli."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kombinācijas ievades apgabals."</string> diff --git a/packages/Keyguard/res/values-mk-rMK/strings.xml b/packages/Keyguard/res/values-mk-rMK/strings.xml index d5f4a09678fe..fa0a9b3a0e32 100644 --- a/packages/Keyguard/res/values-mk-rMK/strings.xml +++ b/packages/Keyguard/res/values-mk-rMK/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"СИМ картичката е заклучена со ПУК."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"СИМ картичката се отклучува..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отклучување со шема."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Отклучување со лик."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отклучување со пин."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отклучување со лозинка."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област за шема."</string> diff --git a/packages/Keyguard/res/values-ml-rIN/strings.xml b/packages/Keyguard/res/values-ml-rIN/strings.xml index 509491f27db3..6e19eb944fe2 100644 --- a/packages/Keyguard/res/values-ml-rIN/strings.xml +++ b/packages/Keyguard/res/values-ml-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"സിം കാർഡ് PUK-ലോക്ക് ചെയ്തതാണ്."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"പാറ്റേൺ അൺലോക്ക്."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"മുഖം തിരിച്ചറിഞ്ഞുള്ള അൺലോക്ക്."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"പിൻ അൺലോക്ക്."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"പാസ്വേഡ് അൺലോക്ക്."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"പാറ്റേൺ ഏരിയ."</string> diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml index 6426d9e1dec3..7be58968b8a0 100644 --- a/packages/Keyguard/res/values-mn-rMN/strings.xml +++ b/packages/Keyguard/res/values-mn-rMN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картны PUK-түгжигдсэн."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картны түгжээг гаргаж байна…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах хээ."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Нүүрээр тайлах"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Хээний хэсэг."</string> diff --git a/packages/Keyguard/res/values-mr-rIN/strings.xml b/packages/Keyguard/res/values-mr-rIN/strings.xml index 6d40958a904d..535b91c83ec4 100644 --- a/packages/Keyguard/res/values-mr-rIN/strings.xml +++ b/packages/Keyguard/res/values-mr-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK-लॉक केलेले आहे."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक करत आहे…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"नमुना अनलॉक."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"चेहरा अनलॉक."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"संकेतशब्द अनलॉक."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"नमुना क्षेत्र."</string> diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml index 53151bee8fe2..104f82470c73 100644 --- a/packages/Keyguard/res/values-ms-rMY/strings.xml +++ b/packages/Keyguard/res/values-ms-rMY/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kad SIM dikunci dengan PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kunci kad SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Wajah Buka Kunci"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci kata laluan."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kawasan corak."</string> diff --git a/packages/Keyguard/res/values-my-rMM/strings.xml b/packages/Keyguard/res/values-my-rMM/strings.xml index 69498ed696f6..91ac6471afc9 100644 --- a/packages/Keyguard/res/values-my-rMM/strings.xml +++ b/packages/Keyguard/res/values-my-rMM/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ဆင်းမ်ကဒ် ကို သော့ဖွင့်နေပါသည်"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ပုံစံဖြင့် သော့ဖွင့်ခြင်း"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"မျက်နှာမှတ် သော့ဖွင့်ခြင်း"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ပင်နံပါတ်ဖြင့် သော့ဖွင့်ခြင်း"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"စကားဝှက်ဖြင့် သော့ဖွင့်ခြင်း"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ပုံစံနေရာ"</string> diff --git a/packages/Keyguard/res/values-nb/strings.xml b/packages/Keyguard/res/values-nb/strings.xml index 454729e4f77d..3f9cc4e56e79 100644 --- a/packages/Keyguard/res/values-nb/strings.xml +++ b/packages/Keyguard/res/values-nb/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet er PUK-låst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser opp SIM-kortet ..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mønsteropplåsning."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ansiktsopplåsning."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-opplåsning."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Passordopplåsning."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> diff --git a/packages/Keyguard/res/values-ne-rNP/strings.xml b/packages/Keyguard/res/values-ne-rNP/strings.xml index 3fc833969211..7dc9c67da90c 100644 --- a/packages/Keyguard/res/values-ne-rNP/strings.xml +++ b/packages/Keyguard/res/values-ne-rNP/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM कार्ड PUK-लक छ।"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM कार्ड अनलक हुँदै…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाँचा अनलक।"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"फेस अनलक"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलक।"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाँचा क्षेत्र।"</string> diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml index dad2fff5a93e..079832ad62e8 100644 --- a/packages/Keyguard/res/values-nl/strings.xml +++ b/packages/Keyguard/res/values-nl/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Simkaart is vergrendeld met PUK-code."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Simkaart ontgrendelen…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Ontgrendelen via gezichtsherkenning"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ontgrendeling via wachtwoord."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Tekengebied voor patroon."</string> diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml index cb2b211e1899..cb2c373dfa4a 100644 --- a/packages/Keyguard/res/values-pl/strings.xml +++ b/packages/Keyguard/res/values-pl/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM jest zablokowana za pomocą kodu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokowuję kartę SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odblokowanie wzorem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Rozpoznanie twarzy"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odblokowanie kodem PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odblokowanie hasłem."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Obszar wzoru."</string> diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml index dcd5ca7ad23c..fe3bc470b8ff 100644 --- a/packages/Keyguard/res/values-pt-rPT/strings.xml +++ b/packages/Keyguard/res/values-pt-rPT/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado por PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"A desbloquear o cartão SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio através de sequência."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio através do rosto."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio através de PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio através de palavra-passe."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área da sequência."</string> diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml index 09cbe143f46e..a6ecc20cebb2 100644 --- a/packages/Keyguard/res/values-pt/strings.xml +++ b/packages/Keyguard/res/values-pt/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado pelo PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando o cartão SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Desbloqueio facial."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio com senha."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área do padrão."</string> diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml index 01e5de2ff054..14b6c8d8471b 100644 --- a/packages/Keyguard/res/values-ro/strings.xml +++ b/packages/Keyguard/res/values-ro/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Cardul SIM este blocat cu codul PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Se deblochează cardul SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Deblocare cu model."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Deblocare facială."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Deblocare cu PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Deblocare cu parolă."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zonă model."</string> diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml index e0a0b92f0ac8..6587eef7c961 100644 --- a/packages/Keyguard/res/values-ru/strings.xml +++ b/packages/Keyguard/res/values-ru/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Для разблокировки SIM-карты требуется PUK-код."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Разблокировка SIM-карты…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Графический ключ"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Пароль"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ввода графического ключа"</string> diff --git a/packages/Keyguard/res/values-si-rLK/strings.xml b/packages/Keyguard/res/values-si-rLK/strings.xml index 232f525ecfd8..f7aa9a9d986a 100644 --- a/packages/Keyguard/res/values-si-rLK/strings.xml +++ b/packages/Keyguard/res/values-si-rLK/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM පත PUK අගුළු ලා ඇත."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM පත අගුළු හරිමින්..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රටා අගුළු ඇරීම."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"මුහුණ භාවිතයෙන් අඟුළු හැරීම."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රටා ප්රදේශය."</string> diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml index 4f601418eaac..ae5557417cc9 100644 --- a/packages/Keyguard/res/values-sk/strings.xml +++ b/packages/Keyguard/res/values-sk/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM je uzamknutá pomocou kódu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Prebieha odomykanie karty SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odomknutie vzorom."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odomknutie tvárou."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odomknutie kódom PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odomknutie heslom."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblasť na zadanie bezpečnostného vzoru."</string> diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml index 673d5c9d5c0d..38edbd3c5f8e 100644 --- a/packages/Keyguard/res/values-sl/strings.xml +++ b/packages/Keyguard/res/values-sl/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartica SIM je zaklenjena s kodo PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odklepanje kartice SIM …"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odklepanje z vzorcem."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Odklepanje z obrazom."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odklepanje s kodo PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odklepanje z geslom."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Območje vzorca."</string> diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml index e888179f7a13..8431b01ba238 100644 --- a/packages/Keyguard/res/values-sr/strings.xml +++ b/packages/Keyguard/res/values-sr/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картица је закључана PUK кодом."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Откључавање SIM картице…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Откључавање шаблоном."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Откључавање лицем."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Откључавање PIN-ом."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Откључавање лозинком."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област шаблона."</string> diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml index 3fa40ff9c00e..55798de88191 100644 --- a/packages/Keyguard/res/values-sv/strings.xml +++ b/packages/Keyguard/res/values-sv/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet är PUK-låst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser upp SIM-kort …"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås upp med grafiskt lösenord."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Lås upp med Ansiktslås."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås upp med PIN-kod."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås upp med lösenord."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Fält för grafiskt lösenord."</string> diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml index 403d452724a7..71689a66bdd0 100644 --- a/packages/Keyguard/res/values-sw/strings.xml +++ b/packages/Keyguard/res/values-sw/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kadi imefungwa na PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Inafungua SIM kadi..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kufungua kwa ruwaza."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Kufungua kwa uso."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Kufungua kwa PIN."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Kufungua kwa nenosiri."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eneo la ruwaza."</string> diff --git a/packages/Keyguard/res/values-ta-rIN/strings.xml b/packages/Keyguard/res/values-ta-rIN/strings.xml index 42b00c023730..8e5dd1aa83e1 100644 --- a/packages/Keyguard/res/values-ta-rIN/strings.xml +++ b/packages/Keyguard/res/values-ta-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"சிம் கார்டு PUK ஆல் பூட்டப்பட்டது."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"சிம் கார்டின் தடையைநீக்குகிறது..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"வடிவம் மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"முகத்தால் திறத்தல்."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"கடவுச்சொல் மூலம் திறத்தல்."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"வடிவப் பகுதி."</string> diff --git a/packages/Keyguard/res/values-te-rIN/strings.xml b/packages/Keyguard/res/values-te-rIN/strings.xml index 9d9a70a7dc33..fcffa05d3b17 100644 --- a/packages/Keyguard/res/values-te-rIN/strings.xml +++ b/packages/Keyguard/res/values-te-rIN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"సిమ్ కార్డు PUK లాక్ చేయబడింది."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"సిమ్ కార్డును అన్లాక్ చేస్తోంది…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"నమూనా అన్లాక్."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"ముఖంతో అన్లాక్."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"పిన్ అన్లాక్."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"పాస్వర్డ్ అన్లాక్."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"నమూనా ప్రాంతం."</string> diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml index 36e82af20f7b..04f9d014cb14 100644 --- a/packages/Keyguard/res/values-th/strings.xml +++ b/packages/Keyguard/res/values-th/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ซิมการ์ดถูกล็อกด้วย PUK"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"กำลังปลดล็อกซิมการ์ด…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"การปลดล็อกด้วยรูปแบบ"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"การปลดล็อกด้วยใบหน้า"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"การปลดล็อกด้วย PIN"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"การปลดล็อกด้วยรหัสผ่าน"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"พื้นที่สำหรับรูปแบบ"</string> diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml index eabebb4c9afd..54ef1f7bd650 100644 --- a/packages/Keyguard/res/values-tl/strings.xml +++ b/packages/Keyguard/res/values-tl/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Naka-lock ang SIM card gamit ang PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ina-unlock ang SIM card…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pag-unlock ng pattern."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Face unlock."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pag-unlock ng pin."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pag-unlock ng password."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bahagi ng pattern."</string> diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml index 14c9d2281c8d..099a18c14fd3 100644 --- a/packages/Keyguard/res/values-tr/strings.xml +++ b/packages/Keyguard/res/values-tr/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kart PUK kilidi devrede."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kart kilidi açılıyor…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desenle kilit açma."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Yüzle kilit açma."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin koduyla kilit açma."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifreyle kilit açma."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Desen alanı."</string> diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml index fdff8c6d095c..4e3a5b078634 100644 --- a/packages/Keyguard/res/values-uk/strings.xml +++ b/packages/Keyguard/res/values-uk/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карту заблоковано PUK-кодом."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Розблокування SIM-карти…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Розблокування ключем."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Фейсконтроль"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Розблокування PIN-кодом."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Розблокування паролем."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ключа."</string> diff --git a/packages/Keyguard/res/values-ur-rPK/strings.xml b/packages/Keyguard/res/values-ur-rPK/strings.xml index 29b2d5b66857..d8983eaacb5d 100644 --- a/packages/Keyguard/res/values-ur-rPK/strings.xml +++ b/packages/Keyguard/res/values-ur-rPK/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM کارڈ PUK-مقفل ہے۔"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM کارڈ غیر مقفل کیا جا رہا ہے…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"پیٹرن کے ذریعے غیر مقفل کریں۔"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"چہرے کے ذریعے غیر مقفل کریں۔"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"پن کے ذریعے غیر مقفل کریں۔"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"پاس ورڈ کے ذریعہ غیر مقفل کریں۔"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"پیٹرن کا علاقہ۔"</string> @@ -76,7 +75,7 @@ <string name="kg_invalid_puk" msgid="3638289409676051243">"صحیح PUK کوڈ دوبارہ درج کریں۔ بار بار کی کوششیں SIM کو مستقل طور پر غیر فعال کر دیں گی۔"</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN کوڈز مماثل نہیں ہیں"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"پیٹرن کی بہت ساری کوششیں"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"آپ نے اپنا PIN <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"آپ نے <xliff:g id="NUMBER_0">%d</xliff:g> بار اپنا PIN غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"آپ نے اپنا پاس ورڈ <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ٹائپ کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"آپ نے اپنا غیر مقفل کرنے کا پیٹرن <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے ڈرا کیا ہے۔ \n\n <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈ میں دوبارہ کوشش کریں۔"</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="8774056606869646621">"آپ نے ٹیبلیٹ کو غیر مقفل کرنے کیلئے <xliff:g id="NUMBER_0">%d</xliff:g> بار غلط طریقے سے کوشش کی ہے۔ <xliff:g id="NUMBER_1">%d</xliff:g> مزید ناکام کوششوں کے بعد، اس ٹیبلیٹ کو دوبارہ ترتیب دے دیا جائے گا، جس سے اس کا سبھی ڈیٹا حذف ہو جائے گا۔"</string> diff --git a/packages/Keyguard/res/values-uz-rUZ/strings.xml b/packages/Keyguard/res/values-uz-rUZ/strings.xml index c522a465d26e..6dace41eedec 100644 --- a/packages/Keyguard/res/values-uz-rUZ/strings.xml +++ b/packages/Keyguard/res/values-uz-rUZ/strings.xml @@ -29,7 +29,7 @@ <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"Qulfni ochish uchun parolni kiriting"</string> <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"Qulfni ochish uchun PIN-kodni kiriting"</string> <string name="keyguard_password_wrong_pin_code" msgid="2422225591006134936">"Noto‘g‘ri PIN kod."</string> - <string name="keyguard_charged" msgid="3272223906073492454">"Zaryad to‘ldi"</string> + <string name="keyguard_charged" msgid="3272223906073492454">"Batareya quvvati to‘ldi"</string> <string name="keyguard_plugged_in" msgid="9087497435553252863">"Quvvat olmoqda"</string> <string name="keyguard_low_battery" msgid="8143808018719173859">"Zaryadlagichni ulang."</string> <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"Qulfni ochish uchun \"Menyu\"ga bosing."</string> @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta PUK kod bilan qulflangan."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM karta qulfi ochilmoqda…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Chizmali qulfni ochish."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Qulfni yuzni tanitib ochish"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin qulfini ochish."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parolli qulfni ochish."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Chizmali qulf maydoni."</string> @@ -53,14 +52,14 @@ <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kod maydoni"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM karta PIN kodi maydoni"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM karta PUK kodi maydoni"</string> - <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Keyingi uyg‘otkich <xliff:g id="ALARM">%1$s</xliff:g> uchun o‘rnatildi"</string> + <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Uyg‘otkich signali <xliff:g id="ALARM">%1$s</xliff:g> da chalinadi."</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"O‘chirish"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Kiritish"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Chizmali parol unutilgan"</string> - <string name="kg_wrong_pattern" msgid="1850806070801358830">"Xato chizma paroli"</string> - <string name="kg_wrong_password" msgid="2333281762128113157">"Xato parol"</string> - <string name="kg_wrong_pin" msgid="1131306510833563801">"Xato PIN kod"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> + <string name="kg_wrong_pattern" msgid="1850806070801358830">"Chizmali kalit noto‘g‘ri"</string> + <string name="kg_wrong_password" msgid="2333281762128113157">"Parol noto‘g‘ri"</string> + <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN-kod noto‘g‘ri"</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"<xliff:g id="NUMBER">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Chizmali parolni chizing"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"SIM karta PIN kodini kiriting"</string> <string name="kg_sim_pin_instructions_multi" msgid="7818515973197201434">"“<xliff:g id="CARRIER">%1$s</xliff:g>” SIM kartasi uchun PIN kodni kiriting"</string> @@ -76,9 +75,9 @@ <string name="kg_invalid_puk" msgid="3638289409676051243">"To‘g‘ri PUK kodni qayta kiriting. Qayta-qayta urinishlar SIM kartani butunlay o‘chirib qo‘yadi."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN kodlar bir xil emas"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Chizmali parolni ochishga juda ko‘p urinildi"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"PIN kodingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Chizmali parolingizni <xliff:g id="NUMBER_0">%d</xliff:g> marta xato chizdingiz. \n\n <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qaytadan urinib ko‘ring."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Siz PIN-kodni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Siz parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. \n\n<xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="8774056606869646621">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu planshetda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="1843331751334128428">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ushbu telefonda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="258925501999698032">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ushbu planshetda zavod sozlamalari qayta tiklanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string> @@ -91,8 +90,8 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Agar yana <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinish qilsangiz, ishchi profil o‘chirib tashlanadi va undagi barcha profil ma’lumotlari ham o‘chib ketadi."</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"Siz planshetni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ishchi profil o‘chirib tashlanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Siz telefonni qulfdan chiqarish uchun <xliff:g id="NUMBER">%d</xliff:g> marta noto‘g‘ri urinish qildingiz. Endi, ishchi profil o‘chirib tashlanadi va undagi barcha ma’lumotlar ham o‘chib ketadi."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Chizmali parolni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri kiritdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, planshet qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Siz chizmali kalitni <xliff:g id="NUMBER_0">%d</xliff:g> marta noto‘g‘ri chizdingiz. <xliff:g id="NUMBER_1">%d</xliff:g> marta muvaffaqiyatsiz urinishdan so‘ng, sizdan e-pochtangizdan foydalanib, telefon qulfini ochishingiz so‘raladi.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> soniyadan so‘ng yana urinib ko‘ring."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM karta PIN kodi noto‘g‘ri. Qurilma qulfini ochish uchun aloqa operatoringiz bilan bog‘laning."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="6721575017538162249"> <item quantity="other">SIM kartaning PIN kodi noto‘g‘ri. Sizda yana <xliff:g id="NUMBER_1">%d</xliff:g> ta urinish qoldi.</item> diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml index 7e48d5741fca..1aed81cb92a6 100644 --- a/packages/Keyguard/res/values-vi/strings.xml +++ b/packages/Keyguard/res/values-vi/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Thẻ SIM đã bị khóa PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Đang mở khóa thẻ SIM…"</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mở khóa bằng hình."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Mở khóa bằng khuôn mặt."</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Mở khóa bằng mã pin."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Mở khóa bằng mật khẩu."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Khu vực hình."</string> diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index ee111221bae6..c11b7a0ab0a6 100644 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM卡已被PUK码锁定。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解锁SIM卡..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"图案解锁。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人脸解锁。"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN码解锁。"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密码解锁。"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"图案区域。"</string> diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml index f1310b0424a8..8bd8532f905a 100644 --- a/packages/Keyguard/res/values-zh-rHK/strings.xml +++ b/packages/Keyguard/res/values-zh-rHK/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解開上鎖的 SIM 卡..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"臉容解鎖。"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案區域。"</string> diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml index 88945e57b415..14dd76f834af 100644 --- a/packages/Keyguard/res/values-zh-rTW/strings.xml +++ b/packages/Keyguard/res/values-zh-rTW/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解除 SIM 卡鎖定..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖形解鎖。"</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"人臉解鎖。"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖形區域。"</string> diff --git a/packages/Keyguard/res/values-zu/strings.xml b/packages/Keyguard/res/values-zu/strings.xml index eaf6fd51f6d4..60b5e20a1cec 100644 --- a/packages/Keyguard/res/values-zu/strings.xml +++ b/packages/Keyguard/res/values-zu/strings.xml @@ -45,7 +45,6 @@ <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Ikhadi le-SIM likhiywe nge-PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ivula ikhadi le-SIM..."</string> <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string> - <string name="keyguard_accessibility_face_unlock" msgid="4817282543351718535">"Vula ngobuso"</string> <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ukuvula ngephinikhodi."</string> <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ukuvula ngephasiwedi."</string> <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Indawo yephethini."</string> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java index b5eda9012f20..1c4b96325fbf 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityViewFlipper.java @@ -16,6 +16,7 @@ package com.android.keyguard; +import android.annotation.NonNull; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Rect; @@ -25,12 +26,15 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; +import android.view.ViewHierarchyEncoder; import android.view.WindowManager; import android.widget.FrameLayout; import android.widget.ViewFlipper; import com.android.internal.widget.LockPatternUtils; +import java.lang.Override; + /** * Subclass of the current view flipper that allows us to overload dispatchTouchEvent() so * we can emulate {@link WindowManager.LayoutParams#FLAG_SLIPPERY} within a view hierarchy. @@ -268,5 +272,14 @@ public class KeyguardSecurityViewFlipper extends ViewFlipper implements Keyguard R.styleable.KeyguardSecurityViewFlipper_Layout_layout_maxHeight, 0); a.recycle(); } + + /** @hide */ + @Override + protected void encodeProperties(@NonNull ViewHierarchyEncoder encoder) { + super.encodeProperties(encoder); + + encoder.addProperty("layout:maxWidth", maxWidth); + encoder.addProperty("layout:maxHeight", maxHeight); + } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 09e6912205dd..28fa8fba5b36 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -26,6 +26,7 @@ import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.widget.Toast; @@ -63,10 +64,12 @@ public class WifiTracker { private final boolean mIncludeScans; private final boolean mIncludePasspoints; + private final MainHandler mMainHandler; + private final WorkHandler mWorkHandler; + private boolean mSavedNetworksExist; private boolean mRegistered; private ArrayList<AccessPoint> mAccessPoints = new ArrayList<>(); - private ArrayList<AccessPoint> mCachedAccessPoints = new ArrayList<>(); private NetworkInfo mLastNetworkInfo; private WifiInfo mLastInfo; @@ -74,23 +77,38 @@ public class WifiTracker { @VisibleForTesting Scanner mScanner; - public WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved, - boolean includeScans) { - this(context, wifiListener, includeSaved, includeScans, false); + public WifiTracker(Context context, WifiListener wifiListener, + boolean includeSaved, boolean includeScans) { + this(context, wifiListener, null, includeSaved, includeScans); } - public WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved, - boolean includeScans, boolean includePasspoints) { - this(context, wifiListener, includeSaved, includeScans, includePasspoints, + + public WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper, + boolean includeSaved, boolean includeScans) { + this(context, wifiListener, workerLooper, includeSaved, includeScans, false); + } + + public WifiTracker(Context context, WifiListener wifiListener, + boolean includeSaved, boolean includeScans, boolean includePasspoints) { + this(context, wifiListener, null, includeSaved, includeScans, includePasspoints); + } + + public WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper, + boolean includeSaved, boolean includeScans, boolean includePasspoints) { + this(context, wifiListener, workerLooper, includeSaved, includeScans, includePasspoints, (WifiManager) context.getSystemService(Context.WIFI_SERVICE)); } @VisibleForTesting - WifiTracker(Context context, WifiListener wifiListener, boolean includeSaved, - boolean includeScans, boolean includePasspoints, WifiManager wifiManager) { + WifiTracker(Context context, WifiListener wifiListener, Looper workerLooper, + boolean includeSaved, boolean includeScans, boolean includePasspoints, + WifiManager wifiManager) { if (!includeSaved && !includeScans) { throw new IllegalArgumentException("Must include either saved or scans"); } mContext = context; + mMainHandler = new MainHandler(); + mWorkHandler = new WorkHandler( + workerLooper != null ? workerLooper : Looper.myLooper()); mWifiManager = wifiManager; mIncludeSaved = includeSaved; mIncludeScans = includeScans; @@ -147,7 +165,7 @@ public class WifiTracker { if (mWifiManager.isWifiEnabled()) { mScanner.resume(); } - updateAccessPoints(); + mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); } /** @@ -213,16 +231,14 @@ public class WifiTracker { private void updateAccessPoints() { // Swap the current access points into a cached list. - ArrayList<AccessPoint> tmpSwp = mAccessPoints; - mAccessPoints = mCachedAccessPoints; - mCachedAccessPoints = tmpSwp; + ArrayList<AccessPoint> cachedAccessPoints = new ArrayList<>(mAccessPoints); + ArrayList<AccessPoint> accessPoints = new ArrayList<>(); + // Clear out the configs so we don't think something is saved when it isn't. - for (AccessPoint accessPoint : mCachedAccessPoints) { + for (AccessPoint accessPoint : cachedAccessPoints) { accessPoint.clearConfig(); } - mAccessPoints.clear(); - /** Lookup table to more quickly update AccessPoints by only considering objects with the * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ Multimap<String, AccessPoint> apMap = new Multimap<String, AccessPoint>(); @@ -238,7 +254,7 @@ public class WifiTracker { if (config.selfAdded && config.numAssociation == 0) { continue; } - AccessPoint accessPoint = getCachedOrCreate(config); + AccessPoint accessPoint = getCachedOrCreate(config, cachedAccessPoints); if (mLastInfo != null && mLastNetworkInfo != null) { if (config.isPasspoint() == false) { accessPoint.update(mLastInfo, mLastNetworkInfo); @@ -246,7 +262,7 @@ public class WifiTracker { } if (mIncludeSaved) { if (!config.isPasspoint() || mIncludePasspoints) - mAccessPoints.add(accessPoint); + accessPoints.add(accessPoint); if (config.isPasspoint() == false) { apMap.put(accessPoint.getSsid(), accessPoint); @@ -254,7 +270,7 @@ public class WifiTracker { } else { // If we aren't using saved networks, drop them into the cache so that // we have access to their saved info. - mCachedAccessPoints.add(accessPoint); + cachedAccessPoints.add(accessPoint); } } } @@ -276,7 +292,7 @@ public class WifiTracker { } } if (!found && mIncludeScans) { - AccessPoint accessPoint = getCachedOrCreate(result); + AccessPoint accessPoint = getCachedOrCreate(result, cachedAccessPoints); if (mLastInfo != null && mLastNetworkInfo != null) { accessPoint.update(mLastInfo, mLastNetworkInfo); } @@ -296,24 +312,23 @@ public class WifiTracker { accessPoint.update(connectionConfig); } - mAccessPoints.add(accessPoint); + accessPoints.add(accessPoint); apMap.put(accessPoint.getSsid(), accessPoint); } } } // Pre-sort accessPoints to speed preference insertion - Collections.sort(mAccessPoints); - if (mListener != null) { - mListener.onAccessPointsChanged(); - } + Collections.sort(accessPoints); + mAccessPoints = accessPoints; + mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED); } - private AccessPoint getCachedOrCreate(ScanResult result) { - final int N = mCachedAccessPoints.size(); + private AccessPoint getCachedOrCreate(ScanResult result, ArrayList<AccessPoint> cache) { + final int N = cache.size(); for (int i = 0; i < N; i++) { - if (mCachedAccessPoints.get(i).matches(result)) { - AccessPoint ret = mCachedAccessPoints.remove(i); + if (cache.get(i).matches(result)) { + AccessPoint ret = cache.remove(i); ret.update(result); return ret; } @@ -321,11 +336,11 @@ public class WifiTracker { return new AccessPoint(mContext, result); } - private AccessPoint getCachedOrCreate(WifiConfiguration config) { - final int N = mCachedAccessPoints.size(); + private AccessPoint getCachedOrCreate(WifiConfiguration config, ArrayList<AccessPoint> cache) { + final int N = cache.size(); for (int i = 0; i < N; i++) { - if (mCachedAccessPoints.get(i).matches(config)) { - AccessPoint ret = mCachedAccessPoints.remove(i); + if (cache.get(i).matches(config)) { + AccessPoint ret = cache.remove(i); ret.loadConfig(config); return ret; } @@ -360,9 +375,7 @@ public class WifiTracker { } if (reorder) { Collections.sort(mAccessPoints); - if (mListener != null) { - mListener.onAccessPointsChanged(); - } + mMainHandler.sendEmptyMessage(MainHandler.MSG_ACCESS_POINT_CHANGED); } } @@ -380,15 +393,13 @@ public class WifiTracker { mScanner.pause(); } } - if (mListener != null) { - mListener.onWifiStateChanged(state); - } + mMainHandler.obtainMessage(MainHandler.MSG_WIFI_STATE_CHANGED, state, 0).sendToTarget(); } public static List<AccessPoint> getCurrentAccessPoints(Context context, boolean includeSaved, boolean includeScans, boolean includePasspoints) { WifiTracker tracker = new WifiTracker(context, - null, includeSaved, includeScans, includePasspoints); + null, null, includeSaved, includeScans, includePasspoints); tracker.forceUpdate(); return tracker.getAccessPoints(); } @@ -404,22 +415,68 @@ public class WifiTracker { } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { - updateAccessPoints(); + mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( WifiManager.EXTRA_NETWORK_INFO); mConnected.set(info.isConnected()); - if (mListener != null) { - mListener.onConnectedChanged(); - } - updateAccessPoints(); - updateNetworkInfo(info); + + mMainHandler.sendEmptyMessage(MainHandler.MSG_CONNECTED_CHANGED); + + mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS); + mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info) + .sendToTarget(); } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { - updateNetworkInfo(null); + mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO); } } }; + private final class MainHandler extends Handler { + private static final int MSG_CONNECTED_CHANGED = 0; + private static final int MSG_WIFI_STATE_CHANGED = 1; + private static final int MSG_ACCESS_POINT_CHANGED = 2; + + @Override + public void handleMessage(Message msg) { + if (mListener == null) { + return; + } + switch (msg.what) { + case MSG_CONNECTED_CHANGED: + mListener.onConnectedChanged(); + break; + case MSG_WIFI_STATE_CHANGED: + mListener.onWifiStateChanged(msg.arg1); + break; + case MSG_ACCESS_POINT_CHANGED: + mListener.onAccessPointsChanged(); + break; + } + } + } + + private final class WorkHandler extends Handler { + private static final int MSG_UPDATE_ACCESS_POINTS = 0; + private static final int MSG_UPDATE_NETWORK_INFO = 1; + + public WorkHandler(Looper looper) { + super(looper); + } + + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_UPDATE_ACCESS_POINTS: + updateAccessPoints(); + break; + case MSG_UPDATE_NETWORK_INFO: + updateNetworkInfo((NetworkInfo) msg.obj); + break; + } + } + } + @VisibleForTesting class Scanner extends Handler { private static final int MSG_SCAN = 0; diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 1953e75be4ee..5f5d61e889eb 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -35,6 +35,7 @@ import android.database.MatrixCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import android.hardware.camera2.utils.ArrayUtils; +import android.media.AudioManager; import android.net.Uri; import android.os.Binder; import android.os.Build; @@ -52,9 +53,11 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; + import com.android.internal.annotations.GuardedBy; import com.android.internal.content.PackageMonitor; import com.android.internal.os.BackgroundThread; + import java.io.File; import java.io.FileDescriptor; import java.io.FileNotFoundException; @@ -1788,7 +1791,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 118; + private static final int SETTINGS_VERSION = 119; private final int mUserId; @@ -1891,6 +1894,20 @@ public class SettingsProvider extends ContentProvider { int currentVersion = oldVersion; + // v119: Reset zen + ringer mode. + if (currentVersion == 118) { + if (userId == UserHandle.USER_OWNER) { + final SettingsState globalSettings = getGlobalSettingsLocked(); + globalSettings.updateSettingLocked(Settings.Global.ZEN_MODE, + Integer.toString(Settings.Global.ZEN_MODE_OFF), + SettingsState.SYSTEM_PACKAGE_NAME); + globalSettings.updateSettingLocked(Settings.Global.MODE_RINGER, + Integer.toString(AudioManager.RINGER_MODE_NORMAL), + SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 119; + } + // vXXX: Add new settings above this point. // Return the current version. diff --git a/packages/SystemUI/res/drawable/segmented_buttons_background.xml b/packages/SystemUI/res/drawable/segmented_buttons_background.xml new file mode 100644 index 000000000000..b243dc7ce8c0 --- /dev/null +++ b/packages/SystemUI/res/drawable/segmented_buttons_background.xml @@ -0,0 +1,22 @@ +<!-- + Copyright (C) 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. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" > + + <corners android:radius="@dimen/borderless_button_radius" /> + + <solid android:color="@color/segmented_buttons_background" /> + +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/drawable/zen_introduction_message_background.xml b/packages/SystemUI/res/drawable/zen_introduction_message_background.xml new file mode 100644 index 000000000000..352fb57bb2b9 --- /dev/null +++ b/packages/SystemUI/res/drawable/zen_introduction_message_background.xml @@ -0,0 +1,22 @@ +<!-- + Copyright (C) 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. +--> +<shape xmlns:android="http://schemas.android.com/apk/res/android" > + + <corners android:radius="@dimen/borderless_button_radius" /> + + <solid android:color="@color/zen_introduction_message_background" /> + +</shape>
\ No newline at end of file diff --git a/packages/SystemUI/res/layout/segmented_button.xml b/packages/SystemUI/res/layout/segmented_button.xml index b7a79329c623..9e1f373a6e77 100644 --- a/packages/SystemUI/res/layout/segmented_button.xml +++ b/packages/SystemUI/res/layout/segmented_button.xml @@ -25,4 +25,4 @@ android:textColor="@color/segmented_button_text_selector" android:background="@drawable/btn_borderless_rect" android:textAppearance="@style/TextAppearance.QS.SegmentedButton" - android:minHeight="64dp" /> + android:minHeight="72dp" /> diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index 53ae61bca438..d12bf5db3fb2 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -50,9 +50,7 @@ android:layout_toEndOf="@id/volume_row_icon" android:layout_toStartOf="@+id/volume_settings_button" android:paddingEnd="8dp" - android:paddingStart="8dp" - android:progressTint="@android:color/white" - android:thumbTint="@android:color/white" /> + android:paddingStart="8dp" /> <com.android.keyguard.AlphaOptimizedImageButton android:id="@+id/volume_settings_button" diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml index 9e761e2142a5..b780f7d8953b 100644 --- a/packages/SystemUI/res/layout/volume_zen_footer.xml +++ b/packages/SystemUI/res/layout/volume_zen_footer.xml @@ -72,6 +72,7 @@ android:focusable="true" android:minWidth="91dp" android:text="@string/volume_zen_end_now" + android:textColor="@color/system_accent_color" android:textAppearance="@style/TextAppearance.QS.DetailButton" /> </LinearLayout> diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml index 595c9ede07a7..2160ca3ee303 100644 --- a/packages/SystemUI/res/layout/zen_mode_panel.xml +++ b/packages/SystemUI/res/layout/zen_mode_panel.xml @@ -24,35 +24,33 @@ <com.android.systemui.volume.SegmentedButtons android:id="@+id/zen_buttons" + android:background="@drawable/segmented_buttons_background" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginStart="8dp" - android:layout_marginEnd="8dp" /> - - <View - android:id="@+id/zen_embedded_divider" - android:layout_width="match_parent" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:layout_marginTop="8dp" - android:layout_height="1dp" - android:background="#4dffffff" /> + android:layout_marginBottom="8dp" /> <RelativeLayout android:id="@+id/zen_introduction" android:layout_width="match_parent" android:layout_height="wrap_content" - android:paddingEnd="4dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" android:paddingTop="8dp" android:paddingBottom="8dp" - android:background="@color/zen_introduction_message_background" > + android:background="@drawable/zen_introduction_message_background" > <ImageView android:id="@+id/zen_introduction_confirm" android:layout_width="48dp" android:layout_height="48dp" + android:layout_marginEnd="8dp" android:layout_alignParentEnd="true" android:background="@drawable/btn_borderless_rect" android:clickable="true" - android:contentDescription="@string/accessibility_desc_confirm" + android:contentDescription="@string/accessibility_desc_close" android:scaleType="center" android:src="@drawable/ic_close" android:tint="@android:color/white" /> @@ -73,7 +71,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" - android:layout_marginEnd="4dp" + android:layout_marginEnd="12dp" android:layout_below="@id/zen_introduction_message" android:clickable="true" android:focusable="true" diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index c14e15e5bb03..098d8c3be21c 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Deursoek"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Foon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ontsluit"</string> <string name="unlock_label" msgid="8779712358041029439">"ontsluit"</string> <string name="phone_label" msgid="2320074140205331708">"maak foon oop"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX twee strepies."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX drie strepies."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-sein vol."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet is ontkoppel."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet gekoppel."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Geen sein nie."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nie gekoppel nie."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Geen stawe."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwerp."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle onlangse programme is toegemaak."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Begin tans <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Kennisgewing is toegemaak."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kennisgewingskerm."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Vinnige instellings."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sluitskerm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oorsig."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bevestig"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Maak toe"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi afgeskakel."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder dringende kennisgewings hieronder"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Raak weer om oop te maak"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Sleep op om te ontsluit"</string> - <string name="phone_hint" msgid="3101468054914424646">"Sleep regs vir foon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Sleep links vir kamera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Volkome stilte"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Net prioriteit"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Net wekkers"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Deaktiveer VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Ontkoppel VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Jou toestel word bestuur deur <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word, en jou toestel se ligginginligting monitor en bestuur. Kontak jou administrateur vir meer inligting."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Jy het \'n program toestemming gegee om \'n VPN-verbinding op te stel.\n\nHierdie program kan jou toestel- en netwerkaktiwiteit monitor, insluitend e-posse, programme en webwerwe."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Jou toestel word bestuur deur <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJou administrateur kan instellings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word, en jou toestel se ligginginligting monitor en bestuur.\n\nJy is aan \'n VPN gekoppel wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nKontak jou administrateur vir meer inligting."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Jou werkprofiel word deur <xliff:g id="ORGANIZATION">%1$s</xliff:g> bestuur.\n\nJou administrateur is in staat om jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, te monitor.\n\nKontak jou administrateur vir meer inligting.\n\nJy is ook aan \'n VPN gekoppel wat jou netwerkaktiwiteit kan monitor."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Jy is gekoppel aan <xliff:g id="APPLICATION">%1$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Jy is gekoppel aan <xliff:g id="APPLICATION">%1$s</xliff:g>, wat jou persoonlike netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Jou werkprofiel word deur <xliff:g id="ORGANIZATION">%1$s</xliff:g> bestuur. Dit is gekoppel aan <xliff:g id="APPLICATION">%2$s</xliff:g>, wat jou werknetwerkaktiwiteit, insluitend eposse, programme en webwerwe, kan monitor.\n\nVir meer inligting, kontak jou administrateur."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Jou werkprofiel word deur <xliff:g id="ORGANIZATION">%1$s</xliff:g> bestuur. Dit is gekoppel aan <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, wat jou werknetwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nJy is ook gekoppel aan <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, wat jou persoonlike netwerkaktiwiteit kan monitor."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jou toestel word bestuur deur <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nJou administrateur kan instelings, korporatiewe toegang, programme, data wat met jou toestel geassosieer word en jou toestel se ligginginligting monitor en bestuur.\n\nJy is gekoppel aan <xliff:g id="APPLICATION">%2$s</xliff:g>, wat jou netwerkaktiwiteit, insluitend e-posse, programme en webwerwe, kan monitor.\n\nVir meer inligting, kontak jou administrateur."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Toestel sal gesluit bly totdat jy dit handmatig ontsluit"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Kry kennisgewings vinniger"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Sien hulle voordat jy ontsluit"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Versteek alles"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Beëindig nou"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skerm is vasgespeld"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig op dieselfde tyd om te ontspeld."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Dit hou dit in sig totdat jy ontspeld. Raak en hou Oorsig om te ontspeld."</string> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 2a9153469002..3fb27b2094af 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string> <string name="cancel" msgid="6442560571259935130">"ይቅር"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> በመጀመር ላይ።"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"አረጋግጥ"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ዝጋ"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ተጠቃሚ <xliff:g id="USER">%s</xliff:g>።"</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">"Wifi ጠፍቷል።"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"በጣም አስቸካይ ያልሆኑ ማሳወቂያዎች ከታች"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ለመክፈት ዳግም ይንኩ"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"ለማስከፈት ወደ ላይ ያንሸራትቱ"</string> - <string name="phone_hint" msgid="3101468054914424646">"ለስልክ ወደቀኝ ያንሸራትቱ"</string> - <string name="camera_hint" msgid="5241441720959174226">"ለካሜራ ወደግራ ያንሸራትቱ"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN አሰናክል"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"የVPN ግንኙነት አቋርጥ"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"የእርስዎ መሣሪያ የሚቀናበረው በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻ፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን፣ እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላሉ። ተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"አንድ መተግበሪያ የVPN ግንኙነት እንዲያዋቅር ፍቃድ ሰጥተውታል።\n\nይህ መተግበሪያ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የመሣሪያዎን እና የአውታረ መረብ እንቅስቃሴዎን መከታተል ይችላል።"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"የእርስዎ መሣሪያ የሚቀናበረው በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻ፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎን የአካባቢ መረጃ መከታተል እና ማቀናበር ይችላል።\n\nከአንድ VPN ጋር ተገናኝተዋል፣ ይሄ ደግሞ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብዎን እንቅስቃሴ መከታተል ይችላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"የስራ መገለጫዎ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።\n\nእንዲሁም የአውታረ መረብ ግንኙነትዎን መከታተል ከሚችል አንድ VPN ጋር ተገናኝተዋል።"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው <xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"እርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የግል የአውታረ መረብ እንቅስቃሴዎን ከሚከታተለው <xliff:g id="APPLICATION">%1$s</xliff:g> ጋር ተገናኝተዋል።"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"የስራ መገለጫዎ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"የስራ መገለጫዎ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው እየተዳደረ ያለው። ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችንም ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nእንዲሁም የግል አውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ጋርም ተገናኝተዋል።"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"የእርስዎ መሣሪያ በ<xliff:g id="ORGANIZATION">%1$s</xliff:g> ነው የሚተዳደረው።\n\nየእርስዎ አስተዳዳሪ ቅንብሮችን፣ የኮርፖሬት መዳረሻን፣ መተግበሪያዎችን፣ ከመሣሪያዎ ጋር የተጎዳኘ ውሂብን እና የመሣሪያዎ የአካባቢ መረጃን መከታተል እና ማቀናበር ይችላል።\n\nእርስዎ ኢሜይሎችን፣ መተግበሪያዎችን እና ድር ጣቢያዎችን ጨምሮ የአውታረ መረብ እንቅስቃሴዎን መከታተል ከሚችለው <xliff:g id="APPLICATION">%2$s</xliff:g> ጋር ተገናኝተዋል።\n\nተጨማሪ መረጃ ለማግኘት አስተዳዳሪዎን ያነጋግሩ።"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"ሁሉንም ደብቅ"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"አሁን ጨርስ"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ማያ ገጽ ተሰክቷል"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ይህ እስከሚነቅሉት ድረስ ድረስ በዕይታ ውስጥ እንዲቆይ ያደርገዋል። ለመንቀል በተመሳሳይ ጊዜ ተመለስን እና አጠቃላይ ዕይታን አንድ ላይ ነክተው ይያዙ።"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ይህ እስከሚነቅሉት ድረስ በዕይታ ውስጥ ያቆየዋል። እንዲነቀል ለማድረግ አጠቃላይ ዕይታን ነካ አድርገው ይያዙት።"</string> diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index 560004295c8d..59be694e6a77 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -87,9 +87,11 @@ <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> <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> @@ -125,10 +127,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"تم قطع اتصال Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"تم إنشاء اتصال Ethernet."</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> @@ -170,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"جارٍ بدء <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"تأكيد"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"إغلاق"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"المستخدم <xliff:g id="USER">%s</xliff:g>."</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">"تم إيقاف Wifi."</string> @@ -319,8 +318,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"الإشعارات الأقل إلحاحًا أدناه"</string> <string name="notification_tap_again" msgid="8524949573675922138">"المس مرة أخرى للفتح"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"مرر سريعًا لأعلى لإلغاء القفل"</string> - <string name="phone_hint" msgid="3101468054914424646">"مرر سريعًا إلى اليسار لفتح الهاتف"</string> - <string name="camera_hint" msgid="5241441720959174226">"مرر سريعًا إلى اليمين لفتح الكاميرا"</string> + <string name="phone_hint" msgid="4872890986869209950">"يمكنك التمرير سريعًا من الرمز لتشغيل الهاتف"</string> + <string name="voice_hint" msgid="8939888732119726665">"يمكنك التمرير سريعًا من الرمز لتشغيل المساعد الصوتي"</string> + <string name="camera_hint" msgid="7939688436797157483">"يمكنك التمرير سريعًا من الرمز لتشغيل الكاميرا"</string> <string name="interruption_level_none" msgid="6000083681244492992">"كتم الصوت تمامًا"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"الأولوية فقط"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"التنبيهات فقط"</string> @@ -384,6 +384,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"إخفاء الكل"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"إنهاء الآن"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"توسيع"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"تصغير"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"تم تثبيت الشاشة"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"يساعد هذا على استمرار العرض حتى يتم إلغاء التثبيت. ويمكنك لمس \"رجوع\" و\"عرض عام\" مع الاستمرار في وقت واحد لإلغاء التثبيت."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"يساعد هذا على استمرار العرض حتى يتم إلغاء التثبيت. ويمكنك لمس \"عرض عام\" مع الاستمرار في وقت واحد لإلغاء التثبيت."</string> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index fdd9c0419864..0898bec1acb4 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Избиране на ново оформление за задачите"</string> <string name="cancel" msgid="6442560571259935130">"Отказ"</string> @@ -121,10 +125,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Връзката с Ethernet е прекратена."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Установена е връзка с Ethernet."</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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> се стартира."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Потвърждаване"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Затваряне"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Потребител: <xliff:g id="USER">%s</xliff:g>."</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">"Функцията за Wi-Fi се изключи."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Ппоказване на по-малко спешните известия по-долу"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Докоснете отново за отваряне"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Прекарайте пръст нагоре, за да отключите"</string> - <string name="phone_hint" msgid="3101468054914424646">"Прекарайте пръст надясно, за да използвате телефона"</string> - <string name="camera_hint" msgid="5241441720959174226">"Прекарайте пръст наляво, за да включите камерата"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Деактивиране на VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Прекратяване на връзката с VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Устройството ви се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му. За още подробности се свържете с администратора си."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Разрешихте на приложение да настрои връзка с виртуална частна мрежа (VPN).\n\nТова приложение може да наблюдава активността ви на устройството и в мрежата, включително имейли, приложения и уебсайтове."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Устройството ви се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nСвързани сте с виртуална частна мрежа (VPN) и активността ви в нея може да се наблюдава, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Служебният ви потребителски профил се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си.\n\nСъщо така е установена връзка с виртуална частна мрежа (VPN) и активността ви в нея може да се наблюдава."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Установена е връзка с приложението <xliff:g id="APPLICATION">%1$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Установена е връзка с приложението <xliff:g id="APPLICATION">%1$s</xliff:g>, което може да наблюдава личната ви активност в мрежата, включително имейли, приложения и уебсайтове."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Служебният ви потребителски профил се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Той е свързан с приложението <xliff:g id="APPLICATION">%2$s</xliff:g>, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Служебният ви потребителски профил се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Той е свързан с приложението <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, което може да наблюдава служебната ви активност в мрежата, включително имейли, приложения и уебсайтове.\n\nУстановена е връзка и с приложението <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, което може да наблюдава личната ви активност в мрежата."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Устройството ви се управлява от <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистраторът ви може да наблюдава и управлява настройките, корпоративния достъп, приложенията и данните, свързани с устройството ви, включително информацията за местоположението му.\n\nУстановена е връзка с приложението <xliff:g id="APPLICATION">%2$s</xliff:g>, което може да наблюдава активността ви в мрежата, включително имейли, приложения и уебсайтове.\n\nЗа още информация се свържете с администратора си."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Скриване на всичко"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Прекратяване сега"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Екранът е фиксиран"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Така екранът ще се показва, докато не го освободите. За да направите това, докоснете и задръжте бутона за връщане назад и този за общ преглед едновременно."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Така екранът ще се показва, докато не го освободите. За да направите това, докоснете и задръжте бутона за общ преглед."</string> diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml index a56b31b38ff6..e9bc159615e8 100644 --- a/packages/SystemUI/res/values-bn-rBD/strings.xml +++ b/packages/SystemUI/res/values-bn-rBD/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট নির্বাচন করুন"</string> <string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> তারাঙ্কিত করা হচ্ছে।"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"নিশ্চিত করুন"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"বন্ধ করুন"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ব্যবহারকারী <xliff:g id="USER">%s</xliff:g>৷"</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">"WiFi বন্ধ হয়েছে।"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"নিচে অপেক্ষাকৃত কম জরুরী বিজ্ঞপ্তিগুলি"</string> <string name="notification_tap_again" msgid="8524949573675922138">"খোলার জন্য আবার স্পর্শ করুন"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক করতে উপরের দিকে সোয়াইপ করুন"</string> - <string name="phone_hint" msgid="3101468054914424646">"ফোনের জন্য ডানদিকে সোয়াইপ করুন"</string> - <string name="camera_hint" msgid="5241441720959174226">"ক্যামেরার জন্য ডানদিকে সোয়াইপ করুন"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN অক্ষম করুন"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN এর সংযোগ বিচ্ছিন্ন করুন"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশানগুলি, ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷ আরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"আপনি VPN সংযোগ সেট আপ করার জন্য একটি অ্যাপ্লিকেশানকে অনুমতি দিন৷\n\nএই অ্যাপ্লিকেশানটি ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার ডিভাইস এবং নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে।"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি একটি VPN এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও নিরাপদ ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কাজের প্রোফাইল পরিচালনা করে৷\n\nআপনার প্রশাসক ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে সক্ষম৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷\n\nএছাড়াও আপনি একটি VPN, এর সাথে সংযুক্ত রয়েছেন যা আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"আপনি <xliff:g id="APPLICATION">%1$s</xliff:g> এ সংযুক্ত হয়েছেন, যা ইমেল, অ্যাপ্লিকেশান এবং ওয়েবসাইটগুলি সমেত আপনার ব্যক্তিগত নেটওয়ার্ক কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি <xliff:g id="APPLICATION">%2$s</xliff:g> এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার কাজের প্রোফাইল পরিচালনা করে৷ এটি <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> এ সংযুক্ত রয়েছে যা আপনার ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার কাজের নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nএছাড়াও আপনি <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন যা আপনার ব্যক্তিগত নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> আপনার ডিভাইস পরিচালনা করে৷\n\nআপনার প্রশাসক আপনার ডিভাইসের সাথে সম্পর্কিত সেটিংস, কর্পোরেট অ্যাক্সেস, অ্যাপ্লিকেশান ডেটা এবং ডিভাইসের অবস্থান সম্পর্কিত তথ্য নিরীক্ষণ ও পরিচালনা করতে পারেন৷\n\nআপনি <xliff:g id="APPLICATION">%2$s</xliff:g> এর সাথে সংযুক্ত রয়েছেন যা ইমেল, অ্যাপ্লিকেশান ও ওয়েবসাইটগুলি সহ আপনার নেটওয়ার্কের কার্যকলাপ নিরীক্ষণ করতে পারে৷\n\nআরো তথ্যের জন্য, আপনার প্রশাসকের সাথে যোগাযোগ করুন৷"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"সবগুলি লুকান"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"এখন সমাপ্ত করুন"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্রীন পিন করা হয়েছে"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"এটি আপনার আনপিন না করা পর্যন্ত এটিকে দর্শনে রাখে৷ আনপিন করতে একই সময়ে ফিরুন এবং ওভারভিউ এ স্পর্শ করে ধরে রাখুন৷"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"এটি আপনার আনপিন না করা পর্যন্ত এটিকে দর্শনে রাখে৷ আনপিন করতে ওভারভিউ এ স্পর্শ করে ধরে রাখুন৷"</string> diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index 78de31468be7..14e990b1d284 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Cerca"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Càmera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telèfon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloqueja"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloqueja"</string> <string name="phone_label" msgid="2320074140205331708">"obre el telèfon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dues barres de WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tres barres de WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Senyal de WiMAX plena."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"S\'ha desconnectat l\'Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"S\'ha connectat l\'Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sense senyal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Sense connexió."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Cap barra."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"S\'ha omès <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"S\'han descartat totes les aplicacions recents."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"S\'està iniciant <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificació omesa."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Àrea de notificacions"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuració ràpida."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueig"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuració"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visió general"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirma"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Tanca"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuari <xliff:g id="USER">%s</xliff:g>."</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">"La xarxa Wi-Fi està desactivada."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacions menys urgents a continuació"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Torna a tocar per obrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Fes lliscar el dit cap amunt per desbloquejar el teclat."</string> - <string name="phone_hint" msgid="3101468054914424646">"Fes lliscar el dit cap a la dreta per obrir el telèfon."</string> - <string name="camera_hint" msgid="5241441720959174226">"Fes lliscar el dit cap a l\'esquerra per obrir la càmera."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silenci total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Només amb prioritat"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Només alarmes"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Desactiva la VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desconnecta la VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Administrador del dispositiu: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'administrador pot supervisar i gestionar la configuració, l\'accés corporatiu, les aplicacions i les dades associades amb aquest dispositiu, inclosa la informació d\'ubicació. Per obtenir més informació, contacta amb l\'administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Has donat permís a una aplicació per configurar una connexió VPN.\n\nAquesta aplicació pot supervisar el dispositiu i l\'activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Administrador del dispositiu: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb aquest dispositiu, inclosa la seva informació d\'ubicació.\n\nEstàs connectat a una VPN, que pot supervisar l\'activitat de la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el perfil de Work.\n\nL\'administrador pot supervisar l\'activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador.\n\nA més, estàs connectat a una VPN, que pot supervisar l\'activitat a la xarxa."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Estàs connectat a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pot supervisar la teva activitat a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Estàs connectat a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pot supervisar la teva activitat personal a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el perfil de Work. El perfil està connectat a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el perfil de Work. El perfil està connectat a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pot supervisar la teva activitat professional a la xarxa, com ara els correus electrònics, les aplicacions i els llocs web.\n\nA més, estàs connectat a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pot supervisar la teva activitat personal a la xarxa."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> gestiona el dispositiu.\n\nL\'administrador pot supervisar i gestionar el següent: configuració, accés corporatiu, aplicacions i dades associades amb el dispositiu, inclosa la informació d\'ubicació.\n\nEstàs connectat a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pot supervisar l\'activitat a la xarxa, com ara els correus, les aplicacions i els llocs web.\n\nPer obtenir més informació, contacta amb l\'administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"El dispositiu continuarà bloquejat fins que no el desbloquegis manualment."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Obtén notificacions més ràpidament"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Mostra-les abans de desbloquejar"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Amaga-les totes"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalitza ara"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"La pantalla està fixada"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Continuarà a la visualització fins que n\'anul·lis la fixació. Per fer-ho, toca i mantén premuts els botons Enrere i Visió general a la vegada."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Continuarà a la visualització fins que n\'anul·lis la fixació. Per fer-ho, toca i mantén premut el botó Visió general."</string> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index e8dc73cb5257..3c82ccb31eea 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -85,9 +85,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Hledat"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparát"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odemknout"</string> <string name="unlock_label" msgid="8779712358041029439">"odemknout"</string> <string name="phone_label" msgid="2320074140205331708">"otevřít telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -123,10 +127,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dvě čárky signálu sítě WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tři čárky signálu sítě WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Plný signál sítě WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Síť ethernet je odpojena."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Síť ethernet je připojena."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Není signál."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nepřipojeno."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Žádná čárka."</string> @@ -170,15 +172,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikace <xliff:g id="APP">%s</xliff:g> byla odebrána."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všechny naposledy použité aplikace byly odstraněny."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Spouštění aplikace <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Oznámení je zavřeno."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Panel oznámení."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rychlé nastavení."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Obrazovka uzamčení"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavení"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Přehled"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdit"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Zavřít"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uživatel <xliff:g id="USER">%s</xliff:g>."</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">"Připojení Wi-Fi je vypnuto."</string> @@ -319,8 +320,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Méně urgentní oznámení níže"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Otevřete opětovným klepnutím"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Zařízení odemknete přejetím prstem nahoru"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefon otevřete přejetím prstem vpravo."</string> - <string name="camera_hint" msgid="5241441720959174226">"Fotoaparát otevřete přejetím prstem vlevo."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Úplné ticho"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Pouze prioritní"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Pouze budíky"</string> @@ -366,23 +371,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Deaktivovat VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Odpojit VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu. O další informace požádejte svého administrátora."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Udělili jste aplikaci oprávnění k nastavení připojení VPN. \n\nTato aplikace může sledovat vaši aktivitu v zařízení a v síti, včetně e-mailů, aplikací a webových stránek."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a jeho polohu.\n\nJste připojeni k síti VPN, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Váš pracovní profil spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrátor může monitorovat vaši síťovou aktivitu, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora.\n\nJste také připojeni k síti VPN, která může sledovat vaši aktivitu v síti."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Jste připojeni k aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Jste připojeni k aplikaci <xliff:g id="APPLICATION">%1$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Váš pracovní profil spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je připojen k aplikaci <xliff:g id="APPLICATION">%2$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Váš pracovní profil spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je připojen k aplikaci <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, která může sledovat vaši aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nTaké jste připojeni k aplikaci <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Toto zařízení spravuje organizace <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrátor může sledovat a spravovat nastavení, firemní přístup, aplikace, data přidružená k tomuto zařízení a informace o jeho poloze.\n\nJste připojeni k aplikaci <xliff:g id="APPLICATION">%2$s</xliff:g>, která může sledovat vaši osobní aktivitu v síti, včetně e-mailů, aplikací a webů.\n\nO další informace požádejte svého administrátora."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Zařízení zůstane uzamčeno, dokud je ručně neodemknete"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Čtěte si oznámení rychleji"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Můžete si je přečíst před odemčením obrazovky."</string> @@ -392,6 +389,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Skrýt vše"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Ukončit"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je připnuta"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Chcete-li jej uvolnit, stiskněte a podržte současně tlačítka Zpět a Přehled."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Přehled."</string> diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index 24306c6374ab..5fb0f8d8a7a0 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Søg"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås op"</string> <string name="unlock_label" msgid="8779712358041029439">"lås op"</string> <string name="phone_label" msgid="2320074140205331708">"åbn telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX to bjælker."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX tre bjælker."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-signal er fuldt."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet er ikke tilsluttet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet er tilsluttet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Intet signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ikke tilsluttet."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nul bjælker."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> er annulleret."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle de seneste applikationer er lukket."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> startes."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Underretningen er annulleret."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Underretningspanel."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtige indstillinger."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskærm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Indstillinger"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversigt."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekræft"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Luk"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruger <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi er slået fra."</string> @@ -310,13 +311,17 @@ <string name="description_direction_left" msgid="7207478719805562165">"Glid til venstre for at <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Du bliver ikke forstyrret af lyde og vibrationer undtagen fra de alarmer, påmindelser, begivenheder og opkaldere, som du angiver."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Tilpas"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Dette blokerer ALLE lyde og vibrationer, herunder fra alarmer, musik, videoer og spil. Du vil stadig være kunne foretage telefonopkald."</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"Dette blokerer ALLE lyde og vibrationer, herunder fra alarmer, musik, videoer og spil. Du vil stadig kunne foretage telefonopkald."</string> <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">"Mindre presserende underretninger nedenfor"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tryk igen for at åbne"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Stryg for at låse op"</string> - <string name="phone_hint" msgid="3101468054914424646">"Stryg til højre for at bruge telefonen"</string> - <string name="camera_hint" msgid="5241441720959174226">"Stryg til venstre for at åbne kameraet"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Total stilhed"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Kun prioritet"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Kun Alarmer"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Deaktiver VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Afbryd VPN-forbindelse"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Din enhed administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds placeringsoplysninger. Kontakt din administrator, hvis du vil have flere oplysninger."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Du gav en app tilladelse til at konfigurere en VPN-forbindelse.\n\nDenne app kan overvåge din enhed og netværksaktivitet, bl.a. e-mails, apps og websites."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Din enhed administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedsadgang, apps, data, der er knyttet til din enhed, og din enheds placeringsoplysninger.\n\nDu har forbindelse til et VPN, som kan overvåge din netværksaktivitet, herunder e-mails, apps og websites.\n\nKontakt din administrator, hvis du vil have flere oplysninger."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Din arbejdsprofil administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nDin administrator kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger.\n\nDu er også forbundet til en VPN-forbindelse, som kan overvåge din netværksaktivitet."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Du har forbindelse til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Du har forbindelse til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåge din personlige netværksaktivitet, bl.a. e-mails, apps og websites."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Din arbejdsprofil administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er forbundet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Din arbejdsprofil administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er forbundet til <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan overvåge din arbejdsrelaterede netværksaktivitet, bl.a. e-mails, apps og websites.\n\nDu er også forbundet til <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan overvåge din personlige netværksaktivitet."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Din enhed administreres af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nDin administrator kan overvåge og administrere indstillinger, virksomhedens adgang, data tilknyttet din enhed og enhedens placeringsoplysninger.\n\nDu er forbundet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåge din netværksaktivitet, bl.a. e-mails, apps og websites.\n\nKontakt din administrator for at få flere oplysninger."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Enheden vil forblive låst, indtil du manuelt låser den op"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Modtag underretninger hurtigere"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Se dem, før du låser op"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Skjul alle"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Afslut nu"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skærmen er fastgjort"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Dette fastholder den i visningen, indtil du frigør den. Tryk på Tilbage og Oversigt på samme tid, og hold dem nede for at frigøre denne skærm."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Dette fastholder den i visningen, indtil du frigør den. Tryk på Oversigt, og hold den nede for at frigøre denne skærm."</string> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 65f30d06ed59..27202d37c1b9 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Suchen"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonnummer"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Entsperren"</string> <string name="unlock_label" msgid="8779712358041029439">"Entsperren"</string> <string name="phone_label" msgid="2320074140205331708">"Telefon öffnen"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX - zwei Balken"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX - drei Balken"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Volle WiMAX-Signalstärke"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet nicht verbunden"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet verbunden"</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Kein Signal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nicht verbunden"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Kein Balken"</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> entfernt"</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle kürzlich verwendeten Apps wurden entfernt."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> wird gestartet."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Benachrichtigung geschlossen"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Benachrichtigungsleiste"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Schnelleinstellungen"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Sperrbildschirm"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Einstellungen"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Übersicht"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bestätigen"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Schließen"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Nutzer: <xliff:g id="USER">%s</xliff:g>"</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">"WLAN ist deaktiviert."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Weniger dringende Benachrichtigungen unten"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Zum Öffnen erneut berühren"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Zum Entsperren nach oben wischen"</string> - <string name="phone_hint" msgid="3101468054914424646">"Zum Öffnen des Telefons nach rechts wischen"</string> - <string name="camera_hint" msgid="5241441720959174226">"Zum Öffnen der Kamera nach links wischen"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Lautlos"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Nur wichtige Unterbrechungen"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Nur Wecker"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN deaktivieren"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN-Verbindung trennen"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Ihr Gerät wird verwaltet von <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nIhr Administrator kann die zu Ihrem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen Ihres Geräts. Weitere Informationen erhalten Sie bei Ihrem Administrator."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Sie haben einer App gestattet, eine VPN-Verbindung einzurichten.\n\nDiese App kann Ihr Gerät und Ihre Netzwerkaktivitäten überwachen, einschließlich E-Mails, Apps und Websites."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Ihr Gerät wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet.\n\nIhr Administrator kann die zu Ihrem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen Ihres Geräts.\n\nSie sind zudem mit einem VPN verbunden, das Ihre persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhalten Sie bei Ihrem Administrator."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Ihr Arbeitsprofil wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet.\n\nIhr Administrator kann Ihre Netzwerkaktivität überwachen, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhalten Sie bei Ihrem Administrator.\n\nSie sind zudem mit einem VPN verbunden, das Ihre persönliche Netzwerkaktivität überwachen kann."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Sie sind mit der App <xliff:g id="APPLICATION">%1$s</xliff:g> verbunden, die Ihre Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Sie sind mit der App <xliff:g id="APPLICATION">%1$s</xliff:g> verbunden, die Ihre persönliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Ihr Arbeitsprofil wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet. Das Profil ist mit der App <xliff:g id="APPLICATION">%2$s</xliff:g> verbunden, die Ihre geschäftlichen Netzwerkaktivitäten überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhalten Sie bei Ihrem Administrator."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Ihr Arbeitsprofil wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet. Das Profil ist mit der App <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> verbunden, die Ihre geschäftliche Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nSie sind außerdem mit der App <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> verbunden, die Ihre persönliche Netzwerkaktivität überwachen kann."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Ihr Gerät wird von <xliff:g id="ORGANIZATION">%1$s</xliff:g> verwaltet.\n\nIhr Administrator kann die zu Ihrem Gerät gehörigen Einstellungen, Unternehmenszugriffsrechte, Apps und Daten überwachen und verwalten, einschließlich der Standortinformationen Ihres Geräts.\n\nSie sind mit der App <xliff:g id="APPLICATION">%2$s</xliff:g> verbunden, die Ihre persönlichen Netzwerkaktivität überwachen kann, einschließlich E-Mails, Apps und Websites.\n\nWeitere Informationen erhalten Sie bei Ihrem Administrator."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Das Gerät bleibt gesperrt, bis Sie es manuell entsperren."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Benachrichtigungen schneller erhalten"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Vor dem Entsperren anzeigen"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Alle ausblenden"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Jetzt beenden"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Bildschirm ist fixiert"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Der Bildschirm wird solange angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Zurück\" und \"Übersicht\" gleichzeitig, um die Fixierung aufzuheben."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Der Bildschirm wird solange angezeigt, bis Sie die Fixierung aufheben. Berühren und halten Sie \"Übersicht\", wenn Sie die Fixierung aufheben möchten."</string> diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 03895ff615f1..d2ef4770a72e 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Επιλέξτε τη νέα διάταξη εργασίας"</string> <string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string> @@ -121,10 +125,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Το Ethernet αποσυνδέθηκε."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Το Ethernet συνδέθηκε."</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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Έναρξη <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Επιβεβαίωση"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Κλείσιμο"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Χρήστης <xliff:g id="USER">%s</xliff:g>."</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">"Το Wi-fi απενεργοποιήθηκε."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Λιγότερο επείγουσες ειδοποιήσεις παρακάτω"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Αγγίξτε ξανά για άνοιγμα"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Σύρετε για να ξεκλειδώσετε"</string> - <string name="phone_hint" msgid="3101468054914424646">"Σύρετε προς τα δεξιά για το τηλέφωνο"</string> - <string name="camera_hint" msgid="5241441720959174226">"Σύρετε αριστερά για τη φωτογραφική μηχανή"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Απενεργοποίηση VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Αποσύνδεση VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Η διαχείριση αυτής της συσκευής γίνεται από <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής σας έχει τη δυνατότητα να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με αυτήν τη συσκευή, συμπεριλαμβανομένων των πληροφοριών τοποθεσίας της συσκευής σας. Για περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή σας."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Παραχωρήσατε σε μια εφαρμογή άδεια για τη ρύθμιση σύνδεσης VPN.\n\nΑυτή η εφαρμογή μπορεί να παρακολουθεί τη δραστηριότητα της συσκευής και του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Η διαχείριση αυτής της συσκευής γίνεται από <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής σας έχει τη δυνατότητα να παρακολουθεί και να διαχειρίζεται τις ρυθμίσεις, την εταιρική πρόσβαση, τις εφαρμογές και τα δεδομένα που σχετίζονται με αυτήν τη συσκευή, συμπεριλαμβανομένων των πληροφοριών τοποθεσίας της συσκευής σας.\n\nΕίστε επίσης συνδεδεμένοι σε ένα VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή σας."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής έχει τη δυνατότητα παρακολούθησης της δραστηριότητας του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή.\n\nΕπίσης, είστε συνδεδεμένοι σε VPN, το οποίο μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου σας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Έχετε συνδεθεί στην εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Είναι συνδεδεμένο στην εφαρμογή <xliff:g id="APPLICATION">%2$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΓια περισσότερες πληροφορίες, επικοινωνήστε με το διαχειριστή."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Η διαχείριση του προφίλ εργασίας γίνεται από τον οργανισμό <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Είναι συνδεδεμένο στην εφαρμογή <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του δικτύου εργασίας, συμπεριλαμβανομένων μηνυμάτων ηλεκτρονικού ταχυδρομείου, εφαρμογών και ιστότοπων.\n\nΕπίσης, είστε συνδεδεμένοι στην εφαρμογή <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, η οποία μπορεί να παρακολουθεί τη δραστηριότητα του προσωπικού σας δικτύου."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Η διαχείριση της συσκευής γίνεται από <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nΟ διαχειριστής μπορεί να παρακολουθεί και να διαχειρίζεται ρυθμίσεις, εταιρική πρόσβαση, εφαρμογές, δεδομένα σχετικά με τη συσκευή και πληρ. τοποθεσίας της συσκευής.\n\nΕίστε συνδεδ. σε <xliff:g id="APPLICATION">%2$s</xliff:g> που μπορεί να παρακολουθεί τη δραστηρ. του δικτύου εργασίας, όπως μηνύματα ηλεκτρ. ταχυδρομείου, εφαρμογές και ιστότοπους.\n\nΓια περισ. πληροφορίες, επικοινωνήστε με το διαχειριστή."</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Aπόκρυψη όλων"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Τερματισμός τώρα"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Η οθόνη καρφιτσώθηκε"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Με αυτόν τον τρόπο παραμένει σε προβολή έως ότου την ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα \"Επιστροφή\" και \"Επισκόπηση\" ταυτόχρονα για ξεκαρφίτσωμα."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Με αυτόν τον τρόπο παραμένει σε προβολή έως ότου την ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα \"Επισκόπηση\" για ξεκαρφίτσωμα."</string> diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index 1ba8d6043443..89f725cf8c61 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Search"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> <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> @@ -121,10 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX two bars."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX three bars."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX signal full."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet disconnected."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet connected."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"No signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Not connected."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero bars."</string> @@ -166,15 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Close"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi turned off."</string> @@ -315,8 +314,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> - <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> + <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> + <string name="voice_hint" msgid="8939888732119726665">"Swipe from icon for voice assist"</string> + <string name="camera_hint" msgid="7939688436797157483">"Swipe from icon for camera"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Total silence"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> @@ -380,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Hide all"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"End now"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"This keeps it in view until you unpin. Touch and hold Back and Overview at the same time to unpin."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"This keeps it in view until you unpin. Touch and hold Overview to unpin."</string> diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index 1ba8d6043443..89f725cf8c61 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Search"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> <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> @@ -121,10 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX two bars."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX three bars."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX signal full."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet disconnected."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet connected."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"No signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Not connected."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero bars."</string> @@ -166,15 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Close"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi turned off."</string> @@ -315,8 +314,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> - <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> + <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> + <string name="voice_hint" msgid="8939888732119726665">"Swipe from icon for voice assist"</string> + <string name="camera_hint" msgid="7939688436797157483">"Swipe from icon for camera"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Total silence"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> @@ -380,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Hide all"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"End now"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"This keeps it in view until you unpin. Touch and hold Back and Overview at the same time to unpin."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"This keeps it in view until you unpin. Touch and hold Overview to unpin."</string> diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index 1ba8d6043443..89f725cf8c61 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Search"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Phone"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Assist"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Unlock"</string> <string name="unlock_label" msgid="8779712358041029439">"unlock"</string> <string name="phone_label" msgid="2320074140205331708">"open phone"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"open voice assist"</string> <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> @@ -121,10 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX two bars."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX three bars."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX signal full."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet disconnected."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet connected."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"No signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Not connected."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero bars."</string> @@ -166,15 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> dismissed."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"All recent applications dismissed."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starting <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification dismissed."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Quick settings."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Settings"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirm"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Close"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi turned off."</string> @@ -315,8 +314,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Less urgent notifications below"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touch again to open"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Swipe up to unlock"</string> - <string name="phone_hint" msgid="3101468054914424646">"Swipe right for phone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Swipe left for camera"</string> + <string name="phone_hint" msgid="4872890986869209950">"Swipe from icon for phone"</string> + <string name="voice_hint" msgid="8939888732119726665">"Swipe from icon for voice assist"</string> + <string name="camera_hint" msgid="7939688436797157483">"Swipe from icon for camera"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Total silence"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priority only"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarms only"</string> @@ -380,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Hide all"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"End now"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Expand"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Collapse"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"This keeps it in view until you unpin. Touch and hold Back and Overview at the same time to unpin."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"This keeps it in view until you unpin. Touch and hold Overview to unpin."</string> diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index cdbdac46b1f1..8e9efc8a4f66 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dos barras de WiMAX"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tres barras de WiMAX"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Señal de WiMAX al máximo"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet desconectada"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet conectada"</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sin señal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"No conectado"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Cero barras"</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartada."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se descartaron todas las aplicaciones recientes."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación ignorada"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla bloqueada"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Recientes"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Cerrar"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi desactivado"</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgentes abajo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Vuelve a tocar para abrir."</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Deslizar el dedo hacia arriba para desbloquear"</string> - <string name="phone_hint" msgid="3101468054914424646">"Desliza hacia la derecha para abrir el teléfono."</string> - <string name="camera_hint" msgid="5241441720959174226">"Desliza hacia la izquierda para acceder a la cámara."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silencio total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Solo prioridad"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo alarmas"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Inhabilitar VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados a este dispositivo y la información de ubicación del dispositivo. Para obtener más información, comunícate con el administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Permitiste que una aplicación configurara una conexión VPN.\n\nEsta aplicación puede supervisar la actividad de la red y del dispositivo, incluidos los correos electrónicos, las aplicaciones y los sitios web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de ubicación.\n\nTambién tienes una conexión VPN, que puede supervisar la actividad de la red (correo electrónico, aplicaciones y sitios web).\n\nPara obtener más información, comunícate con el administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu perfil de trabajo.\n\nEl administrador puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador.\n\nTambién tienes conexión a una VPN, que puede supervisar la actividad de tu red."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Tienes conexión a la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Tienes conexión a la aplicación <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar la actividad de la red personal, incluidos los correos electrónicos, las aplicaciones y los sitios web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu perfil de trabajo. Tiene conexión a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu perfil de trabajo. Tiene conexión a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que puede supervisar la actividad de tu red de trabajo, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nTambién tienes conexión a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que puede supervisar la actividad de la red personal."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> administra tu dispositivo.\n\nEl administrador puede supervisar y administrar la configuración, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo y la información de la ubicación.\n\nTienes conexión a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar la actividad de la red, incluidos los correos electrónicos, las aplicaciones y los sitios web.\n\nPara obtener más información, comunícate con el administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"El dispositivo permanecerá bloqueado hasta que lo desbloquees manualmente."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Recibe notificaciones más rápido"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Ver antes de desbloquear"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar todas"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalizar ahora"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fija"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Esta función mantiene fija la vista de la pantalla hasta que la desactivas. Mantén presionados los botones Atrás y Recientes al mismo tiempo para anular la fijación."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Esta función mantiene fija la vista de la pantalla hasta que la desactivas. Mantén presionado el botón Recientes para anular la fijación."</string> diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index c4a1707f8571..b7fb5653c175 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dos barras de WiMAX"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tres barras de WiMAX"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Señal de WiMAX al máximo"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Conexión Ethernet desconectada."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Conexión Ethernet conectada."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"No hay señal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Sin conexión"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Ninguna barra"</string> @@ -148,7 +150,7 @@ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Tipo Edge"</string> <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string> <string name="accessibility_no_sim" msgid="8274017118472455155">"Sin tarjeta SIM"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Anclaje por Bluetooth"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Compartir por Bluetooth"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"Modo avión"</string> <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"Cambiando red de operador."</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> por ciento de batería"</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Se ha eliminado <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Se han ignorado todas las aplicaciones recientes."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación ignorada"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pantalla de notificaciones"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ajustes rápidos"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ajustes"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión general."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Cerrar"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi desactivado."</string> @@ -280,7 +281,7 @@ <string name="quick_settings_done" msgid="3402999958839153376">"Listo"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Conectado"</string> <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_tethering_label" msgid="7153452060448575549">"Compartir Internet"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona Wi-Fi"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificaciones menos urgente abajo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Vuelve a tocar para abrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Desliza el dedo hacia arriba para desbloquear"</string> - <string name="phone_hint" msgid="3101468054914424646">"Desliza el dedo hacia la derecha para acceder al teléfono"</string> - <string name="camera_hint" msgid="5241441720959174226">"Desliza el dedo hacia la izquierda para acceder a la cámara"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silencio total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Solo prioritarias"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo alarmas"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Inhabilitar VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Administrador de tu dispositivo: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nEl administrador puede controlar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación. Para obtener más información, ponte en contacto con el administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Has concedido permiso a una aplicación para configurar una conexión VPN.\n\nEsta aplicación puede supervisar tu dispositivo y tu actividad de red, como correos electrónicos, aplicaciones y sitios web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Administrador del dispositivo: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nEl administrador puede controlar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a una red VPN que puede controlar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con el administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"El administrador de tu perfil de trabajo es <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nTu administrador puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador.\n\nTambién estás conectado a una red VPN que puede supervisar tu actividad de red."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que puede supervisar tu actividad de red personal, como correos electrónicos, aplicaciones y sitios web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"El administrador de tu perfil de trabajo es <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este administrador está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar tu actividad de red del trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"El administrador de tu perfil de trabajo es <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este administrador está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que puede supervisar tu actividad de red del trabajo, como correos electrónicos, aplicaciones y sitios web.\n\nTambién estás conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que puede supervisar tu actividad de red personal."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"El administrador de tu dispositivo es <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nTu administrador puede supervisar y administrar los ajustes, el acceso corporativo, las aplicaciones, los datos asociados al dispositivo e información de su ubicación.\n\nEstás conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que puede supervisar tu actividad de red, como correos electrónicos, aplicaciones y sitios web.\n\nPara obtener más información, ponte en contacto con tu administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"El dispositivo permanecerá bloqueado hasta que se desbloquee manualmente"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Recibe notificaciones más rápido"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Ver antes de desbloquear"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar todas"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalizar ahora"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fijada"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"La pantalla se mantendrá visible hasta que dejes de fijarla. Para ello, mantén pulsados los botones de retroceso e información general."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"La pantalla se mantendrá visible hasta que dejes de fijarla. Para ello, mantén pulsado el botón de información general."</string> diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml index 14c6bac11ffa..bd15bec70880 100644 --- a/packages/SystemUI/res/values-et-rEE/strings.xml +++ b/packages/SystemUI/res/values-et-rEE/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Otsing"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kaamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Luku avamine"</string> <string name="unlock_label" msgid="8779712358041029439">"ava lukk"</string> <string name="phone_label" msgid="2320074140205331708">"ava telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-i on kaks riba."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-i on kolm riba."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-i signaal on tugev."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Etherneti-ühendus on katkestatud."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Etherneti-ühendus on loodud."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Signaal puudub."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ühendus puudub."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Null pulka."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Loobusite rakendusest <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kõikidest hiljutistest rakendustest on loobutud"</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Rakenduse <xliff:g id="APP">%s</xliff:g> käivitamine."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g>, <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Märguandest on loobutud."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Märguande vari."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Kiirseaded."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kuva lukustamine."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Seaded"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ülevaade."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Kinnitamine"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Sulgemine"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kasutaja <xliff:g id="USER">%s</xliff:g>."</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">"WiFi on välja lülitatud."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähem kiireloomulised märguanded on allpool"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Avamiseks puudutage uuesti"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Lukustuse tühistamiseks pühkige üles"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefoni kasutamiseks pühkige paremale"</string> - <string name="camera_hint" msgid="5241441720959174226">"Kaamera kasutamiseks pühkige vasakule"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Täielik vaikus"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Ainult prioriteetsed"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Ainult alarmid"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Keela VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Katkesta VPN-i ühendus"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Teie seadet haldab <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet. Lisateabe saamiseks võtke ühendust administraatoriga."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Andsite rakendusele loa VPN-i ühenduse seadistamiseks.\n\nSee rakendus võib jälgida teie seadet ja võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Teie seadet haldab <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nTeil on ühendus VPN-iga, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Teie tööprofiili haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministraator saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga.\n\nTeil on ühendus ka VPN-iga, mis saab jälgida teie võrgutegevusi."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Olete ühendatud rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>, mis võib jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Olete ühendatud rakendusega <xliff:g id="APPLICATION">%1$s</xliff:g>, mis võib jälgida teie isiklikke võrgutegevusi, sh meile, rakendusi ja veebisaite."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Teie tööprofiili haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>. See on ühendatud rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Teie tööprofiili haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>. See on ühendatud rakendusega <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, mis võib jälgida teie töökoha võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nOlete ühendatud ka rakendusega <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, mis võib jälgida teie isiklikke võrgutegevusi."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Teie seadet haldab organisatsioon <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministraator saab jälgida ja hallata seadeid, ettevõttesisest juurdepääsu, rakendusi, seadmega seotud andmeid ja seadme asukohateavet.\n\nOlete ühendatud rakendusega <xliff:g id="APPLICATION">%2$s</xliff:g>, mis saab jälgida teie võrgutegevusi, sh meile, rakendusi ja veebisaite.\n\nLisateabe saamiseks võtke ühendust administraatoriga."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Seade jääb lukku, kuni selle käsitsi avate"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Saate märguandeid kiiremini"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Näete neid enne avamist"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Peida kõik"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Lõpeta nüüd"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekraan on kinnitatud"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"See hoiab selle kuval, kuni selle vabastate. Vabastamiseks puudutage ning hoidke korraga all nuppe Tagasi ja Ülevaade."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"See hoiab selle kuval, kuni selle vabastate. Vabastamiseks puudutage ja hoidke all nuppu Ülevaade."</string> diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml index d6169120451f..10e0fe409aee 100644 --- a/packages/SystemUI/res/values-eu-rES/strings.xml +++ b/packages/SystemUI/res/values-eu-rES/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Bilatu"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonoa"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desblokeatu"</string> <string name="unlock_label" msgid="8779712358041029439">"desblokeatu"</string> <string name="phone_label" msgid="2320074140205331708">"ireki telefonoan"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX sarearen bi barra."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX sarearen hiru barra."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX sarearen seinalea osoa."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet bidezko konexioa eten da."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet bidez konektatu da."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ez dago seinalerik."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Konektatu gabe."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Barrarik ez."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> baztertu da."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Azken aplikazio guztiak baztertu da."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> hasten."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Jakinarazpena baztertu da."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Jakinarazpenen panela."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ezarpen bizkorrak."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantaila blokeatzeko aukera."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ezarpenak"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikuspegi orokorra."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Berretsi"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Itxi"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"<xliff:g id="USER">%s</xliff:g> erabiltzailea."</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">"Wi-Fi konexioa desaktibatu egin da."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Horren premiazkoak ez diren jakinarazpenak daude behean"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Irekitzeko, ukitu berriro"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Desblokeatzeko, pasatu hatza gorantz"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefonoa irekitzeko, pasatu hatza eskuinera."</string> - <string name="camera_hint" msgid="5241441720959174226">"Kamera irekitzeko, pasatu hatza ezkerrera."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Isiltasun osoa"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Lehentasunezkoak"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmak soilik"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Desgaitu VPN konexioa"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Deskonektatu VPN sarea"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Gailuaren kudeatzailea:<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratzaileak gailua eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webgune seguruak barne. Informazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Aplikazio bati VPN konexio bat konfiguratzeko baimena eman diozu.\n\nAplikazio horrek gailuko eta sareko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webgunek barne."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Gailuaren kudeatzailea:<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\nSareko jarduerak (mezu elektronikoak, aplikazioak eta webguneak barne) kontrola ditzakeen VPN batera konektatuta zaude.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da laneko profilaren kudeatzailea.\n\nAdministratzaileak sareko jarduerak (mezu elektronikoak, aplikazioak eta webguneak barne) kontrola ditzake.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan.\n\nHorrez gain, sareko jarduerak kontrola ditzakeen VPN batera konektatuta zaude."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN konexioa"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"<xliff:g id="APPLICATION">%1$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduera pertsonalak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da laneko profilaren kudeatzailea, eta profila <xliff:g id="APPLICATION">%2$s</xliff:g> aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da laneko profilaren kudeatzailea, eta profila <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> aplikaziora konektatuta dago. Aplikazio horrek sarean egiten dituzun laneko jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nHorrez gain, sarean egiten dituzun jarduera pertsonalak kontrola ditzakeen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> aplikaziora konektatuta zaude."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> da gailuaren kudeatzailea.\n\nAdministratzaileak ezarpenak, enpresako sarbidea, aplikazioak, gailuarekin lotutako datuak eta gailuaren kokapenari buruzko informazioa kontrola eta kudea ditzake.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g> aplikaziora konektatuta zaude. Aplikazio horrek sarean egiten dituzun jarduerak kontrola ditzake, mezu elektronikoak, aplikazioak eta webguneak barne.\n\nInformazio gehiago lortzeko, jarri administratzailearekin harremanetan."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Gailua blokeatuta egongo da eskuz desblokeatu arte"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Eskuratu jakinarazpenak azkarrago"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Ikusi desblokeatu baino lehen"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ezkutatu guztiak"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Amaitu"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Pantaila ainguratuta dago"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Horrela, ikusgai mantenduko da aingura kendu arte. Aingura kentzeko, eduki ukituta aldi berean \"Atzera\" eta \"Ikuspegi orokorra\" botoiak."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Horrela, ikusgai mantenduko da, aingura kendu arte. Aingura kentzeko, eduki ukituta \"Ikuspegi orokorra\" botoia."</string> diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index af597391c786..544552b405b5 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرحبندی جدید کار"</string> <string name="cancel" msgid="6442560571259935130">"لغو"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> در حال شروع به کار است."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"تأیید"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"بستن"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"کاربر <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi خاموش شد."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"اعلانهای کمتر فوری در زیر"</string> <string name="notification_tap_again" msgid="8524949573675922138">"برای باز کردن دوباره لمس کنید"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"برای باز کردن قفل سریع به بالا بکشید"</string> - <string name="phone_hint" msgid="3101468054914424646">"برای تلفن انگشت را تند به سمت چپ بکشید"</string> - <string name="camera_hint" msgid="5241441720959174226">"برای دوربین انگشت را تند به سمت راست بکشید"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"غیرفعال کردن VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"قطع اتصال VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"مدیریت دستگاه شما توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nسرپرستتان میتواند تنظیمات، دسترسی شرکت، برنامهها دادههای مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند. برای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"شما به برنامهای برای تنظیم اتصال VPN اجازه دادید.\n\n این برنامه میتواند دستگاه و فعالیت شبکهتان را کنترل کند، از جمله ایمیل، برنامه و وبسایتها."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"دستگاهتان توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود.\n\nسرپرستتان میتواند تنظیمات، دسترسی شرکت، برنامهها، دادههای مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به یک VPN وصل هستید که میتواند فعالیت شبکه شما را کنترل کند، از جمله ایمیلها، برنامهها و وبسایتها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"نمایه کاری شما توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود.\n\nسرپرستتان میتواند فعالیت شبکهتان از جمله ایمیل، برنامه و وبسایتها را کنترل کند.\n\nبرای دریافت اطلاعات بیشتر با سرپرستتان تماس بگیرید.\n\nهمچنین به یک VPN وصل هستید که میتواند فعالیت شبکه شما را کنترل کند."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"شما به <xliff:g id="APPLICATION">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شما از جمله ایمیل، برنامه و وبسایتها را کنترل کند."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"شما به <xliff:g id="APPLICATION">%1$s</xliff:g> وصل شدهاید، که میتواند فعالیت شبکه شخصی شما از جمله ایمیل، برنامه و وبسایتها را کنترل کند."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"نمایه کاریتان توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود. این به <xliff:g id="APPLICATION">%2$s</xliff:g> وصل است که فعالیت شبکه کاریتان از جمله ایمیل، برنامه و وبسایتها را کنترل میکند.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"نمایه کاری شما توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود. این به <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> متصل است که میتواند فعالیت شبکه کاریتان از جمله ایمیل، برنامه و وبسایتها را کنترل کند.\n\nشما همچنین به <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> متصل هستید که میتواند فعالیت شبکه شخصیتان را کنترل کند."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"دستگاهتان توسط <xliff:g id="ORGANIZATION">%1$s</xliff:g> مدیریت میشود.\n\nسرپرستتان میتواند تنظیمات، دسترسی شرکت، برنامهها، دادههای مرتبط با دستگاهتان و اطلاعات مکان دستگاهتان را کنترل و مدیریت کند.\n\nشما به <xliff:g id="APPLICATION">%2$s</xliff:g> وصل هستید که میتواند فعالیت شبکه شما را کنترل کند، از جمله ایمیل، برنامه و وبسایتها.\n\nبرای دریافت اطلاعات بیشتر، با سرپرستتان تماس بگیرید."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"پنهان کردن همه"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"اکنون به پایان برسد"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"صفحه نمایش پین شد"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، برگشت و نمای کلی را به صورت همزمان لمس کنید و نگهدارید."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، نمای کلی را لمس کنید و نگهدارید."</string> diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 0b9e198559c8..fc5f8dd623c4 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Haku"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Puhelin"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Avaa lukitus"</string> <string name="unlock_label" msgid="8779712358041029439">"avaa lukitus"</string> <string name="phone_label" msgid="2320074140205331708">"avaa puhelin"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: kaksi palkkia."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: kolme palkkia."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Vahva WiMAX-signaali."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet on irrotettu."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet on yhdistetty."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ei signaalia."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ei yhteyttä."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nolla palkkia."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> hylättiin."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Kaikki viimeisimmät sovellukset on hylätty."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Käynnistetään <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Ilmoitus hylätty."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Ilmoitusalue."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Pika-asetukset."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lukitse näyttö."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Asetukset"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Viimeisimmät."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Vahvista"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Sulje"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Käyttäjä: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi poistettiin käytöstä."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Vähemmän kiireelliset ilmoitukset ovat alla"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Avaa koskettamalla uudelleen"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Avaa lukitus pyyhkäisemällä ylös"</string> - <string name="phone_hint" msgid="3101468054914424646">"Avaa puhelin pyyhkäisemällä oikealle"</string> - <string name="camera_hint" msgid="5241441720959174226">"Avaa kamera pyyhkäisemällä oikealle"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Täydellinen hiljaisuus"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Vain tärkeät"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Vain herätykset"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Poista VPN käytöstä"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Katkaise VPN-yhteys"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Tätä laitetta hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJärjestelmänvalvoja voi tarkkailla ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja. Saat lisätietoja järjestelmänvalvojalta."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Olet myöntänyt sovellukselle oikeuden VPN-yhteyden muodostamiseen.\n\nSovellus voi valvoa laitettasi ja toimintaasi verkossa, esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Tätä laitetta hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJärjestelmänvalvoja voi tarkkailla ja hallinnoida asetuksiasi, yrityskäyttöä, sovelluksia, laitteeseesi yhdistettyjä tietoja sekä laitteesi sijaintitietoja.\n\nKäytät VPN-yhteyttä, joka voi valvoa toimiasi verkossa, esimerkiksi sähköpostin, sovellusten ja verkkosivustojen käyttöä.\n\nSaat lisätietoja järjestelmänvalvojalta."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Työprofiiliasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJärjestelmänvalvojasi voi valvoa toimintaasi verkossa. Hän voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi.\n\nLisäksi olet muodostanut yhteyden VPN-palveluun, joka voi valvoa toimintaasi verkossa."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Olet muodostanut yhteyden sovellukseen <xliff:g id="APPLICATION">%1$s</xliff:g>, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Olet muodostanut yhteyden sovellukseen <xliff:g id="APPLICATION">%1$s</xliff:g>, joka voi valvoa henkilökohtaista toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Työprofiiliasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Se on yhteydessä sovellukseen <xliff:g id="APPLICATION">%2$s</xliff:g>, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Työprofiiliasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Se on yhteydessä sovellukseen <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, joka voi valvoa työhön liittyvää toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisäksi olet yhteydessä sovellukseen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, joka voi valvoa henkilökohtaista toimintaasi verkossa."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Laitettasi hallinnoi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJärjestelmänvalvojasi voi valvoa ja hallinnoida laitteesi asetuksia, yrityskäyttöä, sovelluksia, laitteeseesi liittyviä tietoja ja laitteen sijaintitietoja.\n\nOlet yhteydessä sovellukseen <xliff:g id="APPLICATION">%2$s</xliff:g>, joka voi valvoa toimintaasi verkossa. Sovellus voi seurata esimerkiksi avaamiasi sähköposteja, sovelluksia ja verkkosivustoja.\n\nLisätietoja saat järjestelmänvalvojaltasi."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Laite pysyy lukittuna, kunnes se avataan käsin"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Näe ilmoitukset nopeammin"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Näytä ennen lukituksen avaamista"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Piilota kaikki"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Lopeta nyt"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Näyttö on kiinnitetty"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Tämä pitää sen näkyvissä, kunnes poistat kiinnityksen. Kosketa Edellinen- ja Viimeisimmät-kohtaa samanaikaisesti pitkään kiinnityksen poistamiseksi."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Tämä pitää sen näkyvissä, kunnes poistat kiinnityksen. Kosketa Viimeisimmät-kohtaa pitkään kiinnityksen poistamiseksi."</string> diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index dbd7592239f9..6b40037f6ea3 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphone"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Déverrouiller"</string> <string name="unlock_label" msgid="8779712358041029439">"déverrouiller"</string> <string name="phone_label" msgid="2320074140205331708">"Ouvrir le téléphone"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Signal WiMAX : moyen"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Signal WiMAX : bon"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Signal WiMAX : excellent"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet déconnecté."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet connecté."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Aucun signal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Non connecté"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Aucun signal"</string> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Lancement de <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification masquée"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmer"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Fermer"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur : <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi désactivé"</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes affichées ci-dessous"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Touchez à nouveau pour ouvrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Glissez vers le haut pour déverrouiller"</string> - <string name="phone_hint" msgid="3101468054914424646">"Balayez l\'écran vers la droite pour accéder au téléphone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Balayez l\'écran vers la gauche pour accéder à l\'appareil photo"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Aucune interruption"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priorités seulement"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes uniquement"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Désactiver le RPV"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Déconnecter le RPV"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Votre appareil est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les données de localisation de celui-ci. Pour en savoir plus, communiquez avec votre administrateur."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Vous avez autorisé une application à configurer une connexion RPV.\n\nCette application peut contrôler l\'activité de votre appareil et votre activité sur le réseau, y compris les courriels, les applications et les sites Web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Votre appareil est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les données de localisation de celui-ci.\n\nVous êtes connecté à un RPV qui peut contrôler votre activité sur le réseau (courriels, applications et sites Web).\n\nPour en savoir plus, communiquez avec votre administrateur."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur.\n\nVous êtes également connecté à un RPV qui peut contrôler votre activité sur le réseau."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"RPV"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les courriels, les applications et les sites Web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les courriels, les applications et les sites Web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les courriel, les applications et les sites Web.\n\nPour en savoir plus, communiquer avec votre administrateur."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web.\n\nVous êtes également connecté à <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Votre appareil est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et ses données de localisation.\n\nVous êtes connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>, qui peut contrôler votre activité réseau, y compris les courriels, les applications et les sites Web.\n\nPour en savoir plus, communiquez avec votre administrateur."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Voir les notifications plus rapidement"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Afficher les notifications avant de déverrouiller l\'appareil"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Tout masquer"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Arrêter maintenant"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"L\'écran est épinglé"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez un doigt simultanément sur « Retour » et « Aperçu »."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Cet écran est épinglé jusqu\'à ce que vous annuliez l\'opération. Pour annuler l\'épinglage, maintenez le doigt sur « Aperçu »."</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index e157332435cc..eedaaad734a1 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Téléphoner"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Déverrouiller"</string> <string name="unlock_label" msgid="8779712358041029439">"déverrouiller"</string> <string name="phone_label" msgid="2320074140205331708">"ouvrir le téléphone"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Signal WiMAX : moyen"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Signal WiMAX : bon"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Signal WiMAX : excellent"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet déconnecté"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet connecté"</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Aucun signal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Non connecté"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Aucun signal"</string> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Lancement de <xliff:g id="APP">%s</xliff:g>"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> : <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notification masquée"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Volet des notifications"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Paramètres rapides"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Écran de verrouillage"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Paramètres"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Aperçu"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmer"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Fermer"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilisateur <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi désactivé."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifications moins urgentes ci-dessous"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Appuyer à nouveau pour ouvrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Faire glisser pour déverrouiller"</string> - <string name="phone_hint" msgid="3101468054914424646">"Balayer l\'écran vers la droite pour accéder au téléphone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Balayer l\'écran vers la gauche pour accéder à l\'appareil photo"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Aucune interruption"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priorit. uniquement"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alarmes uniquement"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Désactiver le VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Déconnecter le VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Votre appareil est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci. Pour en savoir plus, contactez votre administrateur."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Vous avez autorisé une application à configurer une connexion VPN.\n\nCette application peut contrôler l\'activité de votre appareil et votre activité sur le réseau (e-mails, applications et sites Web)."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Votre appareil géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à un VPN qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur.\n\nVous êtes également connecté à un VPN qui peut contrôler votre activité sur le réseau."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Vous êtes connecté à <xliff:g id="APPLICATION">%1$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau, y compris les e-mails, les applications et les sites Web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web.\n\nPour en savoir plus, contactez votre administrateur."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Votre profil professionnel est géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Il est connecté à <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>. Cette application peut contrôler votre activité sur le réseau, y compris les e-mails, les applications et les sites Web.\n\nVous êtes également connecté à <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>. Cette application peut contrôler votre activité personnelle sur le réseau."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Votre appareil géré par <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVotre administrateur peut contrôler et gérer les paramètres, l\'accès aux contenus de l\'entreprise, les applications, les données associées à cet appareil et les informations de localisation de celui-ci.\n\nVous êtes connecté à <xliff:g id="APPLICATION">%2$s</xliff:g> qui peut contrôler votre activité sur le réseau (e-mails, applications et sites Web).\n\nPour en savoir plus, contactez votre administrateur."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"L\'appareil restera verrouillé jusqu\'à ce que vous le déverrouilliez manuellement."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Recevoir les notifications plus vite"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Afficher les notifications avant de déverrouiller l\'appareil"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Tout masquer"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Arrêter maintenant"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Écran épinglé"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Cet écran est épinglé jusqu\'à annulation de l\'opération. Pour annuler l\'épinglage, appuyez simultanément sur \"Retour\" et \"Aperçu\" de manière prolongée."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Cet écran est épinglé jusqu\'à annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur \"Aperçu\"."</string> diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml index 88ddd12118ab..fb3c6d8830a6 100644 --- a/packages/SystemUI/res/values-gl-rES/strings.xml +++ b/packages/SystemUI/res/values-gl-rES/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Buscar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Cámara"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Teléfono"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir teléfono"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dúas barras de WiMAX"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tres barras de WiMAX"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Sinal completo de WiMAX"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Desconectouse a Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Conectouse a Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sen sinal"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Non conectada"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Ningunha barra"</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Rexeitouse <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Rexeitáronse todas as aplicacións recentes."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificación rexeitada"</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Sombra de notificación"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configuración rápida"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Pantalla de bloqueo."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configuración"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visión xeral."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Pechar"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuario <xliff:g id="USER">%s</xliff:g>."</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">"Wifi desactivada."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificacións menos urxentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Toca outra vez para abrir o elemento"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Pasa o dedo cara arriba para desbloquear"</string> - <string name="phone_hint" msgid="3101468054914424646">"Pasa o dedo cara á dereita para acceder ao teléfono"</string> - <string name="camera_hint" msgid="5241441720959174226">"Pasa o dedo cara á esquerda para abrir a cámara"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silencio total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Só prioridade"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Só alarmas"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Desactivar VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"O teu dispositivo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información de localización do teu dispositivo. Para obter máis información, ponte en contacto co teu administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Outorgaches permiso a unha aplicación para configurar unha conexión VPN.\n\nEsta aplicación pode supervisar a actividade da rede e do dispositivo, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"O teu dispositivo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co teu dispositivo e a información de localización do teu dispositivo.\n\nEstás conectado a unha VPN, que pode supervisar a túa actividade de rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"O teu perfil de traballo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO teu administrador é capaz de supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador.\n\nTamén estás conectado a unha VPN, que pode supervisar a túa actividade na rede."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Estás conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode supervisar a túa actividade persoal na rede, incluídos os correos electrónicos, as aplicacións e os sitios web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"O teu perfil de traballo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, ponte en contacto co teu administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"O teu perfil de traballo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode supervisar a túa actividade na rede, incluídos os correos electrónicos, as aplicacións e os sitios web.\n\nTamén estás conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode supervisar a túa actividade persoal na rede."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"O dispositivo está xestionado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO teu administrador pode supervisar e xestionar a configuración, o acceso corporativo, as aplicacións, os datos asociados co dispositivo e a información de localización do dispositivo.\n\nEstás conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode supervisar a túa actividade na rede: os correos electrónicos, as aplicacións e os sitios web.\n\nPara obter máis información, contacta co teu administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado ata que o desbloquees manualmente"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Recibir notificacións máis rápido"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Consúltaas antes de desbloquear"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar todo"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalizar agora"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"A pantalla está fixada"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"A pantalla manterase visible ata que anules a fixación. Para facelo, mantén premido Atrás e Visión xeral ao mesmo tempo."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"A pantalla manterase visible ata que anules a fixación. Para facelo, mantén premido Visión xeral."</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 3125c47fdbd4..e17cb0a38155 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string> <string name="cancel" msgid="6442560571259935130">"अभी नहीं"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> प्रारंभ हो रहा है."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"पुष्टि करें"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"बंद करें"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"उपयोगकर्ता <xliff:g id="USER">%s</xliff:g>."</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"कम अत्यावश्यक सूचनाएं नीचे दी गई हैं"</string> <string name="notification_tap_again" msgid="8524949573675922138">"खोलने के लिए पुन: स्पर्श करें"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करने के लिए ऊपर स्वाइप करें"</string> - <string name="phone_hint" msgid="3101468054914424646">"फ़ोन के लिए दाएं स्वाइप करें"</string> - <string name="camera_hint" msgid="5241441720959174226">"कैमरे के लिए बाएं स्वाइप करें"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करें"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN डिस्कनेक्ट करें"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"आपका डिवाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है. अधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"आपने किसी ऐप को VPN कनेक्शन सेट करने की अनुमति दी है.\n\nयह ऐप ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपके डिवाइस और नेटवर्क की गतिविधि की निगरानी कर सकता है."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"आपका डिवाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप एक VPN से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"आपकी कार्य प्रोफ़ाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है.\n\nआपका नियंत्रक ईमेल, ऐप्स और सुरक्षित वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी करने में सक्षम है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें.\n\nआप एक ऐसे VPN से भी कनेक्ट हैं, जो आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"आप <xliff:g id="APPLICATION">%1$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"आपकी कार्य प्रोफ़ाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है. वह <xliff:g id="APPLICATION">%2$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"आपकी कार्य प्रोफ़ाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है. वह <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> से कनेक्ट है, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी कार्य नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nआप <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> से भी कनेक्ट हैं, जो आपकी व्यक्तिगत नेटवर्क गतिविधि की निगरानी कर सकता है."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"आपका डिवाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> के द्वारा प्रबंधित है.\n\nआपका नियंत्रक सेटिंग, कॉर्पोरेट ऐक्सेस, ऐप्स, आपके डिवाइस से संबद्ध डेटा और आपके डिवाइस की स्थान जानकारी की निगरानी और उसका प्रबंधन कर सकता है.\n\nआप <xliff:g id="APPLICATION">%2$s</xliff:g> से कनेक्ट हैं, जो ईमेल, ऐप्स और वेबसाइटों सहित आपकी नेटवर्क गतिविधि की निगरानी कर सकता है.\n\nअधिक जानकारी के लिए, अपने नियंत्रक से संपर्क करें."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"सभी छिपाएं"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"अब समाप्त करें"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन कर दी गई है"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"इससे वह तब तक दृश्य में रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए वापस जाएं और अवलोकन करें को एक ही समय पर स्पर्श करके रखें."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"इससे वह तब तक दृश्य में बना रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए अवलोकन करें को स्पर्श करके रखें."</string> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 2641883cc4e7..59d40c347cef 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -84,9 +84,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Pretraži"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparat"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Otključavanje"</string> <string name="unlock_label" msgid="8779712358041029439">"otključavanje"</string> <string name="phone_label" msgid="2320074140205331708">"otvaranje telefona"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -122,10 +126,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX s dva stupca."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX s tri stupca."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Signal WiMAX potpun je."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Prekinuta je veza s ethernetom."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Uspostavljena je veza s ethernetom."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nema signala."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nije povezano."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nijedan stupac."</string> @@ -167,15 +169,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> odbačena je."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Odbačene su sve nedavne aplikacije."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Pokretanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obavijest je odbačena."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Zaslon obavijesti."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Brze postavke."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaključavanje zaslona."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Postavke"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdi"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Zatvaranje"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Korisnik <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi isključen."</string> @@ -316,8 +317,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Manje hitne obavijesti pri dnu"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Dodirnite ponovo da biste otvorili"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Prijeđite prstom prema gore za otključavanje"</string> - <string name="phone_hint" msgid="3101468054914424646">"Prijeđite prstom udesno za telefon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Prijeđite prstom ulijevo za fotoaparat"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Potpuna tišina"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Samo prioritetno"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Samo alarmi"</string> @@ -363,23 +368,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Onemogući VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Prekini vezu s VPN-om"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Vašim uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može nadzirati postavke, pristup tvrtki, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji uređaja, kao i upravljati svim prethodno navedenim. Više informacija možete saznati od administratora."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Dali ste dopuštenje aplikaciji za postavljanje VPN veze.\n\nTa aplikacija može nadzirati vašu aktivnost na uređaju i mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Vašim uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može nadzirati postavke, pristup tvrtki, aplikacije, podatke povezane s vašim uređajem i podatke o lokaciji uređaja, kao i upravljati svim prethodno navedenim.\n\nPovezani ste s VPN-om koji može nadzirati vaše aktivnosti u mreži, uključujući e-poruke, aplikacije i web-lokacije.\n\n Više informacija možete saznati od administratora."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Vašim poslovnim profilom upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se administratoru za više informacija.\n\nPovezani ste i s VPN-om koji može nadzirati vašu aktivnost na mreži."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Povezani ste s aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Povezani ste s aplikacijom <xliff:g id="APPLICATION">%1$s</xliff:g> koja može nadzirati vašu osobnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Vašim poslovnim profilom upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je s aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g> koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Vašim poslovnim profilom upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je s aplikacijom <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> koja može nadzirati vašu poslovnu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nPovezani ste i s aplikacijom <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> koja može nadzirati vašu osobnu aktivnost na mreži."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Vašim uređajem upravlja <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nVaš administrator može nadzirati postavke, poslovni pristup, aplikacije, podatke povezane s uređajem i podatke o lokaciji uređaja te upravljati njima.\n\nPovezani ste s aplikacijom <xliff:g id="APPLICATION">%2$s</xliff:g> koja može nadzirati vašu aktivnost na mreži, uključujući e-poštu, aplikacije i web-lokacije.\n\nObratite se svojem administratoru za više informacija."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Uređaj će ostati zaključan dok ga ručno ne otključate"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Primajte obavijesti brže"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Pogledajte ih prije otključavanja"</string> @@ -389,6 +386,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Sakrij sve"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Prekini sada"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je prikvačen"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Istovremeno dodirnite i držite Natrag i Pregled da biste ga otkvačili."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i držite Pregled da biste ga otkvačili."</string> diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index fe5c7a2c1341..f0ca9ce42715 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Keresés"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Feloldás"</string> <string name="unlock_label" msgid="8779712358041029439">"feloldás"</string> <string name="phone_label" msgid="2320074140205331708">"telefon megnyitása"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX-jel: két sáv."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX-jel: három sáv."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-jel: teljes."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet leválasztva."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet csatlakoztatva."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nincs jel."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nincs csatlakozva."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nincs sáv."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eltávolítva."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Az összes alkalmazás eltávolítva a nemrég használtak közül."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"A(z) <xliff:g id="APP">%s</xliff:g> indítása."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Értesítés elvetve."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Értesítési felület."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Gyorsbeállítások."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lezárási képernyő."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Beállítások"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Áttekintés."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Megerősítés"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Bezárás"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Felhasználó: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi kikapcsolva."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"A kevésbé sürgős értesítések lentebb vannak"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Érintse meg ismét a megnyitáshoz"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Húzza felfelé az ujját a feloldáshoz"</string> - <string name="phone_hint" msgid="3101468054914424646">"A telefon eléréséhez csúsztassa ujját jobbra"</string> - <string name="camera_hint" msgid="5241441720959174226">"A fényképezőgép eléréséhez csúsztassa ujját balra"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Teljes némítás"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Csak prioritásos"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Csak riasztások"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN letiltása"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN-kapcsolat bontása"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Az eszközt a következő felügyeli:<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nRendszergazdája ellenőrizheti és módosíthatja a beállításokat, vállalati hozzáféréseket, alkalmazásokat, az eszközéhez társított adatokat és eszköze helyadatait. További tájékoztatásért forduljon rendszergazdájához."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Engedélyezte egy alkalmazásnak, hogy VPN-kapcsolatot létesítsen.\n\nEz az alkalmazás (az e-mailekre, alkalmazásokra és a webhelyekre is kiterjedően) figyelemmel kísérheti az Ön eszközét és hálózati tevékenységét."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Eszközét a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nRendszergazdája figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\n Ön egy VPN-hez is kapcsolódik, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi tájékoztatásért forduljon rendszergazdájához."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Munkaprofilját a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nA rendszergazda (az e-mailekre, alkalmazásokra és a webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához.\n\nÖn egy VPN-hez is csatlakozik, amely szintén figyelemmel kísérheti hálózati tevékenységét."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Ön a következőhöz csatlakozik: <xliff:g id="APPLICATION">%1$s</xliff:g>, amely figyelheti hálózati tevékenységét, beleértve az e-mailt, az alkalmazásokat és a webhelyeket."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Ön a következőhöz csatlakozik: <xliff:g id="APPLICATION">%1$s</xliff:g>, amely figyelheti személyes hálózati tevékenységét, beleértve az e-mailt, az alkalmazásokat és a webhelyeket."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Munkaprofilját a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ez a következőhöz csatlakozik: <xliff:g id="APPLICATION">%2$s</xliff:g>, amely figyelheti hálózati tevékenységét, beleértve az e-mailt, az alkalmazásokat és a webhelyeket.\n\nTovábbi információért forduljon a rendszergazdához."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Munkaprofilját a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. A következőhöz csatlakozik: <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, amely figyelheti hálózati tevékenységét, beleértve az e-mailt, az alkalmazásokat és a webhelyeket.\n\nCsatlakozik továbbá a következőhöz: <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, amely szintén figyelemmel kísérheti személyes hálózati tevékenységét."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Eszközét a következő felügyeli: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nA rendszergazda figyelemmel kísérheti és módosíthatja beállításait, vállalati hozzáféréseit, alkalmazásait, az eszközéhez társított adatokat és eszköze helyadatait.\n\nÖn a következőhöz csatlakozik: <xliff:g id="APPLICATION">%2$s</xliff:g>, amely (az e-mailekre, alkalmazásokra és webhelyekre is kiterjedően) figyelemmel kísérheti hálózati tevékenységét.\n\nTovábbi információért forduljon a rendszergazdához."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Az eszköz addig zárolva marad, amíg kézileg fel nem oldja"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Gyorsabban megkaphatja az értesítéseket"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Már a képernyőzár feloldása előtt megtekintheti őket"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Az összes elrejtése"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Befejezés most"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"A képernyő rögzítve van"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Megjelenítve tartja addig, amíg Ön fel nem oldja fel a rögzítést. A rögzítés feloldásához tartsa egyszerre lenyomva a Vissza és az Áttekintés lehetőséget."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"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> diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml index 8449506ff95c..6162ed46acab 100644 --- a/packages/SystemUI/res/values-hy-rAM/strings.xml +++ b/packages/SystemUI/res/values-hy-rAM/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Ընտրել առաջադրանքի նոր դասավորություն"</string> <string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string> @@ -121,10 +125,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet-ը անջատված է:"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet-ը կապակցված է:"</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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Մեկնարկել <xliff:g id="APP">%s</xliff:g>-ը:"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Հաստատել"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Փակել"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Օգտվող <xliff:g id="USER">%s</xliff:g>:"</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">"Wifi-ն անջատվեց:"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Պակաս հրատապ ծանուցումները ստորև"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Կրկին հպեք՝ բացելու համար"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Սահեցրեք վերև` ապակողպելու համար"</string> - <string name="phone_hint" msgid="3101468054914424646">"Հեռախոսի համար սահեցրեք աջ"</string> - <string name="camera_hint" msgid="5241441720959174226">"Խցիկի համար սահեցրեք ձախ"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Անջատել VPN-ը"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Անջատել VPN-ը"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Սարքի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները: Լրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Ինչ-որ հավելվածի թույլ եք տվել հաստատել VPN կապակցում:\n\nԱյդ հավելվածը կարող է վերահսկել ձեր սարքի և ցանցի գործունեությունը, այդ թվում նաև՝ էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Սարքի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև ունեք VPN կապակցում, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլեկտրոնային նամակները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Աշխատանքային պրոֆիլի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>:\n\nԱդմինիստրատորը կարող է վերահսկել ցանցում ունեցած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:\n\nՆաև ունեք VPN կապակցում, ինչը կարող է վերահսկել ձեր ցանցում կատարած գործողությունները:"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Դուք կապակցված եք <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Դուք կապակցված եք <xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Աշխատանքային պրոֆիլի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>: Այն կապակցված է <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Աշխատանքային պրոֆիլի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>: Այն կապակցված է <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել աշխատանքային ցանցում կատարած գործունեությունը, այդ թվում նաև էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԴուք նույնպես կապակցված եք <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել անձնական ցանցում կատարած ձեր գործողությունները:"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Սարքի կառավարիչն է՝ <xliff:g id="ORGANIZATION">%1$s</xliff:g>:\n\nԱդմինիստրատորը կարող է վերահսկել և կառավարել կարգավորումները, կորպորատիվ հաշիվը, հավելվածները, սարքի հետ առնչվող և սարքի տեղադրության տվյալները:\n\nՆաև կապակցված եք <xliff:g id="APPLICATION">%2$s</xliff:g> հավելվածին, ինչը կարող է վերահսկել ձեր ցանցի գործունեությունը, այդ թվում նաև՝ էլփոստի հաշիվները, հավելվածները և կայքերը:\n\nԼրացուցիչ տեղեկությունների համար դիմեք ադմինիստրատորին:"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Թաքցնել բոլորը"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Ավարտել"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Էկրանն ամրացված է"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար միաժամանակ հպեք և պահեք Համատեսքի և Հետ կոճակները:"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Էկրանը կմնա տեսադաշտում, մինչև այն ապամրացնեք: Ապամրացնելու համար հպեք և պահեք Համատեսքի կոճակը:"</string> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index b869d6c309cd..c179b84ee48e 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Telusuri"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telepon"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Voice Bantuan"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Buka kunci"</string> <string name="unlock_label" msgid="8779712358041029439">"buka kunci"</string> <string name="phone_label" msgid="2320074140205331708">"buka ponsel"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"buka voice bantuan"</string> <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> @@ -121,10 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX dua batang."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX tiga batang."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Sinyal WiMAX penuh."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet terputus."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet tersambung."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Tidak ada sinyal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Tidak tersambung."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"0 baris."</string> @@ -166,15 +166,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> disingkirkan."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaru telah ditutup."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Memulai <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifikasi disingkirkan."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bayangan pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setelan cepat."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Layar kunci."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Setelan"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ringkasan."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Konfirmasi"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Tutup"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi dinonaktifkan."</string> @@ -308,15 +307,16 @@ <string name="description_target_search" msgid="3091587249776033139">"Telusuri"</string> <string name="description_direction_up" msgid="7169032478259485180">"Geser ke atas untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> <string name="description_direction_left" msgid="7207478719805562165">"Geser ke kiri untuk <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>."</string> - <string name="zen_priority_introduction" msgid="3070506961866919502">"Anda tidak akan diganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon yang ditentukan."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"Anda tidak akan diganggu oleh suara dan getaran, kecuali dari alarm, pengingat, acara, dan penelepon tertentu."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sesuaikan"</string> <string name="zen_silence_introduction" msgid="575422795504098868">"SEMUA suara dan getaran, termasuk dari alarm, musik, video, dan game akan diblokir. Anda tetap dapat melakukan panggilan telepon."</string> <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">"Notifikasi kurang darurat di bawah"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Sentuh lagi untuk membuka"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Gesek ke atas untuk membuka kunci"</string> - <string name="phone_hint" msgid="3101468054914424646">"Gesek ke kanan untuk menelepon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Gesek ke kiri untuk kamera"</string> + <string name="phone_hint" msgid="4872890986869209950">"Gesek dari ikon untuk telepon"</string> + <string name="voice_hint" msgid="8939888732119726665">"Gesek dari ikon untuk voice bantuan"</string> + <string name="camera_hint" msgid="7939688436797157483">"Gesek dari ikon untuk kamera"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Senyap total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Hanya untuk prioritas"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Hanya alarm"</string> @@ -362,23 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Nonaktifkan VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Putuskan sambungan VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Perangkat dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat. Untuk informasi selengkapnya, hubungi administrator."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Anda memberikan izin kepada aplikasi untuk menyiapkan sambungan VPN.\n\nAplikasi ini dapat memantau aktivitas perangkat dan jaringan, termasuk email, aplikasi, dan situs web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Perangkat dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke VPN yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator.\n\nAnda juga tersambung ke VPN yang dapat memantau aktivitas jaringan."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Anda tersambung ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi, termasuk email, aplikasi, dan situs web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g> dan tersambung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Profil kerja dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g> dan tersambung ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan kerja, termasuk email, aplikasi, dan situs web.\n\nAnda juga tersambung ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang dapat memantau aktivitas jaringan pribadi."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Perangkat dikelola oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator dapat memantau dan mengelola setelan, akses perusahaan, aplikasi, data terkait perangkat, dan informasi lokasi perangkat.\n\nAnda tersambung ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang dapat memantau aktivitas jaringan, termasuk email, aplikasi, dan situs web.\n\nUntuk informasi selengkapnya, hubungi administrator."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Perangkat akan tetap terkunci hingga Anda membukanya secara manual"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Dapatkan pemberitahuan lebih cepat"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Lihat sebelum membuka kunci"</string> @@ -388,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Sembunyikan semua"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Akhiri sekarang"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Luaskan"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ciutkan"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Layar dipasangi pin"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Kembali dan Ringkasan secara bersamaan untuk melepas pin."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Ringkasan untuk melepas pin."</string> diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml index dbd9c7d7bd6c..6a15a1bbd74d 100644 --- a/packages/SystemUI/res/values-is-rIS/strings.xml +++ b/packages/SystemUI/res/values-is-rIS/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Leita"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Myndavél"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Sími"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Taka úr lás"</string> <string name="unlock_label" msgid="8779712358041029439">"taka úr lás"</string> <string name="phone_label" msgid="2320074140205331708">"opna síma"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: Tvö strik."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: Þrjú strik."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Fullur WiMAX-sendistyrkur."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet aftengt."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet tengt."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ekkert merki."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Engin tenging."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Engin strik."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> vísað frá."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Öll nýleg forrit fjarlægð."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Ræsir <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Tilkynningu lokað."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Tilkynningasvæði."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Flýtistillingar."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lásskjár."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Stillingar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Yfirlit."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Staðfesta"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Loka"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Notandi: <xliff:g id="USER">%s</xliff:g>."</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">"Slökkt á Wi-Fi."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Minna áríðandi tilkynningar fyrir neðan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Snertu aftur til að opna"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Strjúktu upp til að opna"</string> - <string name="phone_hint" msgid="3101468054914424646">"Strjúktu til hægri fyrir síma"</string> - <string name="camera_hint" msgid="5241441720959174226">"Strjúktu til vinstri fyrir myndavél"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Algjör þögn"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Aðeins forgangur"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Aðeins vekjarar"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Slökkva á VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Aftengja VPN-net"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Tækinu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins. Hafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Þú veittir forriti heimild til að koma á VPN-tengingu.\n\nÞetta forrit getur fylgst með virkni þinni í tækinu og á netinu, þar á meðal tölvupósti, forritum og vefsvæðum."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Tækinu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við VPN-net sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Vinnusniðinu þínu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nKerfisstjórinn þinn getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar.\n\nÞú ert einnig með tengingu við VPN-net sem getur fylgst með netnotkun þinni."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Þú ert með tengingu við <xliff:g id="APPLICATION">%1$s</xliff:g>, sem getur fylgst með netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Þú ert með tengingu við <xliff:g id="APPLICATION">%1$s</xliff:g>, sem getur fylgst með persónulegri netnotkun þinni, þ. á m. tölvupósti, forritum og vefsvæðum."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Vinnusniðinu þínu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Það er tengt <xliff:g id="APPLICATION">%2$s</xliff:g>, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Vinnusniðinu þínu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Það er tengt <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, sem getur fylgst með vinnutengdri netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nÞú ert einnig með tengingu við <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, sem getur fylgst með persónulegri netnotkun þinni."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Tækinu er stjórnað af <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nKerfisstjórinn þinn getur fylgst með og stjórnað stillingum, fyrirtækjaaðgangi, forritum, gögnum sem tengd eru tækinu og staðsetningarupplýsingum tækisins.\n\nÞú ert með tengingu við <xliff:g id="APPLICATION">%2$s</xliff:g>, sem getur fylgst með netnotkun þinni, þar á meðal tölvupósti, forritum og vefsvæðum.\n\nHafðu samband við kerfisstjórann til að fá frekari upplýsingar."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Tækið verður læst þar til þú opnar það handvirkt"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Fáðu tilkynningar hraðar"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Sjáðu þær áður en þú opnar"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Fela allt"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Hætta núna"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skjárinn er festur"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Þetta heldur þessu opnu þangað til þú losar. Haltu bakk- og yfirlitshnöppunum inni á sama tíma til að losa."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Þetta heldur þessu opnu þangað til þú losar. Haltu yfirlitshnappinum inni til að losa."</string> diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 7d179fabc129..51b7bcde89d6 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Cerca"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotocamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefono"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Sblocca"</string> <string name="unlock_label" msgid="8779712358041029439">"sblocca"</string> <string name="phone_label" msgid="2320074140205331708">"apri telefono"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: due barre."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: tre barre."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Massimo segnale WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Connessione Ethernet annullata."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Connessione Ethernet stabilita."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nessun segnale."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Non connesso."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nessuna barra."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> eliminata."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tutte le applicazioni recenti sono state rimosse."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Avvio di <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notifica eliminata."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Area notifiche."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Impostazioni rapide."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Schermata di blocco."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Impostazioni"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Panoramica."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Conferma"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Chiudi"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utente <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi disattivato."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notifiche meno urgenti in basso"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tocca di nuovo per aprire"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Scorri verso l\'alto per sbloccare"</string> - <string name="phone_hint" msgid="3101468054914424646">"Scorri verso destra per accedere al telefono"</string> - <string name="camera_hint" msgid="5241441720959174226">"Scorri verso sinistra per accedere alla fotocamera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silenzio totale"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Solo con priorità"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Solo sveglie"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Disattiva VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Scollega VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Il tuo dispositivo è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo. Per ulteriori informazioni, contatta l\'amministratore."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Hai autorizzato l\'app a configurare una connessione VPN.\n\nQuesta app può monitorare il tuo dispositivo e l\'attività di rete, inclusi email, app e siti web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Il tuo dispositivo è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a una rete VPN da cui è possibile monitorare la tua attività di rete, inclusi siti web, email e app.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Il tuo profilo di lavoro è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'amministratore può monitorare l\'attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore.\n\nSei connesso anche a VPN, da cui è possibile monitorare la tua attività di rete."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Sei connesso a <xliff:g id="APPLICATION">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Sei connesso a <xliff:g id="APPLICATION">%1$s</xliff:g>, da cui è possibile monitorare la tua attività di rete personale, inclusi email, app e siti web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Il tuo profilo di lavoro è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>. È connesso a <xliff:g id="APPLICATION">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta il tuo amministratore."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Il tuo profilo di lavoro è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>. È connesso a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete lavorativa, inclusi email, app e siti web.\n\nSei connesso anche a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, da cui è possibile monitorare la tua attività di rete personale."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Il tuo dispositivo è gestito da <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nL\'amministratore può monitorare e gestire impostazioni, accesso aziendale, app e dati associati al dispositivo, incluse le informazioni sulla posizione del dispositivo.\n\nSei connesso a <xliff:g id="APPLICATION">%2$s</xliff:g>, da cui è possibile monitorare la tua attività di rete, inclusi email, app e siti web.\n\nPer ulteriori informazioni, contatta l\'amministratore."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Il dispositivo resterà bloccato fino allo sblocco manuale"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Ricevi notifiche più velocemente"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Visualizza prima di sbloccare"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Nascondi tutto"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Termina adesso"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"La schermata è bloccata"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"La schermata rimane visibile finché la sblocchi. Tocca e tieni premuti contemporaneamente Indietro e Panoramica per sbloccare."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"La schermata rimane visibile finché la sblocchi. Tocca Panoramica e tieni premuto per sbloccare."</string> diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index 535035c00376..36eb5a7df4ba 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -85,9 +85,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"בחר פריסה חדשה להצגת משימות"</string> <string name="cancel" msgid="6442560571259935130">"ביטול"</string> @@ -123,10 +127,8 @@ <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_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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"מפעיל את <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"אשר"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"סגור"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"משתמש <xliff:g id="USER">%s</xliff:g>."</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">"Wifi כבוי."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"הודעות בדחיפות נמוכה יותר בהמשך"</string> <string name="notification_tap_again" msgid="8524949573675922138">"גע שוב כדי לפתוח"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"החלק מעלה כדי לבטל את הנעילה"</string> - <string name="phone_hint" msgid="3101468054914424646">"כדי להפעיל את הטלפון, החלק שמאלה"</string> - <string name="camera_hint" msgid="5241441720959174226">"החלק ימינה להפעלת המצלמה"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"השבת VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"נתק את ה-VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"המכשיר מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם. למידע נוסף, פנה אל מנהל המערכת."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"נתת לאפליקציה כלשהי הרשאה להגדיר חיבור VPN.\n\nהאפליקציה יכולה לעקוב אחר הפעילות שלך ברשת ובמכשיר, כולל הודעות אימייל, אפליקציות ואתרים."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"המכשיר מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nמנהל המערכת יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר ל-VPN שיכול לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nמנהל המערכת שלך יכול לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך.\n\nאתה מחובר גם לרשת VPN, שיכולה לעקוב אחר הפעילות שלך ברשת."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"אתה מחובר לאפליקציה <xliff:g id="APPLICATION">%1$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית, כולל הודעות אימייל, אפליקציות ואתרים."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הוא מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"פרופיל העבודה שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>. הוא מחובר לאפליקציה <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת העסקית, כולל הודעות אימייל, אפליקציות ואתרים.\n\nאתה מחובר גם לאפליקציה <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת הפרטית."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"המכשיר שלך מנוהל על ידי <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nמנהל המערכת שלך יכול לעקוב אחר הגדרות, גישה עסקית, אפליקציות, נתונים המשויכים למכשיר שלך ומידע על מיקום המכשיר, ולנהל אותם.\n\nאתה מחובר לאפליקציה <xliff:g id="APPLICATION">%2$s</xliff:g>, שיכולה לעקוב אחר הפעילות שלך ברשת, כולל הודעות אימייל, אפליקציות ואתרים.\n\nלמידע נוסף, פנה למנהל המערכת שלך."</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"הסתר הכל"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"סיים כעת"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"המסך מוצמד"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"שומר בתצוגה עד לביטול ההצמדה. גע והחזק בו-זמנית ב\'הקודם\' ו\'סקירה\' כדי לבטל הצמדה."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"שומר בתצוגה עד לביטול ההצמדה. גע והחזק בו-זמנית ב\'הקודם\' ו\'סקירה\' כדי לבטל הצמדה."</string> diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 31aad8825c5d..62baa69e18bd 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"新しいタスクレイアウトの選択"</string> <string name="cancel" msgid="6442560571259935130">"キャンセル"</string> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX電波状態:レベル2"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX電波状態:レベル3"</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_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">"レベル0"</string> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>を開始しています。"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"確認"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"閉じる"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ユーザー: <xliff:g id="USER">%s</xliff:g>"</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">"Wi-FiをOFFにしました。"</string> @@ -187,7 +188,7 @@ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"機内モードがONです。"</string> <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"機内モードをOFFにしました。"</string> <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"機内モードをONにしました。"</string> - <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"[通知を非表示]はONで、重要な通知のみです。"</string> + <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"[通知を非表示]はONで、優先する通知のみです。"</string> <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"[通知を非表示]はONで、サイレントです。"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"[通知を非表示]はONで、アラームのみです。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"[通知を非表示]はOFFです。"</string> @@ -241,7 +242,7 @@ <string name="start_dreams" msgid="7219575858348719790">"スクリーンセーバー"</string> <string name="ethernet_label" msgid="7967563676324087464">"イーサネット"</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_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">"Bluetooth"</string> @@ -317,10 +318,14 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"緊急度の低い通知を下に表示"</string> <string name="notification_tap_again" msgid="8524949573675922138">"開くにはもう一度タップしてください"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"ロック解除するには上にスワイプしてください"</string> - <string name="phone_hint" msgid="3101468054914424646">"右にスワイプして電話を表示"</string> - <string name="camera_hint" msgid="5241441720959174226">"左にスワイプしてカメラを表示"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"サイレント"</string> - <string name="interruption_level_priority" msgid="6426766465363855505">"重要な通知のみ"</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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPNを無効にする"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPNを切断"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"この端末は<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。詳しくは管理者にお問い合わせください。"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"アプリにVPN接続のセットアップを許可しました。\n\nこのアプリはあなたの端末やネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"この端末は<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\nVPNに接続しているため、VPNもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"この仕事用プロファイルは<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理されています。\n\n管理者はあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。\n\nVPNにも接続しているため、VPNもネットワークアクティビティを監視できます。"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"<xliff:g id="APPLICATION">%1$s</xliff:g>に接続しています。このアプリはあなたのネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"<xliff:g id="APPLICATION">%1$s</xliff:g>に接続しています。このアプリはあなたの個人のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"この仕事用プロファイルは<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理され、<xliff:g id="APPLICATION">%2$s</xliff:g>に接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"この仕事用プロファイルは<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理され、<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>に接続しています。このアプリはあなたの仕事のネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>にも接続しているため、このアプリも個人のネットワークアクティビティを監視できます。"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"この端末は<xliff:g id="ORGANIZATION">%1$s</xliff:g>によって管理されています。\n\n管理者は設定、コーポレートアクセス、アプリ、端末に関連付けられたデータ、端末の位置情報を監視、管理できます。\n\n<xliff:g id="APPLICATION">%2$s</xliff:g>に接続しているため、このアプリもネットワークアクティビティ(メール、アプリ、ウェブサイトなど)を監視できます。\n\n詳しくは管理者にお問い合わせください。"</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"すべて非表示"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"今すぐ終了"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"画面が固定されました"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"固定を解除するまで画面が常に表示されるようになります。[戻る]と[最近]を同時に押し続けると固定が解除されます。"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"固定を解除するまで画面が常に表示されるようになります。[最近]を押し続けると固定が解除されます。"</string> diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml index 4db00f6e8edf..5fc889e2a2a5 100644 --- a/packages/SystemUI/res/values-ka-rGE/strings.xml +++ b/packages/SystemUI/res/values-ka-rGE/strings.xml @@ -83,9 +83,11 @@ <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> <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> @@ -121,10 +123,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet კავშირი შეწყვეტილია."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet დაკავშირებულია."</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> @@ -166,15 +166,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> იწყება."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"დადასტურება"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"დახურვა"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"მომხმარებელი: <xliff:g id="USER">%s</xliff:g>."</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">"Wifi გამორთულია."</string> @@ -315,8 +314,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"ქვემოთ მითითებულია ნაკლებად სასწრაფო შეტყობინებები"</string> <string name="notification_tap_again" msgid="8524949573675922138">"შეეხეთ ისევ გასახსნელად"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"გაასრიალეთ ზევით განსაბლოკად"</string> - <string name="phone_hint" msgid="3101468054914424646">"გადაფურცლეთ მარჯვნივ ტელეფონისთვის"</string> - <string name="camera_hint" msgid="5241441720959174226">"კამერისთვის მარცხენა შენაცვლება"</string> + <string name="phone_hint" msgid="4872890986869209950">"ტელეფონისთვის გადაფურცლეთ ხატულადან"</string> + <string name="voice_hint" msgid="8939888732119726665">"ხმოვანი დახმარებისთვის გადაფურცლეთ ხატულადან"</string> + <string name="camera_hint" msgid="7939688436797157483">"კამერისთვის გადაფურცლეთ ხატულადან"</string> <string name="interruption_level_none" msgid="6000083681244492992">"სრული სიჩუმე"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"მხოლოდ პრიორიტეტული"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"მხოლოდ გაფრთხილებები"</string> @@ -362,23 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN-ის გაუქმება"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN-ის გათიშვა"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"თქვენ მოწყობილობას მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, მათ შორის, ქსელის აქტივობისა და თქვენი მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა. დამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"თქვენ მიეცით ნებართვა აპს, დააყენოს VPN კავშირი.\n\nამ აპს შეუძლია თქვენი მოწყობილობის და ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების, მონიტორინგი."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"თქვენ მოწყობილობას მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nთქვენს ადმინისტრატორს შეუძლია ამ მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე თქვენი მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ ასევე დაკავშირებული ხართ VPN-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპების და ვებსაიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"თქვენს სამუშაო პროფილს მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nთქვენს ადმინისტრატორს შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების.\n\nდამატებითი ინფორმაციისთვის, დაუკავშირდით თქვენს ადმინისტრატორს.\n\nთქვენ ასევე დაკავშირებული ხართ VPN-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"თქვენ დაუკავშირდით <xliff:g id="APPLICATION">%1$s</xliff:g>-ს, რომელსაც შეუძლია თქვენი ქსელის აქტივობის მონიტორინგი, მათ შორის ელფოსტის, აპების და ვებ-საიტების."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"თქვენ დაუკავშირდით <xliff:g id="APPLICATION">%1$s</xliff:g>-ს, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის მონიტორინგი, მათ შორის ელფოსტის, აპების და ვებ-საიტების."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"თქვენს სამუშაო პროფილს მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ის დაკავშირებულია <xliff:g id="APPLICATION">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის მონიტორინგი, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების.\n\nდამატებითი ინფორმაციისთვის მიმართეთ თქვენს ადმინისტრატორს."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"თქვენს სამუშაო პროფილს მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ის დაკავშირებულია <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი სამსახურის ქსელის აქტივობის მონიტორინგი, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების.\n\nთქვენ ასევე დაკავშირებული ხართ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი პირადი ქსელის აქტივობის მონიტორინგი."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"თქვენს მოწყობილობას მართავს <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nადმინისტრატორს შეუძლია თქვენი მოწყობილობასთან ასოცირებული პარამეტრების, კორპორატიული წვდომის, აპებისა და მონაცემების, და ასევე მოწყობილობის მდებარეობის ინფორმაციის მონიტორინგი და მართვა.\n\nთქვენ დაკავშირებული ხართ <xliff:g id="APPLICATION">%2$s</xliff:g>-თან, რომელსაც შეუძლია თქვენი ქსელის აქტივობის, მათ შორის, ელფოსტის, აპებისა და ვებ-საიტების მონიტორინგი.\n\nდამატებითი ინფორმაციისათვის, დაუკავშირდით თქვენს ადმინისტრატორს."</string> <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> @@ -388,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"ყველას დამალვა"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"გამორთვა"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"გავრცობა"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ჩაკეცვა"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"ეკრანი ჩამაგრებულია"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ამით ის ხედში დარჩება, სანამ ჩამაგრებას არ გააუქმებთ. ჩამაგრების გასაუქმებლად შეეხეთ და დააყოვნეთ „დაბრუნება“-ზე და „მიმოხილვა“-ზე ერთდროულად."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ამით ის ხედში დარჩება, სანამ ჩამაგრებას არ გააუქმებთ. ჩამაგრების გასაუქმებლად შეეხეთ და დააყოვნეთ „მიმოხილვა“-ზე."</string> diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml index b45f0e1c7b24..cb9c7abfb6f0 100644 --- a/packages/SystemUI/res/values-kk-rKZ/strings.xml +++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңа тапсырма пішімін таңдау"</string> <string name="cancel" msgid="6442560571259935130">"Бас тарту"</string> @@ -121,10 +125,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet ажыратылған."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet қосылған."</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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> іске қосылуда."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Растау"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Жабу"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пайдаланушы <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi өшірілді."</string> @@ -310,13 +311,17 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> үшін солға сырғыту."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Дабылдар, еске салғыштар, оқиғалар мен өзіңіз көрсеткен контактілердің қоңырауларынан басқа дыбыстар мен дірілдер мазаламайтын болады."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Реттеу"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Бұл дабыл, музыка, бейнелер мен ойындарды қоса алғанда, барлық дыбыстар мен дірілдерді бұғаттайды. Сіз әлі де телефон қоңырау шала аласыз."</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"Дабыл, музыка, бейнелер мен ойындарды қоса алғанда, барлық дыбыстар мен дірілдер тыйылатын болады. Қоңырау шала беруіңізге болады."</string> <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="8524949573675922138">"Ашу үшін қайтадан түртіңіз"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Бекітпесін ашу үшін жанаңыз"</string> - <string name="phone_hint" msgid="3101468054914424646">"Телефон үшін оңға жанаңыз"</string> - <string name="camera_hint" msgid="5241441720959174226">"Камера үшін солға жанаңыз"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN функциясын өшіру"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN желісін ажырату"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Құрылғыңызды басқаратын:<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nСіздің әкімшіңіз параметрлерді, корпоративтік мүмкіндікті, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасуы туралы ақпаратты қадағалай алады. Қосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Қолданбаға VPN байланысын орнату рұқсатын бердіңіз.\n\nБұл қолданба құрылғыңызды және желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алады."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Құрылғыңызды басқаратын:<xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nСіздің әкімшіңіз параметрлерді, корпоративтік мүмкіндікті, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғыңыздың орналасуы туралы ақпаратты қадағалай алады.\n\nСіз электрондық пошта, қолданбалар және сайттарды қосқандағы желілік әрекеттеріңізді бақылай алатын VPN желісіне қосылдыңыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Жұмыс профиліңізді <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады.\n\nӘкімші желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алады.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз.\n\nСондай-ақ сіз желідегі белсенділігіңізді бақылай алатын VPN желісіне қосылғансыз."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Сіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасына қосылғансыз."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Сіз жеке желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%1$s</xliff:g> қолданбасына қосылғансыз."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Жұмыс профиліңізді <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады. Ол жұмыс кезінде желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасына қосылған.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Жұмыс профиліңізді <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады. Ол желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және веб-сайттарды бақылай алатын <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> қолданбасына қосылған.\n\nСондай-ақ сіз желідегі жеке белсенділігіңізді бақылай алатын <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> қолданбасына қосылғансыз."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Құрылғыңызды <xliff:g id="ORGANIZATION">%1$s</xliff:g> басқарады.\n\nӘкімші параметрлерді, корпоративтік рұқсатты, қолданбаларды, құрылғыңызбен байланысты деректерді және құрылғының орны туралы ақпаратты бақылай және басқара алады.\n\nСіз желідегі белсенділігіңізді, соның ішінде электрондық пошталарды, қолданбаларды және евб-сайттарды бақылай алатын <xliff:g id="APPLICATION">%2$s</xliff:g> қолданбасына қосылғансыз.\n\nҚосымша ақпарат алу үшін әкімшіге хабарласыңыз."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Барлығын жасыру"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Қазір өшіру"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран түйрелді"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Бұл сіз оны босатқанша оны көрсетіп тұрады. Босату үшін «Кері» және «Шолу» түймелерін бір уақытта басып тұрыңыз."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Бұл сіз оны босатқанша оны көрсетіп тұрады. Босату үшін «Шолу» түймесін бір уақытта басып тұрыңыз."</string> diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml index 719df7ff872f..9c7bdaa1b8f5 100644 --- a/packages/SystemUI/res/values-km-rKH/strings.xml +++ b/packages/SystemUI/res/values-km-rKH/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"ជ្រើសប្លង់ភារកិច្ចថ្មី"</string> <string name="cancel" msgid="6442560571259935130">"បោះបង់"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"ចាប់ផ្ដើម <xliff:g id="APP">%s</xliff:g> ។"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"បញ្ជាក់"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"បិទ"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"អ្នកប្រើ <xliff:g id="USER">%s</xliff:g> ។"</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"ការជូនដំណឹងមិនសូវបន្ទាន់ខាងក្រោម"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ប៉ះម្ដងទៀតដើម្បីបើក"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"អូសឡើងលើ ដើម្បីដោះសោ"</string> - <string name="phone_hint" msgid="3101468054914424646">"អូសទៅស្ដាំដើម្បីបើកទូរស័ព្ទ"</string> - <string name="camera_hint" msgid="5241441720959174226">"អូសទៅឆ្វេងដើម្បីប្រើម៉ាស៊ីនថត"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"បិទ VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"ផ្ដាច់ VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ៖ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលដំណើរការជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។ សម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"អ្នកបានអនុញ្ញាតឲ្យកម្មវិធីរដំឡើងការភ្ជាប់ VPN ។\n\nកម្មវិធីនេះអាចឃ្លាំមើលឧបករណ៍ និងសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលដំណើរការជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ VPN ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"ប្រវត្តិការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកមានលទ្ធភាពអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។\n\nអ្នកក៏ត្រូវបានភ្ជាប់ជាមួួយ VPN ផងដែរ ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក។"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"អ្នកត្រូវបានតភ្ជាប់ទៅ <xliff:g id="APPLICATION">%1$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"អ្នកត្រូវបានតភ្ជាប់ទៅ <xliff:g id="APPLICATION">%1$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រាប់បញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"ប្រវត្តិការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>។ វាត្រូវបានតភ្ជាប់ទៅនឹង <xliff:g id="APPLICATION">%2$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រប់របស់អ្នក។"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"ប្រវត្តិការងាររបស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>។ វាត្រូវបានតភ្ជាប់ទៅនឹង <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី គេហទំព័រ។\n\nអ្នកក៏ត្រូវបានតភ្ជាប់ផងដែរទៅនឹង <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ដែលអាចឃ្លាំមើលសកម្មភាពបណ្តាញផ្ទាល់ខ្លួនរបស់អ្នក។"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ឧបករណ៍របស់អ្នកត្រូវបានគ្រប់គ្រងដោយ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nអ្នកគ្រប់គ្រងរបស់អ្នកអាចឃ្លាំមើល និងគ្រប់គ្រងការកំណត់ ការចូលប្រើជាក្រុម កម្មវិធី ទិន្នន័យដែលជាប់ទាក់ទងនឹងឧបករណ៍របស់អ្នក និងព័ត៌មានទីតាំងនៃឧបករណ៍របស់អ្នក។\n\nអ្នកត្រូវបានភ្ជាប់ជាមួយ <xliff:g id="APPLICATION">%2$s</xliff:g> ដែលវាអាចឃ្លាំមើលសកម្មភាពបណ្តាញរបស់អ្នក រួមបញ្ចូលទាំងអ៊ីមែល កម្មវិធី និងគេហទំព័រ។\n\nសម្រាប់ព័ត៌មានបន្ថែម សូមទាក់ទងអ្នកគ្រប់គ្រងរបស់អ្នក។"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"លាក់ទាំងអស់"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"បញ្ចប់ឥឡូវនេះ"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"អេក្រង់ត្រូវបានភ្ជាប់"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"រក្សាទុកវាក្នុងទិដ្ឋភាពរហូតដល់អ្នកផ្ដាច់។ ប៉ះ ហើយសង្កត់ថយក្រោយ និងទិដ្ឋភាពនៅពេលតែមួយដើម្បីផ្ដាច់។"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"វារក្សាទុកក្នុងទិដ្ឋភាពរហូតដល់អ្នកផ្ដាច់។ ប៉ះ និងសង្កត់ទិដ្ឋភាពដើម្បីផ្ដាច់។"</string> diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml index f3a1b3dbd3a9..3c12cde3cefe 100644 --- a/packages/SystemUI/res/values-kn-rIN/strings.xml +++ b/packages/SystemUI/res/values-kn-rIN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string> <string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡು"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"ದೃಢೀಕರಿಸು"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ಮುಚ್ಚು"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ಬಳಕೆದಾರ <xliff:g id="USER">%s</xliff:g>."</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"ಕೆಳಗೆ ಕಡಿಮೆ ಅವಸರದ ಅಧಿಸೂಚನೆಗಳು"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ತೆರೆಯಲು ಮತ್ತೊಮ್ಮೆ ಸ್ಪರ್ಶಿಸಿ"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"ಅನ್ಲಾಕ್ ಮಾಡಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string> - <string name="phone_hint" msgid="3101468054914424646">"ಫೋನ್ಗಾಗಿ ಬಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> - <string name="camera_hint" msgid="5241441720959174226">"ಕ್ಯಾಮರಾಗಾಗಿ ಎಡಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ಸಂಪರ್ಕಕಡಿತಗೊಳಿಸಿ"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಮತ್ತು ನಿರ್ವಹಿಸುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದಾರೆ."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"ನೀವು VPN ಸಂಪರ್ಕ ಹೊಂದಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿ ನೀಡಿರುವಿರಿ.\n\nಈ ಅಪ್ಲಿಕೇಶನ್ ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಅವರು ನಿರ್ವಹಿಸುತ್ತಿದ್ದಾರೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nನೀವು VPN ಗೆ ಸಂಪರ್ಕವನ್ನು ಹೊಂದಿರುವಿರಿ, ಅದು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ನಿರ್ವಹಿಸಬಹುದು.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"ನಿಮ್ಮ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಹೊಂದಿದ್ದಾರೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ.\n\nನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ VPN ಗೆ ಕೂಡಾ ನೀವು ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"ನೀವು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"ನೀವು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿರುವಿರಿ."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"ನಿಮ್ಮ ಕೆಲಸದ ಪ್ರೊಫೈಲ್ ಅನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಇದು ಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು, ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ಕೆಲಸದ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿದೆ.\n\nನೀವು ಕೂಡಾ ವೈಯಕ್ತಿಕ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ನಿಮ್ಮ ಸಾಧನವನ್ನು <xliff:g id="ORGANIZATION">%1$s</xliff:g> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ.\n\nನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಸೆಟ್ಟಿಂಗ್ಗಳು, ಕಾರ್ಪೊರೇಟ್ ಪ್ರವೇಶ, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಹಾಗೂ ನಿಮ್ಮ ಸಾಧನದೊಂದಿಗೆ ಸಂಬಂಧಿಸಿದ ಡೇಟಾ ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ಸ್ಥಳ ಮಾಹಿತಿಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು ಮತ್ತು ನಿರ್ವಹಿಸಬಹುದು.\n\nಇಮೇಲ್ಗಳು, ಅಪ್ಲಿಕೇಶನ್ಗಳು ಮತ್ತು ವೆಬ್ಸೈಟ್ಗಳನ್ನು ಒಳಗೊಂಡಂತೆ ನಿಮ್ಮ ನೆಟ್ವರ್ಕ್ ಚಟುವಟಿಕೆಯನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದಾದ <xliff:g id="APPLICATION">%2$s</xliff:g> ಗೆ ಸಂಪರ್ಕಿತಗೊಂಡಿರುವಿರಿ.\n\nಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"ಎಲ್ಲ ಮರೆಮಾಡಿ"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ಈಗಲೇ ಅಂತ್ಯಗೊಳಿಸು"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಒಂದೇ ಸಮಯದಲ್ಲಿ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅವಲೋಕಿಸಿ."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ."</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index c1081e980b16..dc717ecacddb 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"새 작업 레이아웃 선택"</string> <string name="cancel" msgid="6442560571259935130">"취소"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>을(를) 시작하는 중입니다."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"확인"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"닫기"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"사용자 <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi가 사용 중지되었습니다."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"아래에 덜 급한 알림 표시"</string> <string name="notification_tap_again" msgid="8524949573675922138">"다시 터치하여 열기"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"위로 스와이프하여 잠금 해제"</string> - <string name="phone_hint" msgid="3101468054914424646">"전화 기능을 사용하려면 오른쪽으로 스와이프하세요."</string> - <string name="camera_hint" msgid="5241441720959174226">"카메라를 사용하려면 왼쪽으로 스와이프하세요."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN 사용 중지"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN 연결 해제"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"이 기기는 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다. 자세한 내용은 관리자에게 문의하세요."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"VPN 연결을 설정할 수 있는 권한을 앱에 부여했습니다.\n\n이 앱에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동과 기기를 모니터링할 수 있습니다."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"이 기기는 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 관련된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\nVPN에 연결되어 있으므로 VPN 업체에서 이메일, 앱, 웹사이트를 비롯한 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"직장 프로필은 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다.\n\n관리자는 이메일, 앱, 웹사이트와 같은 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요.\n\n또한 VPN에 연결되어 있으며 여기에서 내 네트워크 활동을 모니터링할 수 있습니다."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"<xliff:g id="APPLICATION">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"<xliff:g id="APPLICATION">%1$s</xliff:g>에 연결되었습니다. 이 앱은 이메일, 앱, 웹사이트와 같은 내 개인 네트워크 활동을 모니터링할 수 있습니다."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"직장 프로필은 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다. 이는 <xliff:g id="APPLICATION">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"직장 프로필은 <xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 관리합니다. 이는 <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 직장 네트워크 활동을 모니터링할 수 있습니다.\n\n또한 <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>에 연결되어 있으며, 여기에서 내 개인 네트워크 활동을 모니터링할 수 있습니다."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>에서 기기를 관리합니다.\n\n관리자는 설정, 기업 액세스, 앱, 기기와 연결된 데이터, 기기의 위치 정보를 모니터링하고 관리할 수 있습니다.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g>에 연결되어 있으며 여기에서 이메일, 앱, 웹사이트와 같은 내 네트워크 활동을 모니터링할 수 있습니다.\n\n자세한 내용은 관리자에게 문의하세요."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"모두 숨기기"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"지금 종료"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"화면 고정됨"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"고정 해제하기 전까지 계속 표시됩니다. 고정 해제하려면 뒤로와 최근 사용을 동시에 길게 터치합니다."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"고정 해제하기 전까지 계속 표시됩니다. 고정 해제하려면 최근 사용을 길게 터치합니다."</string> diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml index b019777aa85f..c695314d5365 100644 --- a/packages/SystemUI/res/values-ky-rKG/strings.xml +++ b/packages/SystemUI/res/values-ky-rKG/strings.xml @@ -107,9 +107,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Жаңы тапшырманын планын тандаңыз"</string> <!-- no translation found for cancel (6442560571259935130) --> @@ -146,10 +150,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet ажырады."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet туташты."</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> @@ -191,15 +193,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> иштеп баштоодо."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Ырастоо"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Жабуу"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Колдонуучу <xliff:g id="USER">%s</xliff:g>."</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">"Wifi өчүрүлдү."</string> @@ -211,8 +212,7 @@ <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> - <!-- no translation found for accessibility_quick_settings_dnd_none_on (6882582132662613537) --> - <skip /> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Тынчымды албагыла, жымжырт болсун."</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Тынчымды алба деген күйүк, ойготкучтар гана."</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"Тынчымды алба деген өчүк."</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"Тынчымды алба деген өчүрүлдү."</string> @@ -267,8 +267,7 @@ <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> - <!-- no translation found for quick_settings_dnd_none_label (5025477807123029478) --> - <skip /> + <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"Тымтырс"</string> <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"Bluetooth"</string> <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 өчүк"</string> @@ -335,23 +334,23 @@ <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 (3070506961866919502) --> - <skip /> + <string name="zen_priority_introduction" msgid="3070506961866919502">"Көрсөтүлгөн эскертүүлөрдөн, эскерткичтерден, окуялардан жана чалуучулардан тышкары башка үндөр жана дирилдөөлөр тынчыңызды албайт."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Ыңгайлаштыруу"</string> - <!-- no translation found for zen_silence_introduction (575422795504098868) --> - <skip /> + <string name="zen_silence_introduction" msgid="575422795504098868">"Ушуну менен эскертүүлөрдүн, музыканын, видеолордун жана оюндардын үндөрү жана дирилдөөлөрү сыяктуу нерселердин баары өчүрүлөт. Бирок телефон чала бересиз."</string> <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="8524949573675922138">"Ачуу үчүн кайра тийиңиз"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Кулпуну ачуу үчүн серпип коюңуз"</string> - <string name="phone_hint" msgid="3101468054914424646">"Телефонду колдонуу үчүн оңго серпип коюңуз"</string> - <string name="camera_hint" msgid="5241441720959174226">"Камераны ачуу үчүн солго серпип коюңуз"</string> - <!-- no translation found for interruption_level_none (6000083681244492992) --> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> <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> - <!-- no translation found for interruption_level_none_twoline (3957581548190765889) --> - <skip /> + <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> @@ -393,23 +392,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN\'ди өчүрүү"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN\'ди ажыратуу"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Түзмөгүңүздү <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат. Көбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Колдонмого VPN туташуусун орнотууга уруксат бердиңиз.\n\nБул колдонмо түзмөгүңүздү жана электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей алат."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Түзмөгүңүздү <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат.\n\nАдминистраторуңуз жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, түзмөгүңүзгө байланыштуу дайындарды жана түзмөгүңүздүн жайгашкан жери тууралуу маалыматты көзөмөлдөп жана башкара алат.\n\nСиз тармактагы жеке аракетиңизди көзөмөлдөй турган VPN\'ге туташкансыз.\n\nКөбүрөөк маалымат үчүн, администраторуңузга кайрылыңыз."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Жумуш профилиңизди <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат.\n\nАдминистраторуңуз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тескей алат.\n\nКөбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\nМындан тышкары, тармактагы аракеттериңизди тескей турган VPN\'ге да туташып турасыз."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактык аракеттерди тескей турган <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Электрондук почта, колдонмолор жана вебсайттар сыяктуу тармактагы жеке аракеттериңизди тескей турган <xliff:g id="APPLICATION">%1$s</xliff:g> колдонмосуна туташып турасыз."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Жумуш профилиңизди <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди тескей турган <xliff:g id="APPLICATION">%2$s</xliff:g> менен туташкан.\n\n Көбүрөөк маалымат алуу үчүн администраторуңузга кайрылыңыз."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Жумуш профилиңизди <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат. Ал электрондук почта, колдонмолор жана вебсайттар сыяктуу жумуш тармагыңыздагы аракеттерди тескей турган <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> менен туташкан.\n\n Мындан тышкары, тармактагы жеке аракеттериңизди тескеген <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> колдонмосуна туташып турасыз."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Түзмөгүңүздү <xliff:g id="ORGANIZATION">%1$s</xliff:g> башкарат.\nАдминистраторуңуз түзмөгүңүздөгү жөндөөлөрдү, корпоративдик мүмкүнчүлүктү, колдонмолорду, дайындарды, ошону менен катар жайгашкан жер дайындарын башкарып, тийиштүү маалыматты карай алат.\n\nСиз электрондук почталар, колдонмолор жана вебсайттар сыяктуу тармактагы аракеттериңизди тармактагы аракетиңизди тескей турган APPLICATION колдонмосуна туташып турасыз.\n<xliff:g id="APPLICATION">%2$s</xliff:g>Көбүрөөк маалымат алуу үчүн, администраторуңузга кайрылыңыз.\n\n"</string> <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> @@ -418,7 +409,10 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"Бардыгын көрүү"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"Баарын жашыруу"</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 (3179845345429841822) --> + <string name="volume_zen_end_now" msgid="3179845345429841822">"Азыр бүтүрүү"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Экран кадалган"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Бул бошотулмайынча көрүнө берет. Бошотуу үчүн, бир убакта Артка жана Карап чыгууну коё бербей басып туруңуз."</string> diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml index 6511f52e3b9c..dcae29172fe5 100644 --- a/packages/SystemUI/res/values-lo-rLA/strings.xml +++ b/packages/SystemUI/res/values-lo-rLA/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກແຜນຜັງໜ້າວຽກໃໝ່"</string> <string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"ກຳລັງເປີດ <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"ຢືນຢັນ"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ປິດ"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ຜູ່ໃຊ້ <xliff:g id="USER">%s</xliff:g>."</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">"ປິດ Wi-Fi ແລ້ວ."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"ການແຈ້ງເຕືອນທີ່ສຳຄັນໜ້ອຍກວ່າຢູ່ດ້ານລຸ່ມ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ແຕະອີກເທື່ອນຶ່ງເພື່ອເປີດ"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"ເລື່ອນຂຶ້ນເພື່ອປົດລັອກ"</string> - <string name="phone_hint" msgid="3101468054914424646">"ປັດຂວາເພື່ອໃຊ້ໂທລະສັບ"</string> - <string name="camera_hint" msgid="5241441720959174226">"ປັດຊ້າຍເພື່ອໃຊ້ກ້ອງ"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"ປິດການໃຊ້ VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"ຕັດການເຊື່ອມຕໍ່ VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"ອຸປະກອນຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g> . \n\n ຜູ້ຄວບຄຸມຂອງທ່ານສາມາດຕິດຕາມກວດກາ ແລະການຄຸ້ມຄອງການຕັ້ງຄ່າ, ແອັບການເຂົ້າຫາບໍລິສັດ, ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບອຸປະກອນຂອງທ່ານ, ແລະຂໍ້ມູນທີ່ຕັ້ງຂອງອຸປະກອນຂອງທ່ານ. ສໍາລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"ທ່ານໃຫ້ສິດອະນຸຍາດກັບແອັບເພື່ອຕັ້ງຄ່າການເຊື່ອມຕໍ່ VPN ແລ້ວ.\n\nແອັບນີ້ສາມາດຕິດຕາມອຸປະກອນ ແລະການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານໄດ້ , ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"ອຸປະກອນຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nຜູ້ຄວບຄຸມຂອງທ່ານສາມາດຕິດຕາມກວດກາ ແລະການຄຸ້ມຄອງການຕັ້ງຄ່າ, ແອັບການເຂົ້າຫາບໍລິສັດ, ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບອຸປະກອນຂອງທ່ານ, ແລະຂໍ້ມູນທີ່ຕັ້ງຂອງອຸປະກອນຂອງທ່ານ.\n\nທ່ານຍັງເຊື່ອມຕໍ່ກັບ VPN, ເຊິ່ງສາມາດຕິດຕາມກິດຈະກຳເຄືອຂ່າຍຂອງທ່ານ, ລວມທັງອີເມວ, ແອັບ, ແລະເວັບໄຊທ໌.\n\nສໍາລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"ໂປຣໄຟລ໌ວຽກຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nຜູ້ຄວບຄຸມຂອງທ່ານສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານໄດ້ ລວມທັງອີເມວ, ແອັບ, ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ.\n\nທ່ານຍັງເຊື່ອມຕໍ່ກັບ VPN, ເຊິ່ງສາມາດຕິດຕາມກິດຈະກຳເຄືອຂ່າຍຂອງທ່ານ."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"ທ່ານສາມາດເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%1$s</xliff:g> ໄດ້, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານໄດ້ ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"ທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%1$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານໄດ້, ລວມທັງອີເມວ, ແອັບ, ແລະເວັບໄຊທ໌."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"ເຄືອຂ່າຍຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ມັນເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%2$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ, ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ\n."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"ໂປຣໄຟລ໌ວຽກຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>. ມັນເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານ, ລວມທັງອີເມວ, ແອັບ ແລະເວັບໄຊທ໌.\nທ່ານຍັງເຊື່ອມຕໍ່ກັບ\n <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ນຳອີກ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍສ່ວນຕົວຂອງທ່ານໄດ້."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"ອຸປະກອນຂອງທ່ານຖືກຄຸ້ມຄອງໂດຍ <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nຜູ້ຄວບຄຸມຂອງທ່ານສາມາດຕິດຕາມກວດກາ ແລະການຄຸ້ມຄອງການຕັ້ງຄ່າ, ແອັບການເຂົ້າຫາບໍລິສັດ, ຂໍ້ມູນທີ່ກ່ຽວຂ້ອງກັບອຸປະກອນຂອງທ່ານ, ແລະຂໍ້ມູນທີ່ຕັ້ງຂອງອຸປະກອນຂອງທ່ານ.\n\nທ່ານເຊື່ອມຕໍ່ກັບ <xliff:g id="APPLICATION">%2$s</xliff:g> ແລ້ວ, ເຊິ່ງສາມາດຕິດຕາມການເຄື່ອນໄຫວເຄືອຂ່າຍຂອງທ່ານ, ລວມທັງອີເມວ, ແອັບ, ແລະເວັບໄຊທ໌.\n\nສຳລັບຂໍ້ມູນເພີ່ມເຕີມ, ຕິດຕໍ່ຜູ້ຄວບຄຸມຂອງທ່ານ."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Device will stay locked until you manually unlock"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"ຮັບເອົາການແຈ້ງເຕືອນໄວຂຶ້ນ"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"ເບິ່ງພວກມັນກ່ອນທ່ານຈະປົດລັອກ"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"ເຊື່ອງທັງຫມົດ"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ຢຸດດຽວນີ້"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ມັນຈະຮັກສາໜ້າຈໍໄວ້ໃນມຸມມອງຂອງທ່ານຈົນກວ່າທ່ານຈະຖອດໝຸດ. ແຕະປຸ່ມ ກັບຄືນ ແລະ ພາບຮວມ ຄ້າງໄວ້ພ້ອມກັນເພື່ອຖອດໝຸດ."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ມັນຈະຮັກສາໜ້າຈໍໄວ້ໃນມຸມມອງຂອງທ່ານຈົນກວ່າທ່ານຈະຖອດໝຸດ. ແຕະປຸ່ມ ພາບຮວມ ຄ້າງໄວ້ເພື່ອຖອດໝຸດ."</string> diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 9fbf0f10ebfb..31dd582f7194 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -85,9 +85,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Ieškoti"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparatas"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonas"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Atrakinti"</string> <string name="unlock_label" msgid="8779712358041029439">"atrakinti"</string> <string name="phone_label" msgid="2320074140205331708">"atidaryti telefoną"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -123,10 +127,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dvi „WiMAX“ signalo juostos."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Trys „WiMAX“ signalo juostos."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"„WiMAX“ signalas stiprus."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Atsijungta nuo eterneto."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Prijungta prie eterneto."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nėra signalo."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Neprijungta."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nė vienos juostos."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Atsisakyta programos „<xliff:g id="APP">%s</xliff:g>“."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Atsisakyta visų naujausių programų."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Paleidžiama <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"„<xliff:g id="APP">%1$s</xliff:g>“ <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pranešimo atsisakyta."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Pranešimų gaubtas."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Spartieji nustatymai."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Užrakinimo ekranas."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nustatymai"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Apžvalga."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Patvirtinti"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Uždaryti"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Naudotojas <xliff:g id="USER">%s</xliff:g>."</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">"„Wi-Fi“ ryšys išjungtas."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Mažiau skubūs pranešimai toliau"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Palieskite dar kartą, kad atidarytumėte"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Perbraukite aukštyn, kad atrakintumėte"</string> - <string name="phone_hint" msgid="3101468054914424646">"Perbraukite į dešinę, kad galėtumėte skambinti"</string> - <string name="camera_hint" msgid="5241441720959174226">"Perbraukite į kairę, kad būtų įjungtas fotoaparatas"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Visiška tyla"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Tik prioritetiniai"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Tik signalai"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Išjungti VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Atjungti VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Jūsų įrenginį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją. Daugiau informacijos galite gauti susisiekę su administratoriumi."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Suteikėte programai leidimą nustatyti VPN ryšį.\n\nŠi programa gali stebėti įrenginio ir tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Jūsų įrenginį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietos informaciją.\n\nEsate prisijungę prie VPN, kuris gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Jūsų darbo profilį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi.\n\nBe to, esate prisijungę prie VPN, kuris gali stebėti tinklo veiklą."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Esate prisijungę prie programos „<xliff:g id="APPLICATION">%1$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Esate prisijungę prie programos „<xliff:g id="APPLICATION">%1$s</xliff:g>“, kuri gali stebėti asmeninio tinklo veiklą, įskaitant el. laiškus, programas ir svetaines."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Jūsų darbo profilį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“. Jis susietas su programa „<xliff:g id="APPLICATION">%2$s</xliff:g>“, kuri gali stebėti darbo tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Jūsų darbo profilį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“. Jis susietas su programa „<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>“, kuri gali stebėti darbo tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nTaip pat esate prisijungę prie programos „<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>“, kuri gali stebėti asmeninio tinklo veiklą."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jūsų įrenginį tvarko „<xliff:g id="ORGANIZATION">%1$s</xliff:g>“.\n\nAdministratorius gali stebėti ir tvarkyti nustatymus, įmonės informacijos pasiekiamumo nustatymus, programas, su įrenginiu susietus duomenis ir įrenginio vietovės informaciją.\n\nEsate prisijungę prie programos „<xliff:g id="APPLICATION">%2$s</xliff:g>“, kuri gali stebėti tinklo veiklą, įskaitant el. laiškus, programas ir svetaines.\n\nDaugiau informacijos galite gauti susisiekę su administratoriumi."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Įrenginys liks užrakintas, kol neatrakinsite jo neautomatiniu būdu"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Greičiau gaukite pranešimus"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Peržiūrėti prieš atrakinant"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Slėpti viską"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Baigti dabar"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekranas prisegtas"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Tai bus rodoma, kol atsegsite. Kad atsegtumėte, tuo pačiu metu palieskite ir laikykite „Atgal“ ir „Apžvalga“."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Tai bus rodoma, kol atsegsite. Kad atsegtumėte, palieskite ir laikykite „Apžvalga“."</string> diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index e4c1884fd088..7a2679f9e371 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -84,9 +84,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Meklēt"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Tālruņa numurs"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Atbloķēt"</string> <string name="unlock_label" msgid="8779712358041029439">"atbloķēt"</string> <string name="phone_label" msgid="2320074140205331708">"atvērt tālruni"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -122,10 +126,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX divas joslas."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX trīs joslas."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX signāls pilns."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Pārtraukts savienojums ar tīklu Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Izveidots savienojums ar tīklu Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Nav signāla."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Savienojums nav izveidots."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nulle joslu"</string> @@ -167,15 +169,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Lietotne <xliff:g id="APP">%s</xliff:g> vairs netiek rādīta."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Visas nesen izmantotās lietojumprogrammas tika noņemtas."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Notiek lietotnes <xliff:g id="APP">%s</xliff:g> palaišana."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Paziņojums netiek rādīts."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Paziņojumu panelis"</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Ātrie iestatījumi"</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Bloķēšanas ekrāns."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Iestatījumi"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pārskats."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Apstiprināt"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Aizvērt"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Lietotājs: <xliff:g id="USER">%s</xliff:g>"</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">"Wi-Fi ir izslēgts."</string> @@ -316,8 +317,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Mazāk steidzami paziņojumi tiek rādīti tālāk"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Pieskarieties vēlreiz, lai atvērtu."</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Velciet uz augšu, lai atbloķētu"</string> - <string name="phone_hint" msgid="3101468054914424646">"Lai lietotu tālruni, velciet pa labi."</string> - <string name="camera_hint" msgid="5241441720959174226">"Lai lietotu kameru, velciet pa kreisi."</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Pilnīgs klusums"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Tikai prioritārie"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Tikai signāli"</string> @@ -363,23 +368,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Atspējot VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Atvienot VPN tīklu"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Jūsu ierīci pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu. Lai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Jūs piešķīrāt lietotnei atļauju izveidot savienojumu ar VPN tīklu.\n\nŠī lietotne var pārraudzīt jūsu ierīcē un tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Jūsu ierīci pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIerīcē ir izveidots savienojums ar VPN tīklu, kurā var tikt pārraudzītas jūsu tīklā veiktās darbības, tostarp e-pasts, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Jūsu darba profilu pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJūsu administrators var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru.\n\nIerīcē ir arī izveidots savienojums ar VPN tīklu, kurā var tikt pārraudzītas jūsu tīklā veiktās darbības."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Ir izveidots savienojums ar lietotni <xliff:g id="APPLICATION">%1$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Ir izveidots savienojums ar lietotni <xliff:g id="APPLICATION">%1$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās privātās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Jūsu darba profilu pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Tas ir saistīts ar lietojumprogrammu <xliff:g id="APPLICATION">%2$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Jūsu darba profilu pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Tas ir saistīts ar lietojumprogrammu <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nIr piesaistīta arī lietojumprogramma <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās privātās darbības."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Jūsu ierīci pārvalda <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nJūsu administrators var pārraudzīt un pārvaldīt iestatījumus, korporatīvo piekļuvi, lietotnes un datus, kas ir saistīti ar šo ierīci, kā arī informāciju par jūsu ierīces atrašanās vietu.\n\nIr piesaistīta lietojumprogramma <xliff:g id="APPLICATION">%2$s</xliff:g>, kas var pārraudzīt jūsu tīklā veiktās darbības, tostarp e-pasta ziņojumus, lietotnes un vietnes.\n\nLai iegūtu plašāku informāciju, sazinieties ar administratoru."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Ierīce būs bloķēta, līdz to manuāli atbloķēsiet."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Saņemiet paziņojumus ātrāk"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Skatiet tos pirms atbloķēšanas."</string> @@ -389,6 +386,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Slēpt visus"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Izslēgt"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekrāns ir piesprausts"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, vienlaikus pieskarieties vienumiem “Atpakaļ” un “Pārskats” un turiet tos nospiestus."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties vienumam “Pārskats” un turiet to nospiestu."</string> diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml index ee827d84b8fb..b8df53135dc6 100644 --- a/packages/SystemUI/res/values-mk-rMK/strings.xml +++ b/packages/SystemUI/res/values-mk-rMK/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> @@ -121,10 +125,8 @@ <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_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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Се стартува <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Потврди"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Затвори"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi е исклученo."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Долу се помалку итни известувања"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Допрете повторно за да отворите"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Повлечете за да се отклучи"</string> - <string name="phone_hint" msgid="3101468054914424646">"Повлечете надесно за телефон"</string> - <string name="camera_hint" msgid="5241441720959174226">"Повлечете налево за камера"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Оневозможи ВПН"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Исклучи ВПН"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Со вашиот уред управува <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративните пристапи, апликациите, податоците поврзани со вашиот уред и информациите за локација на уредот. За повеќе информации, контактирајте со администраторот."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Дозволивте апликацијата да постави поврзување преку ВПН.\n\nАпликацијата може да го следи уредот и активноста на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Со вашиот уред управува <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nВашиот администратор може да ги следи и да управува со поставките, корпоративните пристапи, апликациите, податоците поврзани со вашиот уред и информациите за локација на уредот.\n\nПоврзани сте со VPN што може да ја следи вашата мрежна активност, вклучувајќи е-пошта, апликации и веб-локации.\n\nЗа повеќе информации, контактирајте со администраторот."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот работен профил.\n\nАдминистратор е во можност да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот.\n\nИсто така, поврзани сте на ВПН, којашто може да ја следи вашата активност на мрежата."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"ВПН"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Поврзани сте на <xliff:g id="APPLICATION">%1$s</xliff:g>, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Поврзани сте на <xliff:g id="APPLICATION">%1$s</xliff:g>, којашто може да ја следи вашата лична активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот работен профил. Истиот е поврзан на <xliff:g id="APPLICATION">%2$s</xliff:g>, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\n.За повеќе информации, контактирајте со администраторот."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот работен профил. Истиот е поврзан на <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, којашто може да ја следи вашата работна активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nВие исто така сте поврзани на <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, којашто може да ја следи вашата лична активност на мрежата."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"<xliff:g id="ORGANIZATION">%1$s</xliff:g> управува со вашиот уред.\n\nВашиот администратор може да ги следи и да управува со параметрите, корпоративниот пристап, апликациите, податоците поврзани со уредот и информациите за локацијата на уредот.\n\nПоврзани сте на <xliff:g id="APPLICATION">%2$s</xliff:g>, којашто може да ја следи вашата активност на мрежата, вклучувајќи ги е-пораките, апликациите и веб-локациите.\n\nЗа повеќе информации, контактирајте со администраторот."</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Сокриј ги сите"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Заврши сега"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Екранот е прикачен"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ќе се гледа сè додека не го откачите. Допрете и држете Назад и Краток преглед истовремено за откачување."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ќе се гледа сè додека не го откачите. Допрете и држете Краток преглед за откачување."</string> diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml index e43ffb42e02c..615b1e221fb6 100644 --- a/packages/SystemUI/res/values-ml-rIN/strings.xml +++ b/packages/SystemUI/res/values-ml-rIN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string> <string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ആരംഭിക്കുന്നു."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"സ്ഥിരീകരിക്കുക"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"അടയ്ക്കുക"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ഉപയോക്താവ് <xliff:g id="USER">%s</xliff:g>."</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"ആവശ്യം കുറഞ്ഞ അറിയിപ്പുകൾ ചുവടെ നൽകിയിരിക്കുന്നു"</string> <string name="notification_tap_again" msgid="8524949573675922138">"തുറക്കുന്നതിന് വീണ്ടും സ്പർശിക്കുക"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"അൺലോക്കുചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക"</string> - <string name="phone_hint" msgid="3101468054914424646">"ഫോണിനായി വലതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string> - <string name="camera_hint" msgid="5241441720959174226">"ക്യാമറയ്ക്കായി ഇടതുവശത്ത് സ്വൈപ്പുചെയ്യുക"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN പ്രവർത്തനരഹിതമാക്കുക"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN വിച്ഛേദിക്കുക"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്.\n\nനിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും. കൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"VPN കണക്ഷൻ സജ്ജീകരിക്കാൻ നിങ്ങൾ ഒരു അപ്ലിക്കേഷന് അനുമതി നൽകി.\n\nഈ അപ്ലിക്കേഷന് നിങ്ങളുടെ ഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്സൈറ്റുകളും ഉൾപ്പെടെ, ഉപകരണത്തിന്റെയും നെറ്റ്വർക്കിന്റെയും പ്രവർത്തനം നിരീക്ഷിക്കാൻ കഴിയും."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്.\n\nനിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു VPN-ലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്.\n\nനിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർക്ക് ഇമെയിലുകളും അപ്ലിക്കേഷനുകളും സുരക്ഷിത വെബ്സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാൻ കഴിയും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക.\n\nനിങ്ങളുടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു VPN-ലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"നിങ്ങൾ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"നിങ്ങൾ <xliff:g id="APPLICATION">%1$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് ഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്. അത് <xliff:g id="APPLICATION">%2$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇതിന് ഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"നിങ്ങളുടെ ഔദ്യോഗിക പ്രൊഫൈൽ നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്. അത് <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> എന്നതിലേക്ക് കണക്റ്റുചെയ്തിരിക്കുന്നു, ഇതിന് ഇമെയിലുകൾ, അപ്ലിക്കേഷനുകൾ, വെബ്സൈറ്റുകൾ എന്നിവ ഉൾപ്പെടെ നിങ്ങളുടെ ഔദ്യോഗിക നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും.\n\nനിങ്ങൾ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> എന്നതിലേക്കും കണക്റ്റുചെയ്തിരിക്കുന്നു, അതിന് നിങ്ങളുടെ സ്വകാര്യ നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകും."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"നിങ്ങളുടെ ഉപകരണം നിയന്ത്രിക്കുന്നത് <xliff:g id="ORGANIZATION">%1$s</xliff:g> ആണ്.\n\nനിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർക്ക്, ഉപകരണവുമായി ബന്ധപ്പെട്ട ക്രമീകരണവും കോർപ്പറേറ്റ് ആക്സസ്സും അപ്ലിക്കേഷനുകളും വിവരവും ഒപ്പം ഉപകരണത്തിന്റെ ലൊക്കേഷൻ വിവരവും നിരീക്ഷിച്ച് നിയന്ത്രിക്കാനാകും.\n\nഇമെയിലുകളും അപ്ലിക്കേഷനുകളും വെബ്സൈറ്റുകളും ഉൾപ്പെടെയുള്ള നെറ്റ്വർക്ക് പ്രവർത്തനം നിരീക്ഷിക്കാനാകുന്ന ഒരു <xliff:g id="APPLICATION">%2$s</xliff:g> എന്നതിലേക്കും നിങ്ങൾ കണക്റ്റുചെയ്തിരിക്കുന്നു.\n\nകൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്മിനിസ്ട്രേറ്ററെ ബന്ധപ്പെടുക."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"എല്ലാം മറയ്ക്കുക"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ഇപ്പോള് അവസാനിപ്പിക്കുക"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"സ്ക്രീൻ പിൻ ചെയ്തു"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തുന്നു. അൺപിൻ ചെയ്യാൻ \'മടങ്ങുക\', \'ചുരുക്കവിവരണം\' എന്നിവ ഒരേ സമയം സ്പർശിച്ച് പിടിക്കുക."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തുന്നു. അൺപിൻ ചെയ്യുന്നതിന് \'ചുരുക്കവിവരണം\' സ്പർശിച്ചുപിടിക്കുക."</string> diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml index ce50758b9b49..e2bfc8d295bd 100644 --- a/packages/SystemUI/res/values-mn-rMN/strings.xml +++ b/packages/SystemUI/res/values-mn-rMN/strings.xml @@ -81,9 +81,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Шинэ ажиллах талбарыг сонгоно уу"</string> <string name="cancel" msgid="6442560571259935130">"Цуцлах"</string> @@ -119,10 +123,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet саллаа."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet холбогдсон."</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> @@ -164,15 +166,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>-г эхлүүлж байна."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Баталгаажуулах"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Хаах"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Хэрэглэгч <xliff:g id="USER">%s</xliff:g>."</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">"Wifi унтраасан."</string> @@ -313,8 +314,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Яаралтай биш мэдэгдлүүдийг доор"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Нээхийн тулд дахин хүрнэ үү"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Түгжээг тайлах бол шудрана уу"</string> - <string name="phone_hint" msgid="3101468054914424646">"Утас гаргахын тулд баруун шударна уу"</string> - <string name="camera_hint" msgid="5241441720959174226">"Камер гаргахын тулд зүүн шударна уу"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -360,23 +365,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN идэвхгүйжүүлэх"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN таслах"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Таны төхөөрөмж удирдагч <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nТаны админ таны төхөөрөмжтэй холбоотой тохиргоо, байгууллагын хандалт, мэдээлэл болон байршлын мэдээллийг удирдан, хяналт тавих боломжтой."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Та апп-д VPN холболт хийхийг зөвшөөрсөн байна.\n\n Энэхүү апп нь таны имэйл, апп, аюулгүй вэбсайт зэрэг төхөөрөмж болон сүлжээний үйл ажиллагааг хянах боломжтой."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Таны төхөөрөмжийн удирдагч <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nТаны админ таны төхөөрөмжтэй холбоотой тохиргоо, байгууллагын хандалт, мэдээлэл болон байршлын мэдээллийг удирдан, хяналт тавих боломжтой.\n\nТа таны имэйл, апп, вэб сайтын үйл ажиллагааг хянах VPN-д холбогдсон байна.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг.\n\nАдмин нь таны имэйл,апп болон вэбсайт зэрэг сүлжээний үйл ажиллагааг хянадаг. \n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу. \n\nМөн та VPN-д холбогдсон бөгөөд ингэснээр өөрийн сүлжээний үйл ажиллагааг хянах боломжтой байна."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд ингэснээр имэйл, апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Та <xliff:g id="APPLICATION">%1$s</xliff:g>-д холбогдсон бөгөөд ингэснээр имэйл, апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Таны ажлын профайлыг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь <xliff:g id="APPLICATION">%2$s</xliff:g>-тай холбогдсон бөгөөд таны имэйл, апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\nДэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Таны ажлын профайлы <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг. Энэ нь <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>-тай холбогдсон бөгөөд таны имэйл, апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\nМөн та <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>-д холбогдсон бөгөөд ингэснээр сүлжээний хувийн үйл ажиллагааг хянаж чадна."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Таны төхөөрөмжийг <xliff:g id="ORGANIZATION">%1$s</xliff:g> удирддаг.\n\n Танай админ төхөөрөмж, төхөөрөмжийн байршилтай холбоотой өгөгдлийг холбох, тохиргоог өөрчлөх болон хяналт тавих боломжтой.\n\nТа <xliff:g id="APPLICATION">%2$s</xliff:g>-тай холбогдсон бөгөөд ингэснээр таны имэйл,апп, аюулгүй вебсайт зэрэг сүлжээний үйл ажиллагаагаа хянах боломжтой.\n\n Дэлгэрэнгүй мэдээлэл авахыг хүсвэл админтайгаа холбогдоно уу."</string> <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> @@ -386,6 +383,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Бүгдийг нуух"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Одоо дуусгах"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Дэлгэц эхэнд байрлуулагдсан"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Таныг эхэнд нээхийг болиулах хүртэл харагдана. Хүрээд, Back дээр удаан дараад хаахдаа Overview-ийг дар"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Таныг эхэнд нээхийг болиулах хүртэл харагдана. Хаахын тулд хүрээдOverview-ийг дар"</string> diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml index ec88792e364d..b3ea98fafb2f 100644 --- a/packages/SystemUI/res/values-mr-rIN/strings.xml +++ b/packages/SystemUI/res/values-mr-rIN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string> <string name="cancel" msgid="6442560571259935130">"रद्द करा"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> प्रारंभ करीत आहे."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"पुष्टीकरण करा"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"बंद करा"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"वापरकर्ता <xliff:g id="USER">%s</xliff:g>."</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">"Wifi बंद झाले."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"खाली कमी तातडीच्या सूचना"</string> <string name="notification_tap_again" msgid="8524949573675922138">"उघडण्यासाठी पुन्हा स्पर्श करा"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"अनलॉक करण्यासाठी स्वाइप करा"</string> - <string name="phone_hint" msgid="3101468054914424646">"फोन साठी उजवीकडे स्वाइप करा"</string> - <string name="camera_hint" msgid="5241441720959174226">"कॅमेर्यासाठी डावीकडे स्वाइप करा"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN अक्षम करा"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN डिस्कनेक्ट करा"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"आपले डिव्हाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केलेले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबंधित सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो. अधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"आपण VPN कनेक्शन सेट करण्यासाठी अॅपला परवानगी दिली.\n\nहा अॅप ईमेल, अॅप्स आणि वेबसाइटसह, आपल्या डिव्हाइस आणि नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"आपले डिव्हाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केलेले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबंधित सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो. अधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा.\n\nआपण एका VPN शी देखील कनेक्ट केलेले आहे जो आपल्या ईमेल, अॅप्स आणि वेबसाइटसह आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे देखील परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"आपले कार्य प्रोफाईल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करण्यास सक्षम आहे.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा.\n\nआपण एका VPN शी देखील कनेक्ट केले आहे, जो आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"आपण <xliff:g id="APPLICATION">%1$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"आपण <xliff:g id="APPLICATION">%1$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"आपले कार्य प्रोफाईल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे. ते <xliff:g id="APPLICATION">%2$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"आपले कार्य प्रोफाईल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे. ते <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> शी कनेक्ट केले आहे, जे ईमेल, अॅप्स आणि वेबसाइटसह आपल्या कार्य नेटवर्क क्रियाकलापाचे परीक्षण करू शकते.\n\nआपण <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> शी देखील कनेक्ट केले आहे, जे आपल्या वैयक्तिक नेटवर्क क्रियाकलापाचे परीक्षण करू शकते."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"आपले डिव्हाइस <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारे व्यवस्थापित केले आहे.\n\nआपला प्रशासक आपल्या डिव्हाइसशी संबद्ध सेटिंग्ज, कॉर्पोरेट प्रवेश, अॅप्स, डेटा आणि आपल्या डिव्हाइसच्या स्थान माहितीचे परीक्षण करू शकतो आणि व्यवस्थापित करू शकतो.\n\nआपण <xliff:g id="APPLICATION">%2$s</xliff:g> शी कनेक्ट केले आहे, जो ईमेल, अॅप्स आणि वेबसाइटसह आपल्या नेटवर्क क्रियाकलापाचे परीक्षण करू शकतो.\n\nअधिक माहितीसाठी, आपल्या प्रशासकाशी संपर्क साधा."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"सर्व लपवा"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"आता समाप्त करा"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन केलेली आहे"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"हे आपण अनपिन करेपर्यंत दृश्यामध्ये ते ठेवते. अनपिन करण्यासाठी एकाच वेळी परत आणि अलीकडील ला स्पर्श करा आणि धरून ठेवा आणि विहंगावलोकन करा."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"हे आपण अनपिन करेपर्यंत दृश्यामध्ये ते ठेवते. अनपिन करण्यासाठी स्पर्श करा आणि धरून ठेवा."</string> diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml index a7a8a561a9d4..2a849916b3c5 100644 --- a/packages/SystemUI/res/values-ms-rMY/strings.xml +++ b/packages/SystemUI/res/values-ms-rMY/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Cari"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Buka kunci"</string> <string name="unlock_label" msgid="8779712358041029439">"buka kunci"</string> <string name="phone_label" msgid="2320074140205331708">"buka telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX dua bar."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX tiga bar."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Isyarat WiMAX penuh."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet diputuskan sambungan."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet disambungkan."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Tiada isyarat."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Tidak disambungkan."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Tiada bar."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ditolak."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Semua aplikasi terbaharu diketepikan."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Memulakan <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Pemberitahuan diketepikan."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bidai pemberitahuan."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tetapan pantas."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kunci skrin."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Tetapan"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Ikhtisar."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Sahkan"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Tutup"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Pengguna <xliff:g id="USER">%s</xliff:g>."</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">"Wifi dimatikan."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Pemberitahuan kurang penting di bawah"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Sentuh sekali lagi untuk membuka"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Leret ke atas untuk membuka kunci"</string> - <string name="phone_hint" msgid="3101468054914424646">"Leret ke kanan untuk telefon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Leret ke kiri untuk kamera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Senyap sepenuhnya"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Keutamaan sahaja"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Penggera sahaja"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Lumpuhkan VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Putuskan sambungan VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Peranti anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda. Untuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Anda memberikan kebenaran kepada apl untuk menyediakan sambungan VPN.\n\nApl ini boleh memantau aktiviti peranti dan rangkaian anda, termasuk e-mel, apl dan tapak web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Peranti anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke VPN, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, sila hubungi pentadbir anda."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Profil kerja anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nPentadbir anda boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda.\n\nAnda turut disambungkan ke VPN, yang boleh memantau aktiviti rangkaian anda."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Anda disambungkan ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Anda disambungkan ke <xliff:g id="APPLICATION">%1$s</xliff:g>, yang boleh memantau aktiviti rangkaian peribadi anda, termasuk e-mel, apl dan tapak web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Profil kerja anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil disambungkan ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian kerja anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Profil kerja anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Profil disambungkan ke <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nAnda turut disambungkan ke <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, yang boleh memantau aktiviti rangkaian peribadi anda."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Peranti anda diurus oleh <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nPentadbir anda boleh memantau dan mengurus tetapan, akses korporat, apl, data yang dikaitkan dengan peranti anda serta maklumat lokasi peranti anda.\n\nAnda disambungkan ke <xliff:g id="APPLICATION">%2$s</xliff:g>, yang boleh memantau aktiviti rangkaian anda, termasuk e-mel, apl dan tapak web.\n\nUntuk mendapatkan maklumat lanjut, hubungi pentadbir anda."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Peranti akan kekal terkunci sehingga anda membuka kunci secara manual"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Dapatkan pemberitahuan lebih cepat"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Lihat sebelum anda membuka kunci"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Sembunyikan semua"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Tamatkan sekarang"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skrin telah disemat"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ini akan memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh dan tahan Kembali dan Gambaran Keseluruhan pada masa yang sama untuk menyahsemat."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ini akan memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh dan tahan Gambaran Keseluruhan untuk menyahsemat."</string> diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml index 24f7b458cbe5..4e773608a128 100644 --- a/packages/SystemUI/res/values-my-rMM/strings.xml +++ b/packages/SystemUI/res/values-my-rMM/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string> <string name="cancel" msgid="6442560571259935130">"ထားတော့"</string> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"ဝိုင်မက်စ် ၂ ဘားရှိ"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"ဝိုင်မက်စ် ၃ ဘား"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"ဝိုင်မက်စ် အပြည့်ရှိ"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet နှင့်ချိတ်ဆက်မှုပြတ်တောက်"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet ချိတ်ဆက်ထား။"</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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>ကို စတင်နေသည်။"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g><xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"အတည်ပြုရန်"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ပိတ်ရန်"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"သုံးစွဲသူ <xliff:g id="USER">%s</xliff:g>."</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"အရေးပါမှု နည်းသည့် အကြောင်းကြားချက်များ အောက်မှာ"</string> <string name="notification_tap_again" msgid="8524949573675922138">"ဖွင့်ရန် ထပ်ပြီး ထိပါ"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"သော့ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string> - <string name="phone_hint" msgid="3101468054914424646">"ဖုန်း အတွက် ညာသို့ ပွတ်ဆွဲပါ"</string> - <string name="camera_hint" msgid="5241441720959174226">"ကင်မရာ အတွက် ဘယ်သို့ ပွတ်ဆွဲပါ"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -380,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"အားလုံး ဝှက်ထားရန်"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ယခု အဆုံးသတ်ရန်"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"သင်ပင်ဖြုတ်သည့် တိုင်အောင် ၎င်းအား မြင်ကွင်းတွင် ထားရှိပါမည်။ ပင်ဖြုတ်ရန် အနောက်နှင့် ခြုံငုံကြည့်ခြင်းကို ဖိ၍ နှိပ်ထားနိုင်သည်။"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"သင်ပင်ဖြုတ်သည့် တိုင်အောင် ၎င်းအား မြင်ကွင်းတွင် ထားရှိပါမည်။ ပင်ဖြုတ်ရန် ခြုံငုံကြည့်ခြင်းကို ဖိ၍ နှိပ်ထားနိုင်သည်။"</string> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index f416df96c903..675fc399a6a6 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Søk"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefonnummer"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås opp"</string> <string name="unlock_label" msgid="8779712358041029439">"lås opp"</string> <string name="phone_label" msgid="2320074140205331708">"åpne telefonen"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX – to stolper."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX – tre stolper."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Fullt WiMAX-signal."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet er frakoblet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet er tilkoblet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ikke noe signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ikke tilkoblet."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Ingen stolper."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> avvist."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle nylig brukte apper er avvist."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Starter <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Varselet ble skjult."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Varselskygge."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hurtiginnstillinger."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låseskjerm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Innstillinger"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Oversikt."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekreft"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Lukk"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Bruker: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi er slått av."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre presserende varsler nedenfor"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Trykk på nytt for å åpne"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Sveip oppover for å låse opp"</string> - <string name="phone_hint" msgid="3101468054914424646">"Sveip mot høyre for å åpne telefonen"</string> - <string name="camera_hint" msgid="5241441720959174226">"Sveip mot venstre for å åpne kameraet"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Total stillhet"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Bare prioritet"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Bare alarmer"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Deaktiver VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Koble fra VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Enheten din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon. Hvis du vil har mer informasjon, kan du ta kontakt med administratoren."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Du ga en app tillatelse til å konfigurere en VPN-tilkobling.\n\nDenne appen kan overvåke enheten og nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Enheten din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til et VPN, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nHvis du vil ha mer informasjon, kan du ta kontakt med administratoren."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Work-profilen din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratoren din kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren.\n\nDu er også koblet til et VPN, som kan overvåke nettverksaktiviteten din."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Enheten er koblet til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Enheten er koblet til <xliff:g id="APPLICATION">%1$s</xliff:g>, som kan overvåke den personlige nettverksaktiviteten din, inkludert e-post, apper og nettsteder."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Work-profilen din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er koblet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Work-profilen din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den er koblet til <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din på jobben, inkludert e-post, apper og nettsteder.\n\nDu er også koblet til <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan overvåke den personlige nettverksaktiviteten din."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Enheten din administreres av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratoren din kan overvåke og administrere innstillinger, bedriftstilgang, apper, data tilknyttet enheten din og enhetens posisjonsinformasjon.\n\nDu er koblet til <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan overvåke nettverksaktiviteten din, inkludert e-post, apper og nettsteder.\n\nFor mer informasjon, ta kontakt med administratoren."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Enheten forblir låst til du låser den opp manuelt"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Motta varsler raskere"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Se dem før du låser opp"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Skjul alle"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Avslutt nå"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skjermen er låst"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"På denne måten blir skjermen synlig frem til du låser den opp. Trykk på og hold inne Tilbake og Oversikt samtidig for å låse opp."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"På denne måten blir skjermen synlig frem til du låser den opp. Trykk på og hold inne Tilbake og Oversikt for å låse opp."</string> diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml index 43c29a9dfd89..6860d78dfca4 100644 --- a/packages/SystemUI/res/values-ne-rNP/strings.xml +++ b/packages/SystemUI/res/values-ne-rNP/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string> <string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"वाइम्याक्स दुईवटा बारहरू।"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"वाइम्याक्स तिनवटा बारहरू।"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"वाइम्याक्स सङ्केत भरिएका।"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>सुरु गर्दै।"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"पुष्टि गर्नुहोस्"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"बन्द गर्नुहोस्"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"प्रयोगकर्ता <xliff:g id="USER">%s</xliff:g>।"</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> @@ -308,19 +309,23 @@ <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> - <string name="zen_priority_introduction" msgid="3070506961866919502">"अलार्म, अनुस्मारक, घटना, र तपाईँले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईँ लाई वाधा गर्ने छैन।"</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"अलार्म, रिमाइन्डर, घटना, र तपाईँले निर्दिष्ट गर्नुहुने कलरहरू देखि बाहेक, आवाज र कम्पनले तपाईँ लाई वाधा गर्ने छैन।"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"अनुकूलन गर्नुहोस्"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"यसले अलार्म, संगीत, भिडियो, र खेलहरू देखि सहित सबै आवाज र कम्पन निषेध गर्छ। तपाईँ अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"यसले अलार्म, संगीत, भिडियो, र खेलहरू लगायतका सबै ध्वनि र कम्पन निषेध गर्छ। तपाईँ अझै पनि फोन कल गर्न सक्षम हुनुहुन्छ।"</string> <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="8524949573675922138">"खोल्न फेरि छुनुहोस्"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"अनलक गर्न स्वाप गर्नुहोस्"</string> - <string name="phone_hint" msgid="3101468054914424646">"फोनका लागि दाँया स्वाइप"</string> - <string name="camera_hint" msgid="5241441720959174226">"क्यामेराका लागि बाँया स्वाइप"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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_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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN असक्षम गर्नुहोस्"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"विच्छेद VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"तपाईँको यन्त्र <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईँको प्रशासकले सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ। थप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"तपाईँले VPN जडान गर्न अनुप्रयोगलाई अनुमति दिनुभयो।\n\nयो अनुप्रयोगले तपाईँको यन्त्र र तपाईँका इमेल, अनुप्रयोगहरू र वेबसाइटहरू लगायतका नेटवर्क गतिविधि अनुगमन गर्न सक्छ ।"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"तपाईँको यन्त्र <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थापन गरिन्छ।\n\n तपाईँको प्रशासकले सेटिङ्हरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, आफ्नो उपकरण सम्बन्धित डेटा, र उपकरणको स्थानीय जानकारीको अनुगमन तथा व्यवस्थापन गर्न सक्छ।\n\nतपाईँ VPN सँग जडित हुनुहुन्छ, जसले तपाईँको इमेल, अनुप्रयोगहरू, र वेबसाइटहरू सहित आफ्नो सञ्जाल गतिविधि अनुगमन गर्न सक्छ। \n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g>द्वारा व्यवस्थापन गरिन्छ।.\n\nतपाईँको प्रशासक इमेल, अनुप्रयोगहरू, र सुरक्षित वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्षम छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकसँग सम्पर्क राख्नुहोस्।\n\nतपाईँ VPN सँग पनि जडित हुनुहुन्छ, जसले तपाईँको नेटवर्क गतिविधि अनुगमन गर्न सक्छ।"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"तपाईँ <xliff:g id="APPLICATION">%1$s</xliff:g>सँग जडान हुनुभएको छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँका नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"तपाईँ<xliff:g id="APPLICATION">%1$s</xliff:g>सँग जडान हुनुभएको छ जसले इ-मेल, अनुप्रयोगहरू र वेबसाइट लगायतका तपाईँका व्यक्तिगत नेटवर्क गतिविधिको अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्तापन गरिन्छ। यो <xliff:g id="APPLICATION">%2$s</xliff:g> सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि, आफ्नो प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"तपाईँको कार्य प्रोफाइल <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थापन गरिन्छ। यो <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> सँग जोडिएको छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधि अनुगमन गर्न सक्छ।\n\nतपाईँ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> सँग पनि जडित हुनुहुन्छ, जसले तपाईँको व्यक्तिगत नेटवर्क गतिविधि अनुगमन गर्न सक्छ।"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"तपाईंको उपकरण <xliff:g id="ORGANIZATION">%1$s</xliff:g> द्वारा व्यवस्थित गरिन्छ।\n\nतपाईंको प्रशासकले तपाईँको यन्त्र र त्यसको स्थान जानकारीमार्फत सेटिङहरू, कर्पोरेट पहुँच, अनुप्रयोगहरू, तपाईँको यन्त्रसँग सम्बद्ध डेटा र तपाईँको यन्त्रको स्थान जानकारीको अनुगमन र व्यवस्थापन गर्न सक्छ।\n\nतपाईं <xliff:g id="APPLICATION">%2$s</xliff:g> सँग जडित हुनुहुन्छ जसले इमेल, अनुप्रयोगहरू, र वेबसाइटहरू लगायतका तपाईँका नेटवर्क गतिविधिका अनुगमन गर्न सक्छ।\n\nथप जानकारीको लागि तपाईको प्रशासकलाई सम्पर्क गर्नुहोस्।"</string> <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> @@ -387,7 +384,11 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"सबै हेर्नुहोस्"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"सबै लुकाउनुहोस्"</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> - <string name="volume_zen_end_now" msgid="3179845345429841822">"यतिखेरै अन्त्य गर्नुहोस्"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"अहिल्यै अन्त्य गर्नुहोस्"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"पर्दा राखेका छ"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"तपाईं अनपिन सम्म यो दृश्य मा राख्छ। छुनुहोस् र अनपिन फिर्ता र सिंहावलोकन नै समय मा पकड।"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"तपाईं अनपिन सम्म यो दृश्य मा राख्छ। छुनुहोस् र अनपिन गर्न सिंहावलोकन पकड।"</string> diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index c7c2d46a1f6f..937ac3442569 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Zoeken"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefoon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Ontgrendelen"</string> <string name="unlock_label" msgid="8779712358041029439">"ontgrendelen"</string> <string name="phone_label" msgid="2320074140205331708">"telefoon openen"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: twee streepjes."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: drie streepjes."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-signaal is op volle sterkte."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet-verbinding verbroken."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet verbonden."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Geen signaal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Niet verbonden."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Geen streepjes."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> verwijderd."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alle recente apps gesloten."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> starten."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Melding verwijderd."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Meldingenpaneel."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Snelle instellingen."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Vergrendelingsscherm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Instellingen"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overzicht."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bevestigen"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Sluiten"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Gebruiker: <xliff:g id="USER">%s</xliff:g>."</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">"Wifi uitgeschakeld."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Minder urgente meldingen onderaan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Raak opnieuw aan om te openen"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Veeg omhoog om te ontgrendelen"</string> - <string name="phone_hint" msgid="3101468054914424646">"Veeg naar rechts voor telefoon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Veeg naar links voor camera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Totale stilte"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Alleen prioriteit"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Alleen alarmen"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN uitschakelen"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Verbinding met VPN verbreken"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Uw apparaat wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nUw beheerder kan instellingen, bedrijfstoegang, apps, gegevens voor uw apparaat en locatiegegevens voor uw apparaat controleren en beheren. Neem voor meer informatie contact op met uw beheerder."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"U heeft een app toestemming gegeven voor het instellen van een VPN-verbinding.\n\nMet deze app kan uw apparaat- en netwerkactiviteit worden gecontroleerd, inclusief e-mails, apps en websites."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Uw apparaat wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nUw beheerder kan instellingen, bedrijfstoegang, apps, gegevens voor uw apparaat en locatiegegevens voor uw apparaat controleren en beheren.\n\nU bent verbonden met een VPN, die uw netwerkactiviteit kan controleren, waaronder e-mails, apps en websites.\n\nNeem voor meer informatie contact op met uw beheerder."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Uw werkprofiel wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nUw beheerder kan uw netwerkactiviteit controleren, inclusief e-mails, apps en websites.\n\nNeem contact op met uw beheerder voor meer informatie.\n\nU bent ook verbonden met een VPN waarmee uw netwerkactiviteit kan worden gecontroleerd."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"U bent verbonden met <xliff:g id="APPLICATION">%1$s</xliff:g> waarmee uw netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"U bent verbonden met <xliff:g id="APPLICATION">%1$s</xliff:g> waarmee uw persoonlijke netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Uw werkprofiel wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Deze is verbonden met <xliff:g id="APPLICATION">%2$s</xliff:g> waarmee uw werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met uw beheerder voor meer informatie."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Uw werkprofiel wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Deze is verbonden met <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> waarmee uw werkgerelateerde netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nU bent ook verbonden met <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> waarmee uw persoonlijke netwerkactiviteit kan worden gecontroleerd."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Uw apparaat wordt beheerd door <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nUw beheerder kan instellingen, zakelijke toegang, apps, gekoppelde apparaatgegevens en locatiegegevens voor uw apparaat controleren en beheren.\n\nU bent verbonden met <xliff:g id="APPLICATION">%2$s</xliff:g> waarmee uw netwerkactiviteit kan worden gecontroleerd, inclusief e-mails, apps en websites.\n\nNeem contact op met uw beheerder voor meer informatie."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Het apparaat blijft vergrendeld totdat u het handmatig ontgrendelt"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Sneller meldingen ontvangen"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Weergeven voordat u ontgrendelt"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Alles verbergen"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Nu uitschakelen"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Scherm is vastgezet"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Het scherm blijft zichtbaar totdat u het u losmaakt. Houd \'Terug\' en \'Overzicht\' tegelijkertijd aangeraakt om het los te maken."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Het scherm blijft zichtbaar totdat u het u losmaakt. Houd \'Overzicht\' aangeraakt om het los te maken."</string> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index d495e0c8ed46..1acd7b769593 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -85,9 +85,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Szukaj"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Aparat"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odblokuj"</string> <string name="unlock_label" msgid="8779712358041029439">"odblokuj"</string> <string name="phone_label" msgid="2320074140205331708">"otwórz telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -123,10 +127,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: dwa paski"</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: trzy paski"</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX: pełna moc sygnału"</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Rozłączono z siecią Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Połączono z siecią Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Brak sygnału."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nie połączono."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero pasków."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>: zamknięto."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Wszystkie ostatnie aplikacje zostały zamknięte."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Uruchamiam <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Zamknięto powiadomienie."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Obszar powiadomień."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Szybkie ustawienia."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ekran blokady."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ustawienia"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Przegląd."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potwierdź"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Zamknij"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Użytkownik: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi wyłączone."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Poniżej widać mniej pilne powiadomienia"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Kliknij ponownie, by otworzyć"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Przesuń w górę, by odblokować"</string> - <string name="phone_hint" msgid="3101468054914424646">"Przesuń w prawo, by przełączyć się na telefon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Przesuń w lewo, by włączyć aparat"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Całkowita cisza"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Tylko priorytetowe"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Tylko alarmy"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Wyłącz VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Rozłącz z VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Urządzeniem zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać. Skontaktuj się z nim, by dowiedzieć się więcej."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Aplikacja otrzymała od Ciebie uprawnienia do konfigurowania połączenia VPN.\n\nMoże ona monitorować Twoją aktywność na urządzeniu i w sieci, w tym e-maile, aplikacje i strony internetowe."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Urządzeniem zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z tym urządzeniem i informacje o lokalizacji urządzenia oraz nimi zarządzać.\n\nMasz połączenie z siecią VPN, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby uzyskać więcej informacji, skontaktuj się z administratorem."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Twoim profilem do pracy zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nSkontaktuj się z nim, by dowiedzieć się więcej.\n\nMasz też połączenie z siecią VPN, która może monitorować Twoją aktywność w sieci."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Masz połączenie z aplikacją <xliff:g id="APPLICATION">%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_app_personal" msgid="8506133233655324426">"Masz połączenie z aplikacją <xliff:g id="APPLICATION">%1$s</xliff:g>, która może monitorować Twoją prywatną aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Twoim profilem do pracy zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Jest on połączony z aplikacją <xliff:g id="APPLICATION">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Twoim profilem do pracy zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Jest on połączony z aplikacją <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci związaną z pracą, w tym e-maile, aplikacje i strony internetowe.\n\nMasz też połączenie z aplikacją <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, która może monitorować Twoją prywatną aktywność w sieci."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Twoim urządzeniem zarządza <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministrator może monitorować ustawienia, firmowe uprawnienia dostępu, aplikacje, dane powiązane z urządzeniem i informacje o jego lokalizacji oraz nimi zarządzać.\n\nMasz połączenie z aplikacją <xliff:g id="APPLICATION">%2$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe.\n\nAby dowiedzieć się więcej, skontaktuj się z administratorem."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Urządzenie pozostanie zablokowane, aż odblokujesz je ręcznie"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Szybszy dostęp do powiadomień"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Zobacz powiadomienia, jeszcze zanim odblokujesz ekran"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ukrywaj wszystkie"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Zakończ teraz"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran jest przypięty"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj jednocześnie Wstecz i Przegląd."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Przegląd."</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 112d74e0bb8a..669229eddab4 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Câmara"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telemóvel"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir telemóvel"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Duas barras de WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Três barras de WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Sinal WiMAX completo."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet desligada."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet ligada."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sem sinal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Sem ligação."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Zero barras."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ignorado."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todas as aplicações recentes foram ignoradas."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"A iniciar <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação ignorada."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Painel de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Definições rápidas."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecrã de bloqueio."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Definições"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Fechar"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizador <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi desligado."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tocar novamente para abrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Deslizar rapidamente com o dedo para cima para desbloquear"</string> - <string name="phone_hint" msgid="3101468054914424646">"Deslize rapidamente para a direita para aceder ao telemóvel"</string> - <string name="camera_hint" msgid="5241441720959174226">"Deslize rapidamente para a esquerda para aceder à câmara"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silêncio total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Apenas prioridade"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Apenas alarmes"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Desativar a VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desligar VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"O seu dispositivo é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo. Para obter mais informações, contacte o administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Websites."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"O seu dispositivo é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEncontra-se ligado a uma VPN, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a atividade da rede."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está ligado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Está ligado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está ligado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"O seu dispositivo é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador pode monitorizar e gerir as definições, o acesso empresarial, as aplicações, os dados associados ao dispositivo e as informações de localização do dispositivo.\n\nEstá ligado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado até ser desbloqueado manualmente"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Receber notificações mais rapidamente"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Ver antes de desbloquear"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar tudo"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Terminar agora"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"O ecrã está fixado"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Será mantido na vista até soltar. Toque sem soltar em Anterior e Vista geral em simultâneo para soltar."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Será mantido na vista até soltar. Toque sem soltar em Vista geral para soltar."</string> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index c778bd71c6c6..995eec4cdff3 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Pesquisar"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Câmera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefone"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Desbloquear"</string> <string name="unlock_label" msgid="8779712358041029439">"desbloquear"</string> <string name="phone_label" msgid="2320074140205331708">"abrir telefone"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Duas barras do WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Três barras do WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Sinal WiMAX completo."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet desconectada."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet conectada."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sem sinal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Sem conexão."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nenhuma barra."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> descartado."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Todos os apps recentes foram dispensados."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iniciando <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificação dispensada."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Aba de notificações."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Configurações rápidas."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Tela de bloqueio."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Configurações"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Visão geral."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmar"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Fechar"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Usuário <xliff:g id="USER">%s</xliff:g>."</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">"O Wi-Fi foi desativado."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificações menos urgentes abaixo"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Toque novamente para abrir"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Deslize para cima para desbloquear"</string> - <string name="phone_hint" msgid="3101468054914424646">"Deslize à direita p/ usar o telefone"</string> - <string name="camera_hint" msgid="5241441720959174226">"Deslize à esquerda p/ usar a câmera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Silêncio total"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Só prioridade"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Somente alarmes"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Desativar VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Desconectar VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao dispositivo e informações sobre a localização do dispositivo. Para mais informações, entre em contato com o administrador."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Você autorizou um app a configurar uma conexão VPN.\n\nEsse app pode monitorar seu dispositivo e atividades de rede, incluindo e-mails, apps e websites."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a uma VPN, a qual pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara mais informações, entre em contato com seu administrador.\n\nVocê também está conectado a uma VPN, a qual pode monitorar suas atividades de rede."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade na rede, incluindo e-mails, apps e websites."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Você está conectado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorar sua atividade pessoal na rede, incluindo e-mails, apps e websites."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar sua atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Seu perfil de trabalho é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Ele está conectado a <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorar suas atividades profissionais na rede, incluindo e-mails, apps e websites.\n\nVocê também está conectado a <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorar suas atividades pessoais na rede."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Seu dispositivo é gerenciado por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSeu administrador pode monitorar e gerenciar configurações, acesso corporativo, apps, dados associados ao seu dispositivo e informações sobre localização do dispositivo.\n\nVocê está conectado a <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorar suas atividades de rede, incluindo e-mails, apps e websites.\n\nPara ver mais informações, entre em contato com seu administrador."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado até que você o desbloqueie manualmente"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Receba notificações mais rápido"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Veja-as antes de desbloquear"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ocultar tudo"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Finalizar agora"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ela é mantida à vista até que seja liberada. Toque em \"Voltar\" e \"Visão Geral\" e mantenha essas opções pressionadas ao mesmo tempo para liberar."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ela é mantida à vista até que seja liberada. Toque em \"Visão geral\" e mantenha essa opção pressionada para liberar."</string> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 6ed4489a7cca..8046b8a70330 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -84,9 +84,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Căutați"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Cameră foto"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Deblocați"</string> <string name="unlock_label" msgid="8779712358041029439">"deblocați"</string> <string name="phone_label" msgid="2320074140205331708">"deschideți telefonul"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -122,10 +126,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX două bare."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX trei bare."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX semnal complet."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet deconectat."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet conectat."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Fără semnal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Neconectat."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nicio bară."</string> @@ -167,15 +169,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> a fost eliminată."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toate aplicațiile recente au fost închise."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Se inițiază <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Notificarea a fost închisă."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Fereastră pentru notificări."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Setări rapide."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Ecranul de blocare."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Setări"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Vizualizare generală"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Confirmați"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Închideți"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Utilizatorul <xliff:g id="USER">%s</xliff:g>."</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">"Conexiunea prin Wi-Fi este dezactivată."</string> @@ -316,8 +317,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Notificările mai puțin urgente mai jos"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Atingeți din nou pentru a deschide"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Glisați în sus pentru a debloca"</string> - <string name="phone_hint" msgid="3101468054914424646">"Glisați la dreapta pentru a acesa telefonul"</string> - <string name="camera_hint" msgid="5241441720959174226">"Glisați la stânga pentru a accesa camera foto"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Niciun sunet"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Numai cu prioritate"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Numai alarme"</string> @@ -363,23 +368,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Dezactivați conexiunea prin VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Deconectați rețeaua VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Dispozitivul este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului. Pentru mai multe informații, contactați administratorul."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Ați acordat unei aplicații permisiunea de a configura o conexiune VPN.\n\nAceastă aplicație poate monitoriza activitatea de pe dispozitiv și în rețea, inclusiv e-mailurile, aplicațiile și site-urile."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Dispozitivul este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la o rețea VPN, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Profilul de serviciu este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratorul poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul.\n\nDe asemenea, sunteți conectat(ă) la o rețea VPN, care vă poate monitoriza activitatea în rețea."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Sunteți conectat(ă) la <xliff:g id="APPLICATION">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Sunteți conectat(ă) la <xliff:g id="APPLICATION">%1$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua personală, inclusiv e-mailurile, aplicațiile și site-urile."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Profilul de serviciu este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este conectat la <xliff:g id="APPLICATION">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Profilul de serviciu este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Este conectat la <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua de serviciu, inclusiv e-mailurile, aplicațiile și site-urile.\n\nDe asemenea, sunteți conectat(ă) la <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, care vă poate monitoriza activitatea în rețeaua personală."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Dispozitivul este gestionat de <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratorul poate monitoriza și gestiona setările, accesul la rețeaua companiei, aplicațiile, datele asociate cu dispozitivul și informațiile privind locația dispozitivului.\n\nSunteți conectat(ă) la <xliff:g id="APPLICATION">%2$s</xliff:g>, care vă poate monitoriza activitatea în rețea, inclusiv e-mailurile, aplicațiile și site-urile.\n\nPentru mai multe informații, contactați administratorul."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Dispozitivul va rămâne blocat până când îl deblocați manual"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Obțineți notificări mai rapid"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Doresc să se afișeze înainte de deblocare"</string> @@ -389,6 +386,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ascundeți toate"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Opriți acum"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ecranul este fixat"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ecranul este afișat până anulați fixarea. Apăsați lung pe Înapoi și pe Vizualizare generală simultan pentru a anula fixarea."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ecranul este afișat până anulați fixarea. Apăsați lung pe Vizualizare generală pentru a anula fixarea."</string> diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 8bde24f10620..08ca544b8bb2 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -85,9 +85,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string> <string name="cancel" msgid="6442560571259935130">"Отмена"</string> @@ -123,10 +127,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Устройство отключено от Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Устройство подключено к Ethernet."</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> @@ -170,15 +172,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Запуск приложения <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Подтвердить"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Закрыть"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Пользователь <xliff:g id="USER">%s</xliff:g>"</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">"Модуль Wi-Fi отключен."</string> @@ -319,8 +320,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Показать менее важные оповещения"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Нажмите ещё раз, чтобы открыть"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Проведите вверх, чтобы разблокировать"</string> - <string name="phone_hint" msgid="3101468054914424646">"Чтобы позвонить, пролистните вправо"</string> - <string name="camera_hint" msgid="5241441720959174226">"Чтобы включить камеру, пролистните влево"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -366,23 +371,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Отключить VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Отключить VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Этим устройством управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения. За дополнительной информацией обратитесь к администратору."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Вы разрешили приложению подключаться к сети VPN.\n\nОно может отслеживать ваши действия на устройстве и в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Этим устройством управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nВы подключены к сети VPN, поэтому возможно отслеживание ваших действий в Интернете, включая работу с электронной почтой, приложениями и защищенными веб-сайтами.\n\nЗа дополнительной информацией обратитесь к администратору."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Вашим корпоративным профилем управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор может отслеживать ваши действия в Интернете, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к нему.\n\nУстройство также подключено к сети VPN, в которой возможно отслеживание ваших действий."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"Сеть VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Запущено приложение <xliff:g id="APPLICATION">%1$s</xliff:g>, которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Запущено приложение <xliff:g id="APPLICATION">%1$s</xliff:g>, которое может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Вашим корпоративным профилем управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Приложение <xliff:g id="APPLICATION">%2$s</xliff:g> может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Вашим корпоративным профилем управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nПриложения <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> и <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> могут отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Вашим корпоративным профилем управляет <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор может управлять настройками, корпоративным доступом, приложениями, данными на вашем устройстве, в том числе геоданными, а также просматривать соответствующие сведения.\n\nПриложение <xliff:g id="APPLICATION">%2$s</xliff:g> также может отслеживать ваши действия в сети, включая работу с электронной почтой, приложениями и веб-сайтами.\n\nЗа подробностями обратитесь к своему администратору."</string> <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> @@ -392,6 +389,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Скрыть все"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Завершить"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Блокировка в приложении включена"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Это приложение останется активным, пока вы не отмените блокировку, одновременно нажав кнопки \"Назад\" и \"Обзор\"."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Приложение останется активным, пока вы не отмените блокировку, одновременно нажав кнопки Назад и Обзор."</string> diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml index 2786b9d951f5..f3b6d0afba11 100644 --- a/packages/SystemUI/res/values-si-rLK/strings.xml +++ b/packages/SystemUI/res/values-si-rLK/strings.xml @@ -83,9 +83,11 @@ <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> <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> @@ -121,10 +123,8 @@ <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_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> @@ -166,15 +166,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ආරම්භ කරමින්."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"තහවුරු කරන්න"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"වසන්න"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"පරිශීලකයා <xliff:g id="USER">%s</xliff:g>."</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">"Wifi අක්රියයි."</string> @@ -315,8 +314,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"හදිසිය අඩු දැනුම් දීම් පහත"</string> <string name="notification_tap_again" msgid="8524949573675922138">"විවෘත කිරීමට නැවත ස්පර්ශ කරන්න"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"අගුළු ඇරීමට ස්වයිප් කරන්න."</string> - <string name="phone_hint" msgid="3101468054914424646">"දුරකථන සඳහා දකුණට ස්වයිප් කරන්න"</string> - <string name="camera_hint" msgid="5241441720959174226">"කැමරාව සඳහා දකුණට ස්වයිප් කරන්න"</string> + <string name="phone_hint" msgid="4872890986869209950">"දුරකථනය සඳහා නිරූපකය වෙතින් ස්වයිප් කරන්න"</string> + <string name="voice_hint" msgid="8939888732119726665">"හඬ සහාය සඳහා නිරූපකය වෙතින් ස්වයිප් කරන්න"</string> + <string name="camera_hint" msgid="7939688436797157483">"කැමරාව සඳහා නිරූපකය වෙතින් ස්වයිප් කරන්න"</string> <string name="interruption_level_none" msgid="6000083681244492992">"සම්පූර්ණ නිහඬතාව"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"ප්රමුඛතාව පමණයි"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"ඇඟවීම් පමණි"</string> @@ -380,6 +380,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"සියල්ල සඟවන්න"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"දැන් අවසන් කරන්න"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"දිග හරින්න"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"හකුළන්න"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"තීරය අමුණන ලදි"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ඔබ ගලවන තෙක් එය දර්ශනය තුළ මෙය තබයි. ගැලවීමට ආපසු සහ දළ විශ්ලේෂණය එකම වේලාවක ස්පර්ෂ කර අල්ලා සිටින්න."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ඔබ ගලවන තෙක් එය දර්ශනය තුළ මෙය තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ෂ කර අල්ලා සිටින්න."</string> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index c1f008805ee0..dadf388a19fc 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -85,9 +85,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Hľadať"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparát"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefón"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odomknúť"</string> <string name="unlock_label" msgid="8779712358041029439">"odomknúť"</string> <string name="phone_label" msgid="2320074140205331708">"otvoriť telefón"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -123,10 +127,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Dva stĺpce signálu siete WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Tri stĺpce signálu siete WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Plný signál siete WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Sieť ethernet je odpojená"</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Sieť ethernet je pripojená"</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Žiadny signál."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Nepripojené."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Žiadna čiarka."</string> @@ -170,15 +172,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikácia <xliff:g id="APP">%s</xliff:g> bola zrušená."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Všetky nedávne aplikácie boli odmietnuté."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Spúšťa sa aplikácia <xliff:g id="APP">%s</xliff:g>"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Upozornenie bolo zrušené."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Panel upozornení."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Rýchle nastavenia."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Uzamknutá obrazovka"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavenia"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Prehľad"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potvrdiť"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Zavrieť"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Používateľ: <xliff:g id="USER">%s</xliff:g>."</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">"Pripojenie Wi-Fi je vypnuté."</string> @@ -319,8 +320,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Menej naliehavé upozornenia sa nachádzajú nižšie"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Otvorte opätovným klepnutím"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Zariadenie odomknete prejdením prstom nahor"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefón otvoríte prejdením prstom doľava"</string> - <string name="camera_hint" msgid="5241441720959174226">"Fotoaparát otvoríte prejdením prstom doľava"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Úplné ticho"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Iba prioritné"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Iba budíky"</string> @@ -366,23 +371,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Deaktivovať VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Odpojiť sieť VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Vaše zariadenie spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje priradené k vášmu zariadeniu a informácie o polohe zariadenia. Ďalšie informácie získate od svojho správcu."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Určitej aplikácii ste udelili povolenie nastaviť pripojenie VPN.\n\nTáto aplikácia môže sledovať vaše zariadenie a aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Vaše zariadenie spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSprávca môže sledovať a spravovať nastavenia, firemný prístup, aplikácie a údaje priradené k vášmu zariadeniu a informácie o polohe zariadenia.\n\nSte tiež pripojený/-á k sieti VPN, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Váš pracovný profil spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSprávca môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu.\n\nSte tiež pripojený/-á k sieti VPN, ktorá môže sledovať vašu aktivitu v sieti."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Ste pripojený/-á k aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Ste pripojený/-á k aplikácii <xliff:g id="APPLICATION">%1$s</xliff:g>, ktorá môže sledovať vašu osobnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Váš pracovný profil spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je pripojený k aplikácii <xliff:g id="APPLICATION">%2$s</xliff:g>, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nĎalšie informácie získate od svojho správcu."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Váš pracovný profil spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Je pripojený k aplikácii <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ktorá môže sledovať vašu pracovnú aktivitu v sieti vrátane e-mailových správ, aplikácií a webových stránok.\n\nSte tiež pripojený/-á k aplikácii <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ktorá môže sledovať vašu súkromnú aktivitu v sieti."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Vaše zariadenie spravuje organizácia <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSprávca môže sledovať a spravovať nastavenia, podnikový prístup, aplikácie a údaje priradené k vášmu účtu, ako aj informácie o polohe zariadenia.\n\nSte pripojený/-á k aplikácii <xliff:g id="APPLICATION">%2$s</xliff:g>, ktorá môže sledovať vašu aktivitu v sieti vrátane e-mailových správ, aplikácii a webových stránok.\n\nĎalšie informácie získate od svojho správcu."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Zariadenie zostane uzamknuté, dokým ho ručne neodomknete."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Získavať upozornenia rýchlejšie"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Zobraziť pred odomknutím"</string> @@ -392,6 +389,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Skryť všetko"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Skončiť"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je pripnutá"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Ak ho chcete uvoľniť, stlačte a podržte súčasne tlačidlá Späť a Prehľad."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"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> diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index bd77ac916a30..be3e7be77fd7 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -85,9 +85,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Iskanje"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Fotoaparat"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Odkleni"</string> <string name="unlock_label" msgid="8779712358041029439">"odkleni"</string> <string name="phone_label" msgid="2320074140205331708">"odpri telefon"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -123,10 +127,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Signal WiMAX: dve črtici."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Signal WiMAX: tri črtice."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Poln signal WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernetna povezava je prekinjena."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernetna povezava je vzpostavljena."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ni signala."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ni povezan."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Nič črtic."</string> @@ -168,15 +170,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Aplikacija <xliff:g id="APP">%s</xliff:g> je bila odstranjena."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Vse nedavne aplikacije so bile opuščene."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Zaganjanje aplikacije <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Obvestilo je bilo odstranjeno."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Zaslon z obvestili."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hitre nastavitve."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Zaklenjen zaslon"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Nastavitve"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Pregled."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Potrdi"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Zapri"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Uporabnik: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi je izklopljen."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Manj nujna obvestila spodaj"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Dotaknite se znova, če želite odpreti"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Povlecite, da odklenete"</string> - <string name="phone_hint" msgid="3101468054914424646">"Povlecite v desno za telefon"</string> - <string name="camera_hint" msgid="5241441720959174226">"Povlecite v levo za fotoaparat"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Popolna tišina"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Samo prednostno"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Samo alarmi"</string> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Onemogoči VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Prekini povezavo z VPN-jem"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Napravo upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave. Če želite več informacij, se obrnite na skrbnika."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Aplikaciji ste dovolili vzpostavitev povezave z omrežjem VPN.\n\nTa aplikacija lahko nadzira napravo in omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Napravo upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z omrežjem VPN, ki lahko nadzira vašo omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Delovni profil upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika.\n\nPovezani ste tudi z omrežjem VPN, ki lahko nadzira omrežno dejavnost."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Povezani ste z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Povezani ste z aplikacijo <xliff:g id="APPLICATION">%1$s</xliff:g>, ki lahko nadzira vašo osebno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Delovni profil upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Delovni profil upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Povezan je z aplikacijo <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ki lahko nadzira vašo delovno omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nPovezani ste tudi z aplikacijo <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ki lahko nadzira vašo osebno omrežno dejavnost."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Napravo upravlja: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nSkrbnik lahko nadzira in upravlja nastavitve, dostop za podjetje, aplikacije, podatke, povezane z napravo, in podatke o lokaciji naprave.\n\nPovezani ste z aplikacijo <xliff:g id="APPLICATION">%2$s</xliff:g>, ki lahko nadzira omrežno dejavnost, vključno z e-pošto, aplikacijami in spletnimi mesti.\n\nČe želite več informacij, se obrnite na skrbnika."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Naprava bo ostala zaklenjena, dokler je ročno ne odklenete."</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Hitrejše prejemanje obvestil"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Oglejte si jih pred odklepanjem"</string> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Skrij vse"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Končaj zdaj"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je pripet"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"S tem ostane zaslon v pogledu, dokler ga ne odpnete. Hkrati pridržite tipko za nazaj in tipko za pregled, če ga želite odpeti."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"S tem ostane zaslon v pogledu, dokler ga ne odpnete. Pridržite tipko za pregled, če ga želite odpeti."</string> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 4e957713e8ab..f2f126e8b76c 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -84,9 +84,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Изабери нови распоред задатака"</string> <string name="cancel" msgid="6442560571259935130">"Откажи"</string> @@ -122,10 +126,8 @@ <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_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> @@ -167,15 +169,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Покрећемо <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Потврди"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Затвори"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Корисник: <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi је искључен."</string> @@ -316,8 +317,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Мање хитна обавештења су у наставку"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Додирните поново да бисте отворили"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Превуците нагоре да бисте откључали"</string> - <string name="phone_hint" msgid="3101468054914424646">"Превуците удесно за телефон"</string> - <string name="camera_hint" msgid="5241441720959174226">"Превуците улево за камеру"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -363,23 +368,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Онемогући VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Прекини везу са VPN-ом"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Уређајем управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима. Више информација потражите од администратора."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Дали сте дозволу апликацији да подешава VPN везу.\n\nТа апликација може да надгледа активности на уређају и мрежи, укључујући имејлове, апликације и веб-сајтове."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Уређајем управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте на VPN, који може да надгледа активности на мрежи, укључујући имејлове, апликације и безбедне веб-сајтове.\n\nВише информација потражите од администратора."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Профилом за Work управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора.\n\nПовезани сте и на VPN, који може да надгледа активности на личној мрежи."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Повезани сте са апликацијом <xliff:g id="APPLICATION">%1$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Повезани сте са апликацијом <xliff:g id="APPLICATION">%1$s</xliff:g>, која може да надгледа активности на личној мрежи, укључујући имејлове, апликације и веб-сајтове."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Профилом за Work управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Повезан је са апликацијом <xliff:g id="APPLICATION">%2$s</xliff:g>, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Профилом за Work управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Повезан је са апликацијом <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, која може да надгледа активности на пословној мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nПовезани сте и са апликацијом <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, која може да надгледа активности на личној мрежи."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Уређајем управља <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдминистратор може да надгледа подешавања, корпоративни приступ, апликације, податке повезане са уређајем и информације о локацији уређаја, као и да управља њима.\n\nПовезани сте са апликацијом <xliff:g id="APPLICATION">%2$s</xliff:g>, која може да надгледа активности на мрежи, укључујући имејлове, апликације и веб-сајтове.\n\nВише информација потражите од администратора."</string> <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> @@ -389,6 +386,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Сакриј све"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Прекини одмах"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Екран је закачен"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"На овај начин ово остаје приказано док га не откачите. Истовремено додирните и задржите Назад и Преглед да бисте га откачили."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"На овај начин ово остаје приказано док га не откачите. Додирните и задржите Преглед да бисте га откачили."</string> diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index b6574bedc59e..7aea1e8f17d1 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Sök"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Mobil"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Lås upp"</string> <string name="unlock_label" msgid="8779712358041029439">"lås upp"</string> <string name="phone_label" msgid="2320074140205331708">"öppna mobilen"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX: två staplar."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX: tre staplar."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX-signalen är full."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet har kopplats från."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet har anslutits."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ingen signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Inte ansluten."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Inga staplar."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> togs bort permanent."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Alla appar har tagits bort från listan Senaste."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Startar <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Meddelandet ignorerades."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Meddelandepanel."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Snabbinställningar."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Låsskärm."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Inställningar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Översikt."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Bekräfta"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Stäng"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Användare <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi har inaktiverats."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Mindre brådskande aviseringar nedan"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Tryck igen för att öppna"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Dra uppåt om du vill låsa upp"</string> - <string name="phone_hint" msgid="3101468054914424646">"Dra åt höger om du vill visa telefonen"</string> - <string name="camera_hint" msgid="5241441720959174226">"Dra åt vänster om du vill visa kameran"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Helt tyst"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Bara prioriterade"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Endast alarm"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Inaktivera VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Koppla från VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Enheten hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsinformation. Kontakta administratören om du vill veta mer."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Du har gett en app behörighet att upprätta en VPN-anslutning.\n\nAppen kan bevaka aktivitet på enheten och nätverket, inklusive e-post, appar och webbplatser."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Enheten hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratören kan övervaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsinformation.\n\nDu är ansluten till ett VPN-nätverk som kan övervaka dina nätverksaktiviteter, inklusive e-post, appar och webbplatser.\n\nKontakta administratören om du vill veta mer."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Jobbprofilen hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratören kan bevaka aktiviteten på nätverket, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information.\n\nDu är även ansluten till ett VPN-nätverk som kan bevaka aktiviteten på nätverket."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Du är ansluten till <xliff:g id="APPLICATION">%1$s</xliff:g> som kan bevaka aktivitet på nätverket, inklusive e-post, appar och webbplatser."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Du är ansluten till <xliff:g id="APPLICATION">%1$s</xliff:g> som kan bevaka din privata aktivitet på nätverket, inklusive e-post, appar och webbplatser."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Jobbprofilen hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den är ansluten till <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nKontakta administratören för mer information."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Jobbprofilen hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Den är ansluten till <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, som kan hantera aktivitet på arbetsplatsens nätverk, inklusive e-post, appar och webbplatser.\n\nDu är även ansluten till <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, som kan hantera privat aktivitet på nätverket."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Enheten hanteras av <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nAdministratören kan bevaka och hantera inställningar, företagsåtkomst, appar, data som är kopplad till enheten och enhetens platsuppgifter.\n\nDu är ansluten till <xliff:g id="APPLICATION">%2$s</xliff:g>, som kan övervaka aktivitet på nätverket, inklusive e-post. appar och webbplatser .\n\nKontakta administratören för mer information."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Enheten förblir låst tills du låser upp den manuellt"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Få aviseringar snabbare"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Visa dem innan du låser upp"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Dölj alla"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Sluta nu"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skärmen har fästs"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Detta visar skärmen tills du lossar den. Tryck länge på bakåtknappen och Översikt samtidigt om du vill lossa skärmen."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Detta visar skärmen tills du lossar den. Tryck länge på Översikt om du vill lossa skärmen."</string> diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index b6d0bf2ff123..7ee5705bc414 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Tafuta"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Simu"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Fungua"</string> <string name="unlock_label" msgid="8779712358041029439">"fungua"</string> <string name="phone_label" msgid="2320074140205331708">"fungua simu"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Pau mbili za WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Pau tatu za WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Ishara ya WiMAX imejaa."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethaneti imeondolewa."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethaneti imeunganishwa."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Hakuna mtandao"</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Haijaunganishwa."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Vipima mtandao sufuri."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> imeondolewa."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Programu za hivi majuzi zimeondolewa."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Inaanzisha <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Arifa imetupwa."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Kivuli cha arifa."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mipangilio ya haraka."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Skrini iliyofungwa."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Mipangilio"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Muhtasari."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Thibitisha"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Funga"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Mtumiaji <xliff:g id="USER">%s</xliff:g>."</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">"Wifi imezimwa."</string> @@ -310,13 +311,17 @@ <string name="description_direction_left" msgid="7207478719805562165">"Sogeza kushoto kwa <xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Hutasumbuliwa na sauti na mitetemo, isipokuwa kengele, vikumbusho, matukio na wapigaji simu utakaobainisha."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Badilisha kukufaa"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"Hii huzuia sauti na mitetemo YOTE, ikiwa na pamoja na inayotoka kwenye kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"Hatua hii huzuia sauti na mitetemo YOTE, ikiwa na pamoja na inayotoka kwenye kengele, muziki, video na michezo. Bado utaweza kupiga simu."</string> <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">"Arifa zisizo za dharura sana ziko hapo chini"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Gusa tena ili ufungue"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Telezesha kidole ili ufungue"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telezesha kidole kulia ili ufikie simu"</string> - <string name="camera_hint" msgid="5241441720959174226">"Telezesha kidole kushoto ili ufikie kamera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Kimya kabisa"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Kipaumbele tu"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Kengele pekee"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Zima VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Ondoa VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Kifaa chako kinasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. Kwa maelezo zaidi, wasiliana na msimamizi wako."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Uliruhusu programu isanidi muunganisho wa VPN.\n\nProgramu hii inaweza kufuatilia shughuli za kifaa na mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Kifaa chako kinasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako.\n\nUmeuganishwa kwenye VPN, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti.\n\n Kwa maelezo zaidi, wasiliana na msimamizi wako."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Wasifu wako wa kazini unasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. \n\nMsimamizi wako ana uwezo wa kufuatilia shughuli ya mtandao wako ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\nKwa maelezo zaidi, wasiliana na msimamizi wako.\n\nUmeunganishwa pia kwenye VPN, ambayo inaweza kufuatilia shughuli za mtandao wako."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Umeunganishwa kwenye <xliff:g id="APPLICATION">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Umeunganishwa kwenye <xliff:g id="APPLICATION">%1$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu na tovuti."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Wasifu wako wa kazini unasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Wasifu huu umeunganishwa kwa <xliff:g id="APPLICATION">%2$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti.\n\nKwa maelezo zaidi, wasiliana na msimamizi wako."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Wasifu wako wa kazini unasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Wasifu huu umeunganishwa na <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ambayo inaweza kufuatilia mtandao wako wa kazini, ikiwa ni pamoja na barua pepe, programu na tovuti. \n\n Wewe pia umeunganishwa na <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, ambayo inaweza kufuatilia shughuli za mtandao wako kibinafsi."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Kifaa chako kinasimamiwa na <xliff:g id="ORGANIZATION">%1$s</xliff:g>. \n\nMsimamizi wako anaweza kufuatilia na kudhibiti mipangilio, ufikiaji wa kampuni, programu, data inayohusiana na kifaa chako, na maelezo ya mahali kilipo kifaa chako. \n\n Umeuganishwa kwenye <xliff:g id="APPLICATION">%2$s</xliff:g>, ambayo inaweza kufuatilia shughuli ya mtandao wako, ikiwa ni pamoja na barua pepe, programu, na tovuti. \n\n Kwa maelezo zaidi, wasiliana na msimamizi wako."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Kifaa kitaendelea kuwa katika hali ya kufungwa hadi utakapokifungua mwenyewe"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Pata arifa kwa haraka"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Zitazame kabla hujafungua"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ficha zote"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Komesha sasa"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Skrini imebandikwa"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Hii itaendelea kuonyesha hadi ubandue. Gusa na ushikilie Nyuma na Muhtasari kwa wakati mmoja ili ubandue."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Hii itaendelea kuonyesha hadi uibandue. Gusa na ushikilie Muhtasari ili ubandue."</string> diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml index 7c5cea6f45e5..360e6755b5e4 100644 --- a/packages/SystemUI/res/values-ta-rIN/strings.xml +++ b/packages/SystemUI/res/values-ta-rIN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string> <string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ஐத் தொடங்குகிறது."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"உறுதிசெய்க"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"மூடு"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"பயனர் <xliff:g id="USER">%s</xliff:g>."</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> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"அவசர நிலைக் குறைவான அறிவிப்புகள் கீழே உள்ளன"</string> <string name="notification_tap_again" msgid="8524949573675922138">"திறக்க, மீண்டும் தட்டவும்"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"திறக்க, மேலே ஸ்வைப் செய்யவும்"</string> - <string name="phone_hint" msgid="3101468054914424646">"ஃபோனுக்கு, வலப்புறம் ஸ்வைப் செய்க"</string> - <string name="camera_hint" msgid="5241441720959174226">"கேமராவிற்கு இடப்புறம் ஸ்வைப் செய்க"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPNஐ முடக்கு"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPNஐத் துண்டி"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"சாதனத்தை நிர்வகிப்பவர்: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும். கூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"VPN இணைப்பை அமைக்க, பயன்பாட்டிற்கு அனுமதி வழங்கியுள்ளீர்கள்.\n\nமின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட, உங்கள் சாதனத்தையும் நெட்வொர்க் செயல்பாட்டையும் இந்தப் பயன்பாட்டினால் கண்காணிக்க முடியும்."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"சாதனத்தை நிர்வகிப்பவர்: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\nVPN இல் இணைக்கப்பட்டுள்ளதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் பாதுகாப்பான இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"உங்கள் பணி சுயவிவரத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nமின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை நிர்வாகியால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்.\n\nஉங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்கக்கூடிய VPN இலும் இணைக்கப்பட்டுள்ளீர்கள்."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"<xliff:g id="APPLICATION">%1$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளீர்கள். இந்தப் பயன்பாட்டால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டைக் கண்காணிக்க முடியும்."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"உங்கள் பணி சுயவிவரத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. <xliff:g id="APPLICATION">%2$s</xliff:g> உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"உங்கள் பணி சுயவிவரத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION">%1$s</xliff:g>. <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் பணியிட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nமேலும் <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> உடன் இணைக்கப்பட்டுள்ளதால், உங்கள் தனிப்பட்ட நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"சாதனத்தை நிர்வகிப்பது: <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nஉங்கள் நிர்வாகியால் அமைப்புகள், நிறுவன அணுகல், பயன்பாடுகள், சாதனத்துடன் தொடர்புடைய தரவு மற்றும் சாதனத்தின் இருப்பிடத் தகவல் ஆகியவற்றைக் கண்காணிக்கவும் நிர்வகிக்கவும் முடியும்.\n\n<xliff:g id="APPLICATION">%2$s</xliff:g> உடன் இணைக்கப்பட்டதால், மின்னஞ்சல்கள், பயன்பாடுகள் மற்றும் இணையதளங்கள் உட்பட உங்கள் நெட்வொர்க் செயல்பாட்டை அதனால் கண்காணிக்க முடியும்.\n\nகூடுதல் தகவலுக்கு, நிர்வாகியைத் தொடர்புகொள்ளவும்."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"எல்லாம் மறை"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"இப்போது முடி"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"திரை பொருத்தப்பட்டது"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"பொருத்தியதை விலக்கும்வரை இதைக் காட்சியில் வைக்கும். விலக்க, பின் மற்றும் மேலோட்டப் பார்வையை ஒரே நேரத்தில் தொட்டுப் பிடிக்கவும்."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"பொருத்தியதை விலக்கும்வரை இதைக் காட்சியில் வைக்கும். விலக்க, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string> diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml index 7d3ea0dc71d5..8b64b3a19f08 100644 --- a/packages/SystemUI/res/values-te-rIN/strings.xml +++ b/packages/SystemUI/res/values-te-rIN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string> <string name="cancel" msgid="6442560571259935130">"రద్దు చేయండి"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g>ని ప్రారంభిస్తోంది."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"నిర్ధారిస్తుంది"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"మూసివేస్తుంది"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"వినియోగదారు <xliff:g id="USER">%s</xliff:g>."</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> @@ -308,15 +309,19 @@ <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> - <string name="zen_priority_introduction" msgid="3070506961866919502">"మీరు పేర్కొనే అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు."</string> + <string name="zen_priority_introduction" msgid="3070506961866919502">"మీరు అలారాలు, రిమైండర్లు, ఈవెంట్లు మరియు పేర్కొనే కాలర్ల నుండి మినహా మరే ఇతర ధ్వనులు మరియు వైబ్రేషన్లతో మీకు అంతరాయం కలగదు."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"అనుకూలీకరించు"</string> <string name="zen_silence_introduction" msgid="575422795504098868">"ఇది అలారాలు, సంగీతం, వీడియోలు మరియు గేమ్లతో సహా అన్ని ధ్వనులు మరియు వైబ్రేషన్లను బ్లాక్ చేస్తుంది. మీరు ఇప్పటికీ ఫోన్ కాల్లు చేయగలుగుతారు."</string> <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="8524949573675922138">"తెరవడానికి మళ్లీ తాకండి"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"అన్లాక్ చేయడానికి ఎగువకు స్వైప్ చేయండి"</string> - <string name="phone_hint" msgid="3101468054914424646">"ఫోన్ కోసం కుడివైపుకి స్వైప్ చేయండి"</string> - <string name="camera_hint" msgid="5241441720959174226">"కెమెరా కోసం ఎడమవైపుకి స్వైప్ చేయండి"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPNని నిలిపివేయి"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPNను డిస్కనెక్ట్ చేయి"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"మీ పరికరం <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, మీ పరికరంతో అనుబంధించబడిన డేటా మరియు మీ పరికరం స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు. మరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"మీరు VPN కనెక్షన్ సెటప్ చేయడానికి ఒక అనువర్తనానికి అనుమతి ఇచ్చారు.\n\nఈ అనువర్తనం ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ పరికరం మరియు నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"మీ పరికరం <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహణలో ఉంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్లు, కార్పొరేట్ ప్రాప్యత, అనువర్తనాలు, మీ పరికరంతో అనుబంధించబడిన డేటా మరియు పరికరం స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు VPNకి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"మీ కార్యాలయ ప్రొఫైల్ను <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలరు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి.\n\nమీరు VPNకి కూడా కనెక్ట్ చేయబడ్డారు, ఇది మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"మీరు <xliff:g id="APPLICATION">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"మీరు <xliff:g id="APPLICATION">%1$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"మీ కార్యాలయ ప్రొఫైల్ను <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ <xliff:g id="APPLICATION">%2$s</xliff:g>కి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"మీ కార్యాలయ ప్రొఫైల్ను <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది. అలాగే, మీ కార్యాలయ ప్రొఫైల్ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>కి కనెక్ట్ చేయబడింది, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ కార్యాలయ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమీరు <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>కి కూడా కనెక్ట్ అయ్యారు, ఇది మీ వ్యక్తిగత నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"మీ పరికరాన్ని <xliff:g id="ORGANIZATION">%1$s</xliff:g> నిర్వహిస్తోంది.\n\nమీ నిర్వాహకుడు సెట్టింగ్లను, కార్పొరేట్ ప్రాప్యతను, అనువర్తనాలను, మీ పరికరంతో అనుబంధించిన డేటాను మరియు మీ పరికర స్థాన సమాచారాన్ని పర్యవేక్షించగలరు మరియు నిర్వహించగలరు.\n\nమీరు <xliff:g id="APPLICATION">%2$s</xliff:g>కి కనెక్ట్ చేయబడ్డారు, ఇది ఇమెయిల్లు, అనువర్తనాలు మరియు వెబ్సైట్లతో సహా మీ నెట్వర్క్ కార్యాచరణను పర్యవేక్షించగలదు.\n\nమరింత సమాచారం కోసం, మీ నిర్వాహకుడిని సంప్రదించండి."</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"అన్నీ దాచిపెట్టు"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ఇప్పుడే ముగించు"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"స్క్రీన్ పిన్ చేయబడింది"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"ఇది మీరు అన్పిన్ చేసే వరకు దీన్ని వీక్షణలో ఉంచుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టిని ఒకేసారి తాకి, ఉంచండి."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"ఇది మీరు అన్పిన్ చేసే వరకు దీన్ని వీక్షణలో ఉంచుతుంది. అన్పిన్ చేయడానికి స్థూలదృష్టిని తాకి, ఉంచండి."</string> diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 4af239ed39ce..b1a695459450 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"เลือกรูปแบบงานใหม่"</string> <string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string> @@ -121,10 +125,8 @@ <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_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> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"กำลังเริ่มต้น <xliff:g id="APP">%s</xliff:g>"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"ยืนยัน"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"ปิด"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"ผู้ใช้ <xliff:g id="USER">%s</xliff:g>"</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">"ปิด Wi-Fi แล้ว"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"การแจ้งเตือนที่เร่งด่วนน้อยด้านล่าง"</string> <string name="notification_tap_again" msgid="8524949573675922138">"แตะอีกครั้งเพื่อเปิด"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"กวาดขึ้นเพื่อปลดล็อก"</string> - <string name="phone_hint" msgid="3101468054914424646">"กวาดไปทางขวาเพื่อใช้โทรศัพท์"</string> - <string name="camera_hint" msgid="5241441720959174226">"กวาดไปทางซ้ายเพื่อใช้กล้องถ่ายรูป"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"ปิดใช้ VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"ยกเลิกการเชื่อมต่อ VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"อุปกรณ์ของคุณได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ของคุณ และข้อมูลตำแหน่งของอุปกรณ์ สำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"คุณได้ให้สิทธิ์แอปในการตั้งค่าการเชื่อมต่อ VPN\n\nแอปนี้จะสามารถตรวจสอบอุปกรณ์และกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"อุปกรณ์ของคุณได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nผู้ดูแลระบบสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ของคุณ และข้อมูลตำแหน่งของอุปกรณ์\n\nคุณยังได้เชื่อมต่อกับ VPN ซึ่งสามารถตรวจสอบกิจกรรมเครือข่ายของคุณ รวมถึง อีเมล แอป และเว็บไซต์\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"โปรไฟล์งานได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nผู้ดูแลระบบของคุณสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ\n\nนอกจากนี้คุณยังมีการเชื่อมต่อ VPN ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายของคุณ"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"คุณเชื่อมต่อกับ <xliff:g id="APPLICATION">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึง อีเมล แอป และเว็บไซต์ได้"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"คุณเชื่อมต่อกับ <xliff:g id="APPLICATION">%1$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนบุคคลรวมถึงอีเมล แอป และเว็บไซต์ได้"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"โปรไฟล์งานได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g> โดยมีการเชื่อมต่อกับ <xliff:g id="APPLICATION">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"โปรไฟล์งานได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g> โดยมีการเชื่อมต่อกับ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nนอกจากนี้ คุณยังมีการเชื่อมต่อกับ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายส่วนบุคคลได้"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"อุปกรณ์ได้รับการจัดการโดย <xliff:g id="ORGANIZATION">%1$s</xliff:g>\n\nผู้ดูและรบบของคุณสามารถตรวจสอบและจัดการการตั้งค่า การเข้าถึงของบริษัท แอป ข้อมูลที่เชื่อมโยงกับอุปกรณ์ และข้อมูลตำแหน่งของอุปกรณ์ได้\n\nคุณมีการเชื่อมต่อกับ <xliff:g id="APPLICATION">%2$s</xliff:g> ซึ่งสามารถตรวจสอบกิจกรรมในเครือข่ายรวมถึงอีเมล แอป และเว็บไซต์ได้\n\nสำหรับข้อมูลเพิ่มเติม โปรดติดต่อผู้ดูแลระบบ"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"ซ่อนทั้งหมด"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ไม่ใช้แล้ว"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"ตรึงหน้าจอแล้ว"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"การดำเนินการนี้จะเปิดหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" พร้อมกันค้างไว้เพื่อเลิกตรึง"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"การดำเนินการนี้จะเปิดหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index 505b957f3cf3..7c8530cbf37d 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Hanapin"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Camera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telepono"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"I-unlock"</string> <string name="unlock_label" msgid="8779712358041029439">"i-unlock"</string> <string name="phone_label" msgid="2320074140205331708">"buksan ang telepono"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX na dalawang bar."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX na tatlong bar."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Puno ang signal ng WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Nadiskonekta ang Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Nakakonekta ang Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Walang signal."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Hindi nakakonekta."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Walang mga bar."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Hindi pinansin ang <xliff:g id="APP">%s</xliff:g>."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Na-dismiss ang lahat ng kamakailang application."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Sinisimulan ang <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Na-dismiss ang notification."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Notification shade."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Mga mabilisang setting."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Lock screen."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Mga Setting"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Overview"</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Kumpirmahin"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Isara"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"User na si <xliff:g id="USER">%s</xliff:g>."</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">"Na-off ang wifi."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Nasa ibaba ang mga notification na hindi masyadong mahalaga"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Pinduting muli upang buksan"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Mag-swipe pataas upang i-unlock"</string> - <string name="phone_hint" msgid="3101468054914424646">"Mag-swipe pakanan para sa telepono"</string> - <string name="camera_hint" msgid="5241441720959174226">"Mag-swipe pakaliwa para sa camera"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Ganap na katahimikan"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Priyoridad lang"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Mga alarm lang"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"I-disable ang VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Idiskonekta ang VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Pinapamahalaan ang iyong device ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMagagawa ng iyong administrator na subaybayan at pamahalaan ang iyong mga setting, corporate na access, mga app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device. Para sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Nagbigay ka ng pahitulot sa app upang mag-set up ng VPN na koneksyon.\n\nMaaaring subaybayan ng app na ito ang iyong aktibidad sa device at network, kabilang ang mga email, app at website."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Pinapamahalaan ang iyong device ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMagagawa ng iyong administrator na subaybayan at pamahalaan ang iyong mga setting, corporate na access, mga app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa isang VPN, na maaaring subaybayan ang iyong aktibidad sa network, kasama ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Pinapamahalaan ang iyong profile ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMay kakayahan ang iyong administrator sa pagsubaybay ng iyong aktibidad sa network kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator.\n\nNakakonekta ka rin sa isang VPN, na maaaring sumubaybay sa iyong aktibidad sa network."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Nakakonekta ka sa <xliff:g id="APPLICATION">%1$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network kabilang ang mga email, app at website."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Nakakonekta ka sa <xliff:g id="APPLICATION">%1$s</xliff:g>, na maaaring sumubaybay sa iyong personal na aktibidad sa network, kabilang ang mga email, app at website."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Pinapamahalaan ang iyong profile sa trabaho ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Nakakonekta ito sa <xliff:g id="APPLICATION">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Pinapamahalaan ang iyong profile sa trabaho ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Nakakonekta ito sa <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, na maaaring sumubaybay sa iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nNakakonekta ka rin sa <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, na maaaring sumubaybay sa iyong personal na aktibidad sa network."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Pinapamahalaan ang iyong device ng <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nMaaaring subaybayan at pamahalaan ng iyong administrator ang mga setting, corporate na access, app, data na nauugnay sa iyong device at ang impormasyon ng lokasyon ng iyong device.\n\nNakakonekta ka sa <xliff:g id="APPLICATION">%2$s</xliff:g>, na maaaring subaybayan ang iyong aktibidad sa network, kabilang ang mga email, app at website.\n\nPara sa higit pang impormasyon, makipag-ugnayan sa iyong administrator."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Mananatiling naka-lock ang device hanggang sa manu-mano mong i-unlock"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Kunin ang notification nang mas mabilis"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Tingnan ang mga ito bago ka mag-unlock"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Itago lahat"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Tapusin ngayon"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Naka-pin ang screen"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Pinapanatili nitong nasa view ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Pangkalahatang-ideya nang sabay upang mag-unpin."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Pinapanatili nitong nasa view ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Pangkalahatang-ideya upang mag-unpin."</string> diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index c77fc058963e..0ae2b11478e1 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Ara"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Kilidi aç"</string> <string name="unlock_label" msgid="8779712358041029439">"kilidi aç"</string> <string name="phone_label" msgid="2320074140205331708">"telefonu aç"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX iki çubuk."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX üç çubuk."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAX sinyali tam."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Ethernet bağlantısı kesildi."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet bağlandı."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Sinyal yok."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Bağlanmadı."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Sıfır çubuk."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> kaldırıldı."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Tüm son uygulamalar kapatıldı."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> başlatılıyor."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Bildirim kapatıldı."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bildirim gölgesi."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Hızlı ayarlar."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Kilit ekranı"</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Ayarlar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Genel Bakış."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Onayla"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Kapat"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Kullanıcı: <xliff:g id="USER">%s</xliff:g>."</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">"Kablosuz kapatıldı."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Daha az acil bildirimler aşağıdadır"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Açmak için tekrar dokunun"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Kilidi açmak için hızlıca yukarı kaydırın"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefon için sağa kaydırın"</string> - <string name="camera_hint" msgid="5241441720959174226">"Kamera için sola kaydırın"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Tamamen sessiz"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Yalnızca öncelikli"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Yalnızca alarmlar"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN\'yi devre dışı bırak"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN bağlantısını kes"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Cihazınız <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz; cihazınızla ilişkilendirilen ayarları, şirket erişimini, uygulamaları, verileri izleyebilir ve yönetebilir. Daha fazla bilgi için yöneticinize başvurun."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"VPN bağlantısı kurması için bir uygulamaya izin verdiniz.\n\nBu uygulama, cihazınızın yanı sıra e-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilir."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Cihazınız <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz cihazınızla ilişkilendirilen ayarları, şirket erişimini, uygulamaları, verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalar, uygulamalar ve web siteleri de dahil olmak üzere ağ etkinliğinizi izleyebilen bir VPN\'ye bağlısınız.\n\nDaha fazla bilgi için lütfen yöneticinize başvurun."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Cihazınız <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz; e-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilir.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun.\n\nAyrıca ağ etkinliğinizi izleyebilen bir VPN\'ye bağlısınız."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasına bağlısınız."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere kişisel ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%1$s</xliff:g> uygulamasına bağlısınız."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Çalışma profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasına bağlı.\n\nDaha fazla bilgi için yöneticinizle iletişim kurun."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Çalışma profiliniz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor. E-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> uygulamasına bağlı.\n\nAyrıca kişisel ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> uygulamasına bağlısınız."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Cihazınız <xliff:g id="ORGANIZATION">%1$s</xliff:g> tarafından yönetiliyor.\n\nYöneticiniz; ayarları, şirket erişimini, uygulamaları, cihazınızla ilişkilendirilmiş verileri ve cihazınızın konum bilgilerini izleyebilir ve yönetebilir.\n\nE-postalarınız, uygulamalarınız ve web siteleriniz dahil olmak üzere ağ etkinliğinizi izleyebilen <xliff:g id="APPLICATION">%2$s</xliff:g> uygulamasına bağlısınız.\n\nDaha fazla bilgi edinmek için yöneticinizle iletişim kurun."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Cihazınızın kilidini manuel olarak açmadıkça cihaz kilitli kalacak"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Bildirimleri daha hızlı alın"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Kilidi açmadan bildirimleri görün"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Tümünü gizle"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Şimdi sona erdir"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran sabitlendi"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Böylece siz sabitlemesini kaldırana kadar görüntülenmeye devam eder. Sabitlemeyi kaldırmak için Geri ve Genel Bakış öğesine aynı anda dokunun ve basılı tutun."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Böylece siz sabitlemesini kaldırana kadar görüntülenmeye devam eder. Sabitlemeyi kaldırmak için Genel Bakış\'a dokunun ve basılı tutun."</string> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 2afef6b7d310..a3776c3828d4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -85,9 +85,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string> <string name="cancel" msgid="6442560571259935130">"Скасувати"</string> @@ -123,10 +127,8 @@ <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_ethernet_disconnected" msgid="5896059303377589469">"Ethernet відключено."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Ethernet підключено."</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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Запуск додатка <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"Підтвердити"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Закрити"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Користувач <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi вимкнено."</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Менше термінових сповіщень нижче"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Торкніться знову, щоб відкрити"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Проведіть пальцем угору, щоб розблокувати"</string> - <string name="phone_hint" msgid="3101468054914424646">"Проведіть пальцем праворуч, щоб скористатися телефоном"</string> - <string name="camera_hint" msgid="5241441720959174226">"Проведіть пальцем ліворуч, щоб скористатися камерою"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Вимкнути VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Від’єднатися від мережі VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Вашим пристроєм керує <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, пов’язані з вашим пристроєм, а також геодані пристрою. Зв’яжіться з адміністратором, щоб дізнатися більше."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Ви дозволити додатку під’єднуватися до мережі VPN.\n\nЦей додаток може відстежувати вашу активність на пристрої та в мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Вашим пристроєм керує <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки й дані, пов’язані з вашим пристроєм, а також геодані пристрою.\n\nПристрій під’єднано до мережі VPN, постачальник послуг якої може відстежувати вашу активність у мережі, зокрема листування, роботу в додатках і на сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Вашим пристроєм керує організація <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдміністратор може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше.\n\nПристрій під’єднано до мережі VPN, у якій ваша активність може відстежуватись."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Ваш профіль під’єднано до додатка <xliff:g id="APPLICATION">%1$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Ваш профіль під’єднано до додатка <xliff:g id="APPLICATION">%1$s</xliff:g>, який може відстежувати вашу особисту активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Вашим робочим профілем керує організація <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Профіль під’єднано до додатка <xliff:g id="APPLICATION">%2$s</xliff:g>, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Вашим робочим профілем керує організація <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Профіль під’єднано до додатка <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, який може відстежувати вашу робочу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nВаш профіль також під’єднано до додатка <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, який може відстежувати вашу особисту активність у мережі."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Вашим пристроєм керує організація <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nАдміністратор може відстежувати та контролювати налаштування, корпоративний доступ, додатки, геодані й інші дані, пов’язані з вашим пристроєм.\n\nВаш профіль під’єднано до додатка <xliff:g id="APPLICATION">%2$s</xliff:g>, який може відстежувати вашу активність у мережі, зокрема в електронній пошті, додатках і на веб-сайтах.\n\nЗв’яжіться з адміністратором, щоб дізнатися більше."</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Сховати всі"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Закрити"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Екран закріплено"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Закріпить екран, щоб ви могли постійно його бачити, доки не відкріпите. Щоб відкріпити, одночасно натисніть і втримуйте кнопки \"Назад\" і \"Огляд\"."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Закріпить екран, щоб ви могли постійно його бачити, доки не відкріпите. Щоб відкріпити, натисніть і втримуйте кнопку \"Огляд\"."</string> diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml index 1e60c674acd8..46723f1f2b0c 100644 --- a/packages/SystemUI/res/values-ur-rPK/strings.xml +++ b/packages/SystemUI/res/values-ur-rPK/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string> <string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string> @@ -121,10 +125,8 @@ <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_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> @@ -148,7 +150,7 @@ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string> <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"Wi-Fi"</string> <string name="accessibility_no_sim" msgid="8274017118472455155">"کوئی SIM نہیں ہے۔"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"بلوٹوتھ ربط بنانا۔"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"بلوٹوتھ مربوط کرنا۔"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"ہوائی جہاز وضع۔"</string> <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"کیریئر نیٹ ورک تبدیل ہو رہا ہے۔"</string> <string name="accessibility_battery_level" msgid="7451474187113371965">"بیٹری <xliff:g id="NUMBER">%d</xliff:g> فیصد۔"</string> @@ -166,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> شروع ہو رہی ہے۔"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"توثیق کریں"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"بند کریں"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"صارف <xliff:g id="USER">%s</xliff:g>۔"</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">"Wifi کو آف کر دیا گیا۔"</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"کم اہم اطلاعات ذیل میں ہیں"</string> <string name="notification_tap_again" msgid="8524949573675922138">"کھولنے کیلئے دوبارہ ٹچ کریں"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"غیر مقفل کرنے کیلئے اوپر سوائپ کریں"</string> - <string name="phone_hint" msgid="3101468054914424646">"فون کیلئے دائیں سوائپ کریں"</string> - <string name="camera_hint" msgid="5241441720959174226">"کیمرہ کیلئے بائیں سوائپ کریں"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN کو غیر فعال کریں"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN کو غیر منسلک کریں"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"آپ کے آلہ کا نظم کیا جاتا ہے بذریعہ <xliff:g id="ORGANIZATION">%1$s</xliff:g>۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔ مزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"آپ نے ایک ایپ کو VPN کنکشن ترتیب دینے کی اجازت دی ہے۔\n\nیہ ایپ ای میلز، ایپس اور ویب سائٹس سمیت آپ کے آلہ اور نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"آپ کے آلہ کا نظم کیا جاتا ہے بذریعہ <xliff:g id="ORGANIZATION">%1$s</xliff:g>۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ ایک VPN سے منسلک ہیں، جو ای میلز، ایپس اور محفوظ ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔\n\nمزید معلومات کیلئے، اپنے منتظم سے رابطہ کریں۔"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"آپ کا دفتری پروفائل <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔\n\nآپ کا منتظم ای میلز، ایپس اور ویب سائٹس سیمت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔\n\nآپ ایک VPN سے بھی منسلک ہیں، جو آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"آپ <xliff:g id="APPLICATION">%1$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"آپ <xliff:g id="APPLICATION">%1$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس آپ کے نجی نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"آپ کا دفتری پروفائل <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔ یہ <xliff:g id="APPLICATION">%2$s</xliff:g> سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"آپ کا دفتری پروفائل <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔ یہ <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> سے منسلک ہے، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتا ہے۔\n\nآپ <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> سے بھی منسلک ہیں، جو آپ کے نجی نیٹ ورک کی سرگرمی کو مانیٹر کر سکتا ہے۔"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"آپ کا آلہ <xliff:g id="ORGANIZATION">%1$s</xliff:g> کے زیر انتظام ہے۔\n\nآپ کا منتظم ترتیبات، کارپوریٹ رسائی، ایپس، آپ کے آلہ سے وابستہ ڈیٹا اور آپ کے آلہ کے مقام کی معلومات کو مانیٹر اور ان کا نظم کر سکتا ہے۔\n\nآپ <xliff:g id="APPLICATION">%2$s</xliff:g> سے منسلک ہیں، جو ای میلز، ایپس اور ویب سائٹس سمیت آپ کے نیٹ ورک کی سرگرمی مانیٹر کر سکتی ہے۔\n\nمزید معلومات کیلئے اپنے منتظم سے رابطہ کریں۔"</string> <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> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"سبھی چھپائیں"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"ابھی ختم کریں"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"اسکرین پن کردہ ہے"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"یہ اس کو اس وقت تک منظر میں رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے واپس اور عمومی جائزہ کو ایک ساتھ ٹچ کریں اور پکڑ کر رکھیں۔"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"یہ اس کو اس وقت تک منظر میں رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے عمومی جائزہ کو ٹچ کریں اور پکڑ کر رکھیں۔"</string> diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml index 6f2454ddb4c3..621acde96956 100644 --- a/packages/SystemUI/res/values-uz-rUZ/strings.xml +++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml @@ -83,9 +83,11 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Izlash"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Kamera"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Telefon"</string> + <string name="accessibility_voice_assist_button" msgid="487611083884852965">"Ovozli yordam"</string> <string name="accessibility_unlock_button" msgid="128158454631118828">"Qulfdan chiqarish"</string> <string name="unlock_label" msgid="8779712358041029439">"qulfdan chiqarish"</string> <string name="phone_label" msgid="2320074140205331708">"telefonni ochish"</string> + <string name="voice_assist_label" msgid="3956854378310019854">"ovozli yordamni ochish"</string> <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> @@ -121,10 +123,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Ikkita ustunli WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Uchta ustunli WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"To‘liq signalli WiMAX."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Qurilma Ethernet tarmog‘idan uzildi."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Qurilma Ethernet tarmog‘iga ulandi."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Signal yo‘q."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Ulanmagan."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Signal ustuni yo‘q."</string> @@ -166,20 +166,19 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> olib tashlangan."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Yaqinda ishlatilgan barcha ilovalar olib tashlandi."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ishga tushirilmoqda."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Xabarnoma e‘tiborsiz qoldirildi."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Xabarnoma soyasi."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Tezkor sozlamalar."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Qulflash ekrani."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Sozlamalar"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Umumiy nazar."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Tasdiqlash"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Yopish"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Foydalanuvchi <xliff:g id="USER">%s</xliff:g>."</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">"Wi-Fi o‘chirildi."</string> <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"Wi-Fi yoqildi."</string> - <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"Uyali <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_mobile" msgid="4876806564086241341">"Mobil tarmoq: <xliff:g id="NETWORK">%3$s</xliff:g> (<xliff:g id="TYPE">%2$s</xliff:g>, <xliff:g id="SIGNAL">%1$s</xliff:g>)"</string> <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"Batareya <xliff:g id="STATE">%s</xliff:g>."</string> <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"Parvoz rejimi o‘chirilgan."</string> <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"Parvoz rejimi yoqilgan."</string> @@ -201,7 +200,7 @@ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"Joylashuv ma’lumotini yuborish yoqilgan."</string> <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"Joylashuv ma’lumotini yuborish o‘chirildi."</string> <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"Joylashuv ma’lumotini yuborish yoqildi."</string> - <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Signal <xliff:g id="TIME">%s</xliff:g> ga o‘rnatildi."</string> + <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"Uyg‘otkich signali <xliff:g id="TIME">%s</xliff:g> da chalinadi."</string> <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"Panelni yopish."</string> <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"Ko‘proq vaqt."</string> <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"Kamroq vaqt."</string> @@ -236,7 +235,7 @@ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"Ekran yotiq holatda aylanmaydigan qilindi."</string> <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"Ekran tik holatda aylanmaydigan qilindi."</string> <string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string> - <string name="start_dreams" msgid="7219575858348719790">"Tush kurish"</string> + <string name="start_dreams" msgid="7219575858348719790">"Ekran lavhasi"</string> <string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string> <string name="quick_settings_dnd_label" msgid="8735855737575028208">"Bezovta qilinmasin"</string> <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Faqat muhimlari"</string> @@ -267,7 +266,7 @@ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"Tarmoq mavjud emas"</string> <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi o‘chirilgan"</string> <string name="quick_settings_wifi_detail_empty_text" msgid="2831702993995222755">"Saqlangan tarmoqlar mavjud emas"</string> - <string name="quick_settings_cast_title" msgid="7709016546426454729">"Translatsiya"</string> + <string name="quick_settings_cast_title" msgid="7709016546426454729">"Wi-Fi monitor"</string> <string name="quick_settings_casting" msgid="6601710681033353316">"Translatsiya qilinmoqda"</string> <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nomsiz qurilma"</string> <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"Tarqatish uchun tayyor"</string> @@ -310,13 +309,14 @@ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> uchun chapga suring."</string> <string name="zen_priority_introduction" msgid="3070506961866919502">"Turli ovoz va tebranishlar endi sizni bezovta qilmaydi. Biroq uyg‘otkich signallari, eslatmalar, tadbirlar haqidagi bildirishnomalar va siz tanlagan abonentlardan kelgan qo‘ng‘iroqlar bundan mustasno."</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"Sozlash"</string> - <string name="zen_silence_introduction" msgid="575422795504098868">"U BARCHA ovoz va tebranishlar, jumladan, uyg‘otkich, musiqa va o‘yinlar ovozlarini o‘chirib qo‘yadi. Shunday bo‘lsa-da, bemalol qo‘ng‘iroqlarni amalga oshirishingiz mumkin."</string> + <string name="zen_silence_introduction" msgid="575422795504098868">"Ushbu rejimda BARCHA ovoz va tebranishlar, jumladan, uyg‘otkich signallari, musiqa va o‘yinlar ovozlari ham o‘chirib qo‘yiladi. Shunday bo‘lsa-da, qo‘ng‘iroqlarni bemalol amalga oshirishingiz mumkin."</string> <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">"Kam ahamiyatli bildirishnomalarni pastda ko‘rsatish"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Ochish uchun yana bosing"</string> - <string name="keyguard_unlock" msgid="8043466894212841998">"Qulfdan chiqarish uchun yuqoriga suring"</string> - <string name="phone_hint" msgid="3101468054914424646">"Telefonni ochish uchun o‘ngga"</string> - <string name="camera_hint" msgid="5241441720959174226">"Kamerani ochish uchun chapga suring"</string> + <string name="keyguard_unlock" msgid="8043466894212841998">"Qulfdan chiqarish uchun tepaga suring"</string> + <string name="phone_hint" msgid="4872890986869209950">"Telefonni ochish uchun ikonkani suring"</string> + <string name="voice_hint" msgid="8939888732119726665">"Ovozli yordamni ochish uchun ikonkani suring"</string> + <string name="camera_hint" msgid="7939688436797157483">"Kamerani ochish uchun ikonkani suring"</string> <string name="interruption_level_none" msgid="6000083681244492992">"Tinchlik saqlansin"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Faqat muhimlari"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Faqat signallar"</string> @@ -344,7 +344,7 @@ <string name="guest_notification_remove_action" msgid="8820670703892101990">"MEHMON HISOBINI O‘CHIRISH"</string> <string name="user_add_user_title" msgid="4553596395824132638">"Yangi foyd-chi qo‘shilsinmi?"</string> <string name="user_add_user_message_short" msgid="2161624834066214559">"Yangi foydalanuvchi qo‘shilgach, o‘sha shaxs o‘z hududini sozlashi lozim bo‘ladi.\n\nHar qanday foydalanuvchi ilovalarni barcha foydalanuvchilar uchun yangilashi mumkin."</string> - <string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash yoqilgan"</string> + <string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash rejimi yoqildi"</string> <string name="battery_saver_notification_text" msgid="820318788126672692">"Unumdorlikni pasaytiradi va fonda int-dan foyd-ni cheklaydi"</string> <string name="battery_saver_notification_action_text" msgid="109158658238110382">"Quvvat tejash funksiyasini o‘chiring"</string> <string name="notification_hidden_text" msgid="1135169301897151909">"Kontent yashirildi"</string> @@ -362,23 +362,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"VPN tarmog‘ini o‘chirish"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ulanishini uzish"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Qurilmangiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlari hamda unga bog‘liq boshqa ma’lumotlarni boshqarishi mumkin. Ko‘proq ma’lumot olish uchun administrator bilan bog‘laning."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Siz ilovaga VPN tarmog‘iga ulanishga ruxsat bergansiz.\n\nUshbu ilova qurilmangiz va internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlar bilan ishlashingizni kuzatishi mumkin."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Qurilmangiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz Internetdagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlar bilan ishlashingizni kuzata oladigan VPN tarmog‘iga ham ulangansiz.\n\nKo‘proq ma’lumot olish uchun administrator bilan bog‘laning."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Sizning ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi.\n\nAdministrator internetdagi harakatlaringizni, jumladan, e-pochta, ilova va xavfsiz veb-saytlar bilan ishlashingizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning.\n\nShuningdek, siz VPN tarmog‘iga ham ulangansiz. U internetdagi harakatlaringizni kuzatishi mumkin."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirildi. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi ishga tushirildi. U internetdagi harakatlaringiz, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Sizning ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. U <xliff:g id="APPLICATION">%2$s</xliff:g> ilovasiga ulangan. Ushbu ilova ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Sizning ishchi profilingiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi. U <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ilovasiga ulangan. Ushbu ilova ish tarmog‘idagi harakatlaringizni, jumladan, e-pochta, ilova va veb-saytlardagi xatti-harakatlaringizni kuzatishi mumkin.\n\nShuningdek, siz <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g> ilovasiga ham ulangansiz. U shaxsiy tarmoqdagi harakatlaringizni kuzatishi mumkin."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Qurilmangiz <xliff:g id="ORGANIZATION">%1$s</xliff:g> tomonidan boshqariladi.\n\nAdministrator sozlamalar, korporativ kirish huquqi, ilovalar, qurilmangizdagi ma’lumotlar, jumladan, joylashuv ma’lumotlarini boshqarishi mumkin.\n\nShuningdek, siz <xliff:g id="APPLICATION">%2$s</xliff:g> ilovasiga ham ulangansiz. Ushbu ilova internetdagi harakatlaringizni, jumladan, e-pochta, ilovalar va veb-saytlar bilan ishlashingizni kuzata oladi.\n\nBatafsil ma’lumot olish uchun administrator bilan bog‘laning."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Qurilma qo‘lda qulfdan chiqarilmaguncha qulflangan holatda qoladi"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Bildirishnomalarni tezroq oling"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Ularni qulfdan chiqarishdan oldin ko‘ring"</string> @@ -387,7 +379,9 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"Barchasini ko‘rsatish"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"Barchasini yashirish"</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> - <string name="volume_zen_end_now" msgid="3179845345429841822">"Hozir tugatish"</string> + <string name="volume_zen_end_now" msgid="3179845345429841822">"Tugatish"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"Kengaytirish"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"Yig‘ish"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"Ekran qadaldi"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Ekran yechilmaguncha u qadalgan holatda qoladi. Uni yechish uchun “Orqaga” va “Umumiy nazar” tugmalarini bir vaqtda bosing va ushlab turing."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Ekran yechilmaguncha u qadalgan holatda qoladi. Uni yechish uchun “Umumiy nazar” tugmasini bosing va ushlab turing."</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 7bab592fa9ea..823d3bbfcd35 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Tìm kiếm"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Máy ảnh"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Điện thoại"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Mở khóa"</string> <string name="unlock_label" msgid="8779712358041029439">"mở khóa"</string> <string name="phone_label" msgid="2320074140205331708">"mở điện thoại"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAX hai vạch."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAX ba vạch."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Tín hiệu WiMAX đầy đủ."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"Đã ngắt kết nối Ethernet."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"Đã kết nối Ethernet."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Không có tín hiệu nào."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Chưa được kết nối."</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"0 vạch."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> đã bị loại bỏ."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Đã bỏ qua tất cả các ứng dụng gần đây."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Bắt đầu <xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Đã loại bỏ thông báo."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Bóng thông báo."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Cài đặt nhanh."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Màn hình khóa."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Cài đặt"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Tổng quan."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Xác nhận"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Đóng"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Người dùng <xliff:g id="USER">%s</xliff:g>."</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">"Đã tắt Wifi."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Thông báo ít khẩn cấp hơn bên dưới"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Chạm lại để mở"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Vuốt lên để mở khóa"</string> - <string name="phone_hint" msgid="3101468054914424646">"Vuốt sang phải để mở điện thoại"</string> - <string name="camera_hint" msgid="5241441720959174226">"Vuốt sang trái để mở máy ảnh"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Hoàn toàn tắt tiếng"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Chỉ ưu tiên"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Chỉ báo thức"</string> @@ -362,23 +367,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"Tắt VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"Ngắt kết nối VPN"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"Thiết bị của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng và dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị. Để biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"Bạn đã cấp cho ứng dụng quyền thiết lập kết nối VPN.\n\nỨng dụng này có thể giám sát hoạt động mạng và thiết bị của bạn, bao gồm email, ứng dụng và trang web."</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"Thiết bị của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nQuản trị viên của bạn có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với VPN, mạng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"Hồ sơ Android Work của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nQuản trị viên có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn.\n\nBạn cũng được kết nối với VPN, có thể giám sát hoạt động mạng của bạn."</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"Bạn đang kết nối với <xliff:g id="APPLICATION">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn bao gồm email, ứng dụng và trang web."</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"Bạn đang kết nối với <xliff:g id="APPLICATION">%1$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng cá nhân của bạn bao gồm email, ứng dụng và trang web."</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"Hồ sơ Android Work của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Hồ sơ Android Work được kết nối với <xliff:g id="APPLICATION">%2$s</xliff:g>, ứng dụng này có thể giám sát hoạt động mạng công việc của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"Hồ sơ Android Work của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>. Hồ sơ Android Work được kết nối với <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, ứng dụng này có thể giám sát hoạt động mạng công việc của bạn, bao gồm email, ứng dụng và trang web.\n\nBạn cũng được kết nối với <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, có thể giám sát hoạt động mạng cá nhân của bạn."</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"Thiết bị của bạn được quản lý bởi <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nQuản trị viên có thể giám sát và quản lý cài đặt, quyền truy cập của công ty, ứng dụng, dữ liệu được liên kết với thiết bị của bạn và thông tin về vị trí của thiết bị.\n\nBạn được kết nối với <xliff:g id="APPLICATION">%2$s</xliff:g>. Ứng dụng này có thể giám sát hoạt động mạng của bạn, bao gồm email, ứng dụng và trang web.\n\nĐể biết thêm thông tin, hãy liên hệ với quản trị viên của bạn."</string> <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"Thiết bị sẽ vẫn bị khóa cho tới khi bạn mở khóa theo cách thủ công"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"Nhận thông báo nhanh hơn"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"Xem thông báo trước khi bạn mở khóa"</string> @@ -388,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Ẩn tất cả"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Kết thúc bây giờ"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Màn hình được ghim"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Chạm và giữ nút Quay lại và Tổng quan cùng một lúc để bỏ ghim."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Chạm và giữ nút Quay lại để bỏ ghim."</string> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 9275dbd62355..1499d592fbb7 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"选择新的任务布局"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> @@ -121,10 +125,8 @@ <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_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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在启动<xliff:g id="APP">%s</xliff:g>。"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"确认"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"关闭"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"用户:<xliff:g id="USER">%s</xliff:g>。"</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">"WLAN已关闭。"</string> @@ -188,8 +189,7 @@ <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> - <!-- no translation found for accessibility_quick_settings_dnd_none_on (6882582132662613537) --> - <skip /> + <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"勿扰模式已开启,完全静音。"</string> <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"勿扰模式已开启,仅限闹钟。"</string> <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"勿扰模式关闭。"</string> <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"已关闭勿扰模式。"</string> @@ -244,8 +244,7 @@ <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> - <!-- no translation found for quick_settings_dnd_none_label (5025477807123029478) --> - <skip /> + <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> @@ -312,23 +311,23 @@ <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 (3070506961866919502) --> - <skip /> + <string name="zen_priority_introduction" msgid="3070506961866919502">"您将不会受声音和振动的打扰,但闹钟、提醒、活动和您指定的来电者除外。"</string> <string name="zen_priority_customize_button" msgid="7948043278226955063">"自定义"</string> - <!-- no translation found for zen_silence_introduction (575422795504098868) --> - <skip /> + <string name="zen_silence_introduction" msgid="575422795504098868">"这会阻止所有声音和振动(包括闹钟、音乐、视频和游戏)打扰您。您仍然可以拨打电话。"</string> <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="8524949573675922138">"再次触摸即可打开"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑动即可解锁"</string> - <string name="phone_hint" msgid="3101468054914424646">"向右滑动可打开拨号界面"</string> - <string name="camera_hint" msgid="5241441720959174226">"向左滑动可打开相机"</string> - <!-- no translation found for interruption_level_none (6000083681244492992) --> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> <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> - <!-- no translation found for interruption_level_none_twoline (3957581548190765889) --> - <skip /> + <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> @@ -370,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"关闭VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"断开VPN连接"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"您的设备由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。若要了解详情,请与您单位的管理员联系。"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"您已授权应用设置 VPN 连接。\n\n该应用可以监控您的设备和网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"您的设备由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到 VPN,此 VPN 也可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"您的工作资料由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您单位的管理员可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。\n\n此外,您还连接到了 VPN,此 VPN 也可以监控您的网络活动。"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"您已连接到<xliff:g id="APPLICATION">%1$s</xliff:g>,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"您已连接到<xliff:g id="APPLICATION">%1$s</xliff:g>,该应用可以监控您的个人网络活动,包括收发电子邮件、使用应用和浏览网站。"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"您的工作资料由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。您已连接到<xliff:g id="APPLICATION">%2$s</xliff:g>,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"您的工作资料由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。您已连接到<xliff:g id="APPLICATION_WORK">%2$s</xliff:g>,该应用可以监控您的工作网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n此外,您还连接到了<xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,该应用可以监控您的个人网络活动。"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的设备由以下单位管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您单位的管理员可以监控和管理与此设备相关的设置、企业权限、应用、数据以及设备位置信息。\n\n您已连接到<xliff:g id="APPLICATION">%2$s</xliff:g>,该应用可以监控您的网络活动,包括收发电子邮件、使用应用和浏览网站。\n\n若要了解详情,请与您单位的管理员联系。"</string> <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> @@ -395,7 +386,10 @@ <string name="notification_expand_button_text" msgid="1037425494153780718">"查看全部"</string> <string name="notification_collapse_button_text" msgid="6883253262134328057">"全部隐藏"</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 (3179845345429841822) --> + <string name="volume_zen_end_now" msgid="3179845345429841822">"立即结束"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"已固定屏幕"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"这将会固定显示此屏幕,直到您取消固定为止。触摸并同时按住“返回”和“概览”即可取消固定屏幕。"</string> diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index bcbcf98ffb61..0fc3f47de145 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -83,9 +83,11 @@ <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> <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> @@ -121,10 +123,8 @@ <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_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> @@ -168,15 +168,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g><xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"確認"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"關閉"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</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">"WiFi 已關閉。"</string> @@ -317,8 +316,9 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"不太緊急的通知會在下方顯示"</string> <string name="notification_tap_again" msgid="8524949573675922138">"再次輕觸即可開啟"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"向上快速滑動即可解鎖"</string> - <string name="phone_hint" msgid="3101468054914424646">"向右快速滑動即可使用手機功能"</string> - <string name="camera_hint" msgid="5241441720959174226">"向左快速滑動即可使用相機功能"</string> + <string name="phone_hint" msgid="4872890986869209950">"從圖示快速滑動即可使用手機功能"</string> + <string name="voice_hint" msgid="8939888732119726665">"從圖示快速滑動即可使用語音小幫手"</string> + <string name="camera_hint" msgid="7939688436797157483">"從圖示快速滑動即可使用相機功能"</string> <string name="interruption_level_none" msgid="6000083681244492992">"完全靜音"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"僅限優先"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"僅限鬧鐘"</string> @@ -364,23 +364,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"停用 VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"中斷 VPN 連線"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"您的裝置由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。如需更多資訊,請聯絡您的管理員。"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"您已授權應用程式設定 VPN 連線。\n\n這個應用程式可以監控您的裝置和網絡活動,包括電郵、應用程式和安全網站。"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"您的裝置由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,由於您的裝置連至 VPN,因此 VPN 服務供應商也能監控您的個人網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"您的裝置由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。\n\n您的管理員可以監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需瞭解更多資訊,請聯絡管理員。\n\n由於您的裝置連至 VPN,因此 VPN 服務供應商也可監控您的網絡活動。"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"您的裝置已連至 <xliff:g id="APPLICATION">%1$s</xliff:g> ,它可以監控您的網絡活動,包括電郵、應用程式及網站。"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"您的裝置已連至 <xliff:g id="APPLICATION">%1$s</xliff:g> ,它可以監控您的個人網絡活動,包括電郵、應用程式及網站。"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"您的公司檔案由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。它已連至 <xliff:g id="APPLICATION">%2$s</xliff:g> ,可以監控您的工作網絡活動,包括電郵、應用程式及網站。\n\n如需瞭解更多資訊,請聯絡管理員。"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"您的公司檔案由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。它已連至 <xliff:g id="APPLICATION_WORK">%2$s</xliff:g> ,可以監控您的工作網絡活動,包括電郵、應用程式及網站。\n\n此外,由於您的裝置也連至 <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,因此它也可監控您的個人網絡活動。"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的裝置由 <xliff:g id="ORGANIZATION">%1$s</xliff:g> 管理。\n\n您的管理員可以監控及管理您裝置的設定、企業存取、應用程式、資料及位置資訊。\n\n此外,您的裝置連至 <xliff:g id="APPLICATION">%2$s</xliff:g>,它能監控您的網絡活動,包括電郵、應用程式及網站。\n\n如需更多資訊,請聯絡您的管理員。"</string> <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> @@ -390,6 +382,8 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"全部隱藏"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"立即終止"</string> + <string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string> + <string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string> <string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"在您取消固定前,它會保持在檢視狀態。輕觸並同時按住 [返回] 和 [概覽],即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"在您取消固定前,它會保持在檢視狀態。輕觸並按住 [概覽] 即可取消固定。"</string> diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index 84d6c5e35714..4958481bf757 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -83,9 +83,13 @@ <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> <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> <string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string> <string name="cancel" msgid="6442560571259935130">"取消"</string> @@ -121,10 +125,8 @@ <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_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> @@ -168,15 +170,14 @@ <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> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在啟動「<xliff:g id="APP">%s</xliff:g>」。"</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$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_confirm" msgid="3446792278337969766">"確認"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"關閉"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"使用者:<xliff:g id="USER">%s</xliff:g>。"</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">"WiFi 已關閉。"</string> @@ -317,8 +318,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"較不緊急的通知會顯示在下方"</string> <string name="notification_tap_again" msgid="8524949573675922138">"再次輕觸即可開啟"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"向上滑動即可解鎖"</string> - <string name="phone_hint" msgid="3101468054914424646">"向右滑動可使用手機功能"</string> - <string name="camera_hint" msgid="5241441720959174226">"向左滑動可使用相機功能"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <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> @@ -364,23 +369,15 @@ <string name="disable_vpn" msgid="4435534311510272506">"停用 VPN"</string> <string name="disconnect_vpn" msgid="1324915059568548655">"中斷 VPN 連線"</string> <string name="monitoring_description_device_owned" msgid="5780988291898461883">"您的裝置由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。如需詳細資訊,請洽您的管理員。"</string> - <!-- no translation found for monitoring_description_vpn (996222259035614736) --> - <skip /> + <string name="monitoring_description_vpn" msgid="996222259035614736">"您已授權一個應用程式設定 VPN 連線。\n\n這個應用程式可以監控您的裝置和網路活動,包括收發電子郵件、使用應用程式和瀏覽網站。"</string> <string name="monitoring_description_vpn_device_owned" msgid="3090670777499161246">"您的裝置由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 VPN,您的網路活動也會受到 VPN 監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。"</string> - <!-- no translation found for monitoring_description_vpn_profile_owned (2054949132145039290) --> - <skip /> - <!-- no translation found for legacy_vpn_name (6604123105765737830) --> - <skip /> - <!-- no translation found for monitoring_description_app (6947928635272782570) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal (8506133233655324426) --> - <skip /> - <!-- no translation found for monitoring_description_app_work (808687576155832307) --> - <skip /> - <!-- no translation found for monitoring_description_app_personal_work (7711690793960304868) --> - <skip /> - <!-- no translation found for monitoring_description_vpn_app_device_owned (4970443827043261703) --> - <skip /> + <string name="monitoring_description_vpn_profile_owned" msgid="2054949132145039290">"您的 Work 設定檔由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您的管理員可以監控您的網路活動,包括收發電子郵件、使用應用程式及瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。\n\n同時,由於您的裝置已連線至 VPN,您的網路活動也會受到 VPN 監控。"</string> + <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string> + <string name="monitoring_description_app" msgid="6947928635272782570">"由於您已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string> + <string name="monitoring_description_app_personal" msgid="8506133233655324426">"由於您已連線至 <xliff:g id="APPLICATION">%1$s</xliff:g>,您的個人網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。"</string> + <string name="monitoring_description_app_work" msgid="808687576155832307">"您的 Work 設定檔由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。由於設定檔已連線至 <xliff:g id="APPLICATION">%2$s</xliff:g>,您的 Work 網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。"</string> + <string name="monitoring_description_app_personal_work" msgid="7711690793960304868">"您的 Work 設定檔由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。由於設定檔已連線至 <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>,您的工作網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n同時由於您也連線至 <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>,您的個人網路活動也會受到這個應用程式監控。"</string> + <string name="monitoring_description_vpn_app_device_owned" msgid="4970443827043261703">"您的裝置由下列機構管理:<xliff:g id="ORGANIZATION">%1$s</xliff:g>。\n\n您的管理員可以監控及管理與裝置相關的設定、企業網路存取權、應用程式和資料,以及裝置的位置資訊。\n\n由於您的裝置已連線至 <xliff:g id="APPLICATION">%2$s</xliff:g>,您的網路活動也會受到這個應用程式監控,包括收發電子郵件、使用應用程式和瀏覽網站。\n\n如需詳細資訊,請洽您的管理員。"</string> <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> @@ -390,6 +387,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"全部隱藏"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"立刻結束"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。同時按住返回按鈕和總覽按鈕即可取消固定。"</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住總覽按鈕即可取消固定。"</string> diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 3bc7919cf73d..689bc99a7326 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -83,9 +83,13 @@ <string name="accessibility_search_light" msgid="1103867596330271848">"Sesha"</string> <string name="accessibility_camera_button" msgid="8064671582820358152">"Ikhamela"</string> <string name="accessibility_phone_button" msgid="6738112589538563574">"Ifoni"</string> + <!-- no translation found for accessibility_voice_assist_button (487611083884852965) --> + <skip /> <string name="accessibility_unlock_button" msgid="128158454631118828">"Vula"</string> <string name="unlock_label" msgid="8779712358041029439">"vula"</string> <string name="phone_label" msgid="2320074140205331708">"vula ifoni"</string> + <!-- no translation found for voice_assist_label (3956854378310019854) --> + <skip /> <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> @@ -121,10 +125,8 @@ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"Amabha amabili we-WiMAX."</string> <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"Amabha amathathu we-WiMAX."</string> <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"Isiginali ye-WiMAX egcwele."</string> - <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) --> - <skip /> - <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) --> - <skip /> + <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"I-Ethernet inqanyuliwe."</string> + <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"I-Ethernet ixhunyiwe."</string> <string name="accessibility_no_signal" msgid="7064645320782585167">"Ayikho isignali."</string> <string name="accessibility_not_connected" msgid="6395326276213402883">"Akuxhunyiwe"</string> <string name="accessibility_zero_bars" msgid="3806060224467027887">"Amabha ayiqanda."</string> @@ -166,15 +168,14 @@ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ivaliwe."</string> <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Zonke izinhlelo zokusebenza zakamuva zicashisiwe."</string> <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Iqala i-<xliff:g id="APP">%s</xliff:g>."</string> - <!-- no translation found for accessibility_recents_task_header (1437183540924535457) --> - <skip /> + <string name="accessibility_recents_task_header" msgid="1437183540924535457">"<xliff:g id="APP">%1$s</xliff:g> <xliff:g id="ACTIVITY_LABEL">%2$s</xliff:g>"</string> <string name="accessibility_notification_dismissed" msgid="854211387186306927">"Isaziso sichithiwe."</string> <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"Umthunzi wesaziso."</string> <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"Izilingiselelo ezisheshayo."</string> <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"Khiya isikrini."</string> <string name="accessibility_desc_settings" msgid="3417884241751434521">"Izilungiselelo"</string> <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"Buka konke."</string> - <string name="accessibility_desc_confirm" msgid="3446792278337969766">"Qinisekisa"</string> + <string name="accessibility_desc_close" msgid="7479755364962766729">"Vala"</string> <string name="accessibility_quick_settings_user" msgid="1104846699869476855">"Umsebenzisi <xliff:g id="USER">%s</xliff:g>."</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">"I-Wifi ivaliwe."</string> @@ -315,8 +316,12 @@ <string name="speed_bump_explanation" msgid="1288875699658819755">"Izaziso ezingasheshi kakhulu ezingezansi"</string> <string name="notification_tap_again" msgid="8524949573675922138">"Thinta futhi ukuze uvule"</string> <string name="keyguard_unlock" msgid="8043466894212841998">"Swayiphela phezulu ukuze uvule"</string> - <string name="phone_hint" msgid="3101468054914424646">"Swayiphela ngakwesokudla ukuze uthole ifoni"</string> - <string name="camera_hint" msgid="5241441720959174226">"Swayiphela ngakwesokunxele ukuze uthole ikhamela"</string> + <!-- no translation found for phone_hint (4872890986869209950) --> + <skip /> + <!-- no translation found for voice_hint (8939888732119726665) --> + <skip /> + <!-- no translation found for camera_hint (7939688436797157483) --> + <skip /> <string name="interruption_level_none" msgid="6000083681244492992">"Ukuthula okuphelele"</string> <string name="interruption_level_priority" msgid="6426766465363855505">"Okubalulekile kuphela"</string> <string name="interruption_level_alarms" msgid="5226306993448328896">"Ama-alamu kuphela"</string> @@ -380,6 +385,10 @@ <string name="notification_collapse_button_text" msgid="6883253262134328057">"Fihla wonke"</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> <string name="volume_zen_end_now" msgid="3179845345429841822">"Qeda manje"</string> + <!-- no translation found for accessibility_volume_expand (5946812790999244205) --> + <skip /> + <!-- no translation found for accessibility_volume_collapse (3609549593031810875) --> + <skip /> <string name="screen_pinning_title" msgid="3273740381976175811">"Isikrini siphiniwe"</string> <string name="screen_pinning_description" msgid="1346522416878235405">"Lokhu kukugcina kubukeka uze ususe ukuphina. Thinta futhi ubambe u-Emuva no-Ukubuka konke ngesikhathi esisodwa ukuze ususe ukuphina."</string> <string name="screen_pinning_description_accessible" msgid="8518446209564202557">"Lokhu kukugcina kubukeka uze ususe ukuphina. Thinta futhi ubambe u-Ukubuka konke ukuze ususe ukuphina."</string> diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 7a108ed8883c..0dcbe884b30f 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -127,6 +127,7 @@ <color name="screen_pinning_request_bg">#ff009688</color><!-- deep teal 500 --> <color name="screen_pinning_request_window_bg">#80000000</color> + <color name="segmented_buttons_background">#14FFFFFF</color><!-- 8% white --> <color name="segmented_button_selected">#FFFFFFFF</color> <color name="segmented_button_unselected">#FFB0BEC5</color><!-- blue grey 200 --> @@ -141,4 +142,5 @@ <color name="zen_introduction_message_background">#ff009688</color><!-- deep teal 500 --> <color name="volume_icon_color">#ffffffff</color> <color name="volume_settings_icon_color">#7fffffff</color> + <color name="volume_slider_inactive">#FFB0BEC5</color><!-- blue grey 200 --> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index b0b78f2f374e..62e0f3dc16b2 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -188,7 +188,7 @@ <dimen name="qs_data_usage_text_size">14sp</dimen> <dimen name="qs_data_usage_usage_text_size">36sp</dimen> - <dimen name="segmented_button_spacing">8dp</dimen> + <dimen name="segmented_button_spacing">0dp</dimen> <dimen name="borderless_button_radius">2dp</dimen> <!-- How far the expanded QS panel peeks from the header in collapsed state. --> diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 8466a5a462f0..8606a599c97a 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -424,8 +424,8 @@ <string name="accessibility_desc_settings">Settings</string> <!-- Content description for the recent apps panel (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_desc_recent_apps">Overview.</string> - <!-- Content description for the confirm button in the zen mode panel introduction message. [CHAR LIMIT=NONE] --> - <string name="accessibility_desc_confirm">Confirm</string> + <!-- Content description for the close button in the zen mode panel introduction message. [CHAR LIMIT=NONE] --> + <string name="accessibility_desc_close">Close</string> <!-- Content description of the user tile in quick settings (not shown on the screen). [CHAR LIMIT=NONE] --> <string name="accessibility_quick_settings_user">User <xliff:g id="user" example="John Doe">%s</xliff:g>.</string> diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index c058d445770a..6709095961f4 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -166,6 +166,7 @@ <style name="TextAppearance.QS.SegmentedButton"> <item name="android:textSize">16sp</item> + <item name="android:fontFamily">sans-serif-medium</item> </style> <style name="TextAppearance.QS.DataUsage"> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index b5c1ca893686..ebb07a01301e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -33,6 +33,7 @@ import android.view.accessibility.AccessibilityEvent; import android.widget.ImageView; import android.widget.TextView; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.FontSizeUtils; import com.android.systemui.R; import com.android.systemui.qs.QSTile.DetailAdapter; @@ -182,8 +183,11 @@ public class QSPanel extends ViewGroup { public void setExpanded(boolean expanded) { if (mExpanded == expanded) return; mExpanded = expanded; + MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, mExpanded); if (!mExpanded) { closeDetail(); + } else { + logTiles(); } } @@ -243,6 +247,12 @@ public class QSPanel extends ViewGroup { } } + private void drawTile(TileRecord r, QSTile.State state) { + final int visibility = state.visible ? VISIBLE : GONE; + setTileVisibility(r.tileView, visibility); + r.tileView.onStateChanged(state); + } + private void addTile(final QSTile<?> tile) { final TileRecord r = new TileRecord(); r.tile = tile; @@ -251,9 +261,9 @@ public class QSPanel extends ViewGroup { final QSTile.Callback callback = new QSTile.Callback() { @Override public void onStateChanged(QSTile.State state) { - int visibility = state.visible ? VISIBLE : GONE; - setTileVisibility(r.tileView, visibility); - r.tileView.onStateChanged(state); + if (!r.openingDetail) { + drawTile(r, state); + } } @Override public void onShowDetail(boolean show) { @@ -365,9 +375,14 @@ public class QSPanel extends ViewGroup { mDetailContent.removeAllViews(); mDetail.bringToFront(); mDetailContent.addView(r.detailView); + MetricsLogger.visible(mContext, detailAdapter.getMetricsCategory()); setDetailRecord(r); listener = mHideGridContentWhenDone; + if (r instanceof TileRecord) { + ((TileRecord) r).openingDetail = true; + } } else { + MetricsLogger.hidden(mContext, mDetailRecord.detailAdapter.getMetricsCategory()); mClosingDetail = true; setGridContentVisibility(true); listener = mTeardownDetailWhenDone; @@ -387,9 +402,21 @@ public class QSPanel extends ViewGroup { } } mBrightnessView.setVisibility(newVis); + if (mGridContentVisible != visible) { + MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, newVis); + } mGridContentVisible = visible; } + private void logTiles() { + for (int i = 0; i < mRecords.size(); i++) { + TileRecord tileRecord = mRecords.get(i); + if (tileRecord.tile.getState().visible) { + MetricsLogger.visible(mContext, tileRecord.tile.getMetricsCategory()); + } + } + } + @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int width = MeasureSpec.getSize(widthMeasureSpec); @@ -539,6 +566,7 @@ public class QSPanel extends ViewGroup { int row; int col; boolean scanState; + boolean openingDetail; } private final AnimatorListenerAdapter mTeardownDetailWhenDone = new AnimatorListenerAdapter() { @@ -554,6 +582,7 @@ public class QSPanel extends ViewGroup { // If we have been cancelled, remove the listener so that onAnimationEnd doesn't get // called, this will avoid accidentally turning off the grid when we don't want to. animation.removeListener(this); + redrawTile(); }; @Override @@ -561,6 +590,15 @@ public class QSPanel extends ViewGroup { // Only hide content if still in detail state. if (mDetailRecord != null) { setGridContentVisibility(false); + redrawTile(); + } + } + + private void redrawTile() { + if (mDetailRecord instanceof TileRecord) { + final TileRecord tileRecord = (TileRecord) mDetailRecord; + tileRecord.openingDetail = false; + drawTile(tileRecord, tileRecord.tile.getState()); } } }; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java index b9574dc12ec3..3b217dfa9170 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTile.java @@ -24,11 +24,13 @@ import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Looper; import android.os.Message; +import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; import android.view.View; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.qs.QSTile.State; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.CastController; @@ -69,6 +71,15 @@ public abstract class QSTile<TState extends State> implements Listenable { abstract protected void handleClick(); abstract protected void handleUpdateState(TState state, Object arg); + /** + * Declare the category of this tile. + * + * Categories are defined in {@link com.android.internal.logging.MetricsLogger} + * or if there is no relevant existing category you may define one in + * {@link com.android.systemui.qs.QSTile}. + */ + abstract public int getMetricsCategory(); + protected QSTile(Host host) { mHost = host; mContext = host.getContext(); @@ -97,6 +108,7 @@ public abstract class QSTile<TState extends State> implements Listenable { View createDetailView(Context context, View convertView, ViewGroup parent); Intent getSettingsIntent(); void setToggleState(boolean state); + int getMetricsCategory(); } // safe to call from any thread diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java index 2bc31fc16326..49f8d1c20413 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java @@ -23,6 +23,7 @@ import android.content.IntentFilter; import android.net.ConnectivityManager; import android.provider.Settings.Global; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.GlobalSetting; import com.android.systemui.qs.QSTile; @@ -55,6 +56,7 @@ public class AirplaneModeTile extends QSTile<QSTile.BooleanState> { @Override public void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); setEnabled(!mState.value); mEnable.setAllowAnimation(true); mDisable.setAllowAnimation(true); @@ -85,6 +87,11 @@ public class AirplaneModeTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_AIRPLANEMODE; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_airplane_changed_on); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java index b42b5f63843a..ed954bba1b2c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java @@ -25,6 +25,7 @@ import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; @@ -75,6 +76,7 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { final boolean isEnabled = (Boolean)mState.value; + MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled); mController.setBluetoothEnabled(!isEnabled); } @@ -132,6 +134,11 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_BLUETOOTH; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_bluetooth_changed_on); @@ -177,11 +184,17 @@ public class BluetoothTile extends QSTile<QSTile.BooleanState> { @Override public void setToggleState(boolean state) { + MetricsLogger.action(mContext, MetricsLogger.QS_BLUETOOTH_TOGGLE, state); mController.setBluetoothEnabled(state); showDetail(false); } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_BLUETOOTH_DETAILS; + } + + @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { mItems = QSDetailItems.convertOrInflate(context, convertView, parent); mItems.setTagSuffix("Bluetooth"); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 5bf6fb5b5e5c..c06ea6617672 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -24,6 +24,7 @@ import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; import com.android.systemui.qs.QSDetailItems.Item; @@ -85,6 +86,7 @@ public class CastTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory()); showDetail(true); } @@ -113,6 +115,11 @@ public class CastTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_CAST; + } + + @Override protected String composeChangeAnnouncement() { if (!mState.value) { // We only announce when it's turned off to avoid vocal overflow. @@ -164,6 +171,11 @@ public class CastTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_CAST_DETAILS; + } + + @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { mItems = QSDetailItems.convertOrInflate(context, convertView, parent); mItems.setTagSuffix("Cast"); @@ -234,6 +246,7 @@ public class CastTile extends QSTile<QSTile.BooleanState> { @Override public void onDetailItemClick(Item item) { if (item == null || item.tag == null) return; + MetricsLogger.action(mContext, MetricsLogger.QS_CAST_SELECT); final CastDevice device = (CastDevice) item.tag; mController.startCasting(device); } @@ -241,6 +254,7 @@ public class CastTile extends QSTile<QSTile.BooleanState> { @Override public void onDetailItemDisconnect(Item item) { if (item == null || item.tag == null) return; + MetricsLogger.action(mContext, MetricsLogger.QS_CAST_DISCONNECT); final CastDevice device = (CastDevice) item.tag; mController.stopCasting(device); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java index 30f92b97346a..172133571215 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java @@ -24,6 +24,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.qs.QSTileView; @@ -75,6 +76,7 @@ public class CellularTile extends QSTile<QSTile.SignalState> { @Override protected void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory()); if (mDataController.isMobileDataSupported()) { showDetail(true); } else { @@ -118,6 +120,11 @@ public class CellularTile extends QSTile<QSTile.SignalState> { state.label); } + @Override + public int getMetricsCategory() { + return MetricsLogger.QS_CELLULAR; + } + // Remove the period from the network name public static String removeTrailingPeriod(String string) { if (string == null) return null; @@ -223,10 +230,16 @@ public class CellularTile extends QSTile<QSTile.SignalState> { @Override public void setToggleState(boolean state) { + MetricsLogger.action(mContext, MetricsLogger.QS_CELLULAR_TOGGLE, state); mDataController.setMobileDataEnabled(state); } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_DATAUSAGEDETAIL; + } + + @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { final DataUsageDetailView v = (DataUsageDetailView) (convertView != null ? convertView diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java index 4a33f552d564..c6fc6ffcb4d7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ColorInversionTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import android.provider.Settings.Secure; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.QSTile; @@ -86,6 +87,7 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); mSetting.setValue(mState.value ? 0 : 1); mEnable.setAllowAnimation(true); mDisable.setAllowAnimation(true); @@ -115,6 +117,11 @@ public class ColorInversionTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_COLORINVERSION; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java index 5145bc7cc37d..820579864982 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java @@ -29,6 +29,7 @@ import android.view.View; import android.view.View.OnAttachStateChangeListener; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.QSTile; @@ -88,12 +89,12 @@ public class DndTile extends QSTile<QSTile.BooleanState> { @Override public void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); if (mState.value) { mController.setZen(Global.ZEN_MODE_OFF, null, TAG); } else { int zen = Prefs.getInt(mContext, Prefs.Key.DND_FAVORITE_ZEN, Global.ZEN_MODE_ALARMS); mController.setZen(zen, null, TAG); - refreshState(zen); // this one's optimistic showDetail(true); } } @@ -135,6 +136,11 @@ public class DndTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_DND; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_dnd_changed_on); @@ -202,6 +208,7 @@ public class DndTile extends QSTile<QSTile.BooleanState> { @Override public void setToggleState(boolean state) { + MetricsLogger.action(mContext, MetricsLogger.QS_DND_TOGGLE, state); if (!state) { mController.setZen(Global.ZEN_MODE_OFF, null, TAG); showDetail(false); @@ -209,6 +216,11 @@ public class DndTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_DND_DETAILS; + } + + @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { final ZenModePanel zmp = convertView != null ? (ZenModePanel) convertView : (ZenModePanel) LayoutInflater.from(context).inflate( diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java index cb78debe0db3..0369ab59f175 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/FlashlightTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import android.app.ActivityManager; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.FlashlightController; @@ -62,6 +63,7 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements if (ActivityManager.isUserAMonkey()) { return; } + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); boolean newState = !mState.value; refreshState(newState ? UserBoolean.USER_TRUE : UserBoolean.USER_FALSE); mFlashlightController.setFlashlight(newState); @@ -84,6 +86,11 @@ public class FlashlightTile extends QSTile<QSTile.BooleanState> implements } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_FLASHLIGHT; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_flashlight_changed_on); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java index 6063f802e82e..f28a24b76172 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.qs.UsageTracker; @@ -69,6 +70,7 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { final boolean isEnabled = (Boolean) mState.value; + MetricsLogger.action(mContext, getMetricsCategory(), !isEnabled); mController.setHotspotEnabled(!isEnabled); mEnable.setAllowAnimation(true); mDisable.setAllowAnimation(true); @@ -97,6 +99,11 @@ public class HotspotTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_HOTSPOT; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_hotspot_changed_on); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java index 27365302daea..19f4df6ba06c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java @@ -29,6 +29,7 @@ import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.qs.QSTile; import java.util.Arrays; @@ -42,6 +43,7 @@ public class IntentTile extends QSTile<QSTile.State> { private PendingIntent mOnLongClick; private String mOnLongClickUri; private int mCurrentUserId; + private String mIntentPackage; private IntentTile(Host host, String action) { super(host); @@ -82,6 +84,7 @@ public class IntentTile extends QSTile<QSTile.State> { @Override protected void handleClick() { + MetricsLogger.action(mContext, getMetricsCategory(), mIntentPackage); sendIntent("click", mOnClick, mOnClickUri); } @@ -133,6 +136,13 @@ public class IntentTile extends QSTile<QSTile.State> { mOnClickUri = intent.getStringExtra("onClickUri"); mOnLongClick = intent.getParcelableExtra("onLongClick"); mOnLongClickUri = intent.getStringExtra("onLongClickUri"); + mIntentPackage = intent.getStringExtra("package"); + mIntentPackage = mIntentPackage == null ? "" : mIntentPackage; + } + + @Override + public int getMetricsCategory() { + return MetricsLogger.QS_INTENT; } private final BroadcastReceiver mReceiver = new BroadcastReceiver() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java index 11ec72203c13..e6fade455444 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/LocationTile.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.KeyguardMonitor; @@ -59,6 +60,7 @@ public class LocationTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { final boolean wasEnabled = (Boolean) mState.value; + MetricsLogger.action(mContext, getMetricsCategory(), !wasEnabled); mController.setLocationEnabled(!wasEnabled); mEnable.setAllowAnimation(true); mDisable.setAllowAnimation(true); @@ -87,6 +89,11 @@ public class LocationTile extends QSTile<QSTile.BooleanState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_LOCATION; + } + + @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_location_changed_on); diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java index f46b9a6fdf04..7c378f08639a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java @@ -18,6 +18,7 @@ package com.android.systemui.qs.tiles; import android.content.res.Configuration; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.RotationLockController; @@ -59,6 +60,7 @@ public class RotationLockTile extends QSTile<QSTile.BooleanState> { @Override protected void handleClick() { if (mController == null) return; + MetricsLogger.action(mContext, getMetricsCategory(), !mState.value); final boolean newState = !mState.value; mController.setRotationLocked(newState); refreshState(newState ? UserBoolean.USER_TRUE : UserBoolean.USER_FALSE); @@ -92,6 +94,11 @@ public class RotationLockTile extends QSTile<QSTile.BooleanState> { R.string.accessibility_rotation_lock_off); } + @Override + public int getMetricsCategory() { + return MetricsLogger.QS_ROTATIONLOCK; + } + /** * Get the correct accessibility string based on the state * diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java index 6bad6524220b..d4f54b64adc2 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java @@ -16,6 +16,7 @@ package com.android.systemui.qs.tiles; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.qs.PseudoGridView; import com.android.systemui.statusbar.policy.UserSwitcherController; @@ -84,6 +85,7 @@ public class UserDetailView extends PseudoGridView { public void onClick(View view) { UserSwitcherController.UserRecord tag = (UserSwitcherController.UserRecord) view.getTag(); + MetricsLogger.action(mContext, MetricsLogger.QS_SWITCH_USER); switchTo(tag); } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java index d589366e7958..c3f9e333e422 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java @@ -26,6 +26,7 @@ import android.util.Log; import android.view.View; import android.view.ViewGroup; +import com.android.internal.logging.MetricsLogger; import com.android.settingslib.wifi.AccessPoint; import com.android.systemui.R; import com.android.systemui.qs.QSDetailItems; @@ -94,6 +95,7 @@ public class WifiTile extends QSTile<QSTile.SignalState> { @Override protected void handleClick() { mState.copyTo(mStateBeforeClick); + MetricsLogger.action(mContext, getMetricsCategory(), !mState.enabled); mController.setWifiEnabled(!mState.enabled); } @@ -159,6 +161,11 @@ public class WifiTile extends QSTile<QSTile.SignalState> { } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_WIFI; + } + + @Override protected boolean shouldAnnouncementBeDelayed() { return mStateBeforeClick.enabled == mState.enabled; } @@ -269,11 +276,17 @@ public class WifiTile extends QSTile<QSTile.SignalState> { @Override public void setToggleState(boolean state) { if (DEBUG) Log.d(TAG, "setToggleState " + state); + MetricsLogger.action(mContext, MetricsLogger.QS_WIFI_TOGGLE, state); mController.setWifiEnabled(state); showDetail(false); } @Override + public int getMetricsCategory() { + return MetricsLogger.QS_WIFI_DETAILS; + } + + @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { if (DEBUG) Log.d(TAG, "createDetailView convertView=" + (convertView != null)); mAccessPoints = null; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 4542054a0627..80fdd288781e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -157,7 +157,8 @@ public class CommandQueue extends IStatusBar.Stub { public void setSystemUiVisibility(int vis, int mask) { synchronized (mList) { - mHandler.removeMessages(MSG_SET_SYSTEMUI_VISIBILITY); + // Don't coalesce these, since it might have one time flags set such as + // STATUS_BAR_UNHIDE which might get lost. mHandler.obtainMessage(MSG_SET_SYSTEMUI_VISIBILITY, vis, mask, null).sendToTarget(); } } 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 f77ac4b0c4db..9ef92114b326 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -729,7 +729,8 @@ public class NotificationPanelView extends PanelView implements } private boolean handleQsTouch(MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN && getExpandedFraction() == 1f + final int action = event.getActionMasked(); + if (action == MotionEvent.ACTION_DOWN && getExpandedFraction() == 1f && mStatusBar.getBarState() != StatusBarState.KEYGUARD && !mQsExpanded && mQsExpansionEnabled) { @@ -750,16 +751,21 @@ public class NotificationPanelView extends PanelView implements return true; } } - if (event.getActionMasked() == MotionEvent.ACTION_CANCEL - || event.getActionMasked() == MotionEvent.ACTION_UP) { + if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { mConflictingQsExpansionGesture = false; } - if (event.getActionMasked() == MotionEvent.ACTION_DOWN && isFullyCollapsed() + if (action == MotionEvent.ACTION_DOWN && isFullyCollapsed() && mQsExpansionEnabled) { mTwoFingerQsExpandPossible = true; } - if (mTwoFingerQsExpandPossible && event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN - && event.getPointerCount() == 2 + final int pointerCount = event.getPointerCount(); + final boolean twoFingerDrag = action == MotionEvent.ACTION_POINTER_DOWN + && pointerCount == 2; + final boolean stylusClickDrag = action == MotionEvent.ACTION_DOWN + && pointerCount == 1 && event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS + && (event.isButtonPressed(MotionEvent.BUTTON_SECONDARY) + || event.isButtonPressed(MotionEvent.BUTTON_TERTIARY)); + if (mTwoFingerQsExpandPossible && (twoFingerDrag || stylusClickDrag) && event.getY(event.getActionIndex()) < mStatusBarMinHeight) { MetricsLogger.count(mContext, COUNTER_PANEL_OPEN_QS, 1); mQsExpandImmediate = true; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index 351977b4fd52..da65a01ebeb5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -529,6 +529,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, = new HashMap<>(); private HashSet<Entry> mHeadsUpEntriesToRemoveOnSwitch = new HashSet<>(); private RankingMap mLatestRankingMap; + private boolean mNoAnimationOnNextBarModeChange; @Override public void start() { @@ -755,7 +756,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // noop } }); - mNetworkController = new NetworkControllerImpl(mContext); + mNetworkController = new NetworkControllerImpl(mContext, mHandlerThread.getLooper()); mHotspotController = new HotspotControllerImpl(mContext); mBluetoothController = new BluetoothControllerImpl(mContext, mHandlerThread.getLooper()); mSecurityController = new SecurityControllerImpl(mContext); @@ -1709,6 +1710,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, * State is one or more of the DISABLE constants from StatusBarManager. */ public void disable(int state1, int state2, boolean animate) { + animate &= mStatusBarWindowState != WINDOW_STATE_HIDDEN; mDisabledUnmodified1 = state1; mDisabledUnmodified2 = state2; state1 = adjustDisableFlags(state1); @@ -1868,6 +1870,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, public void onHeadsUpPinnedModeChanged(boolean inPinnedMode) { if (inPinnedMode) { mStatusBarWindowManager.setHeadsUpShowing(true); + mStatusBarWindowManager.setForceStatusBarVisible(true); } else { Runnable endRunnable = new Runnable() { @Override @@ -2132,6 +2135,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, // Shrink the window to the size of the status bar only mStatusBarWindowManager.setStatusBarExpanded(false); + mStatusBarWindowManager.setForceStatusBarVisible(false); mStatusBarView.setFocusable(true); // Close any "App info" popups that might have snuck on-screen @@ -2272,6 +2276,12 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, setAreThereNotifications(); } + // ready to unhide + if ((vis & View.STATUS_BAR_UNHIDE) != 0) { + mSystemUiVisibility &= ~View.STATUS_BAR_UNHIDE; + mNoAnimationOnNextBarModeChange = true; + } + // update status bar mode final int sbMode = computeBarMode(oldVal, newVal, mStatusBarView.getBarTransitions(), View.STATUS_BAR_TRANSIENT, View.STATUS_BAR_TRANSLUCENT); @@ -2303,10 +2313,6 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, } } - // ready to unhide - if ((vis & View.STATUS_BAR_UNHIDE) != 0) { - mSystemUiVisibility &= ~View.STATUS_BAR_UNHIDE; - } if ((vis & View.NAVIGATION_BAR_UNHIDE) != 0) { mSystemUiVisibility &= ~View.NAVIGATION_BAR_UNHIDE; } @@ -2351,17 +2357,21 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, private void checkBarModes() { if (mDemoMode) return; - checkBarMode(mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions()); + checkBarMode(mStatusBarMode, mStatusBarWindowState, mStatusBarView.getBarTransitions(), + mNoAnimationOnNextBarModeChange); if (mNavigationBarView != null) { checkBarMode(mNavigationBarMode, - mNavigationBarWindowState, mNavigationBarView.getBarTransitions()); + mNavigationBarWindowState, mNavigationBarView.getBarTransitions(), + mNoAnimationOnNextBarModeChange); } + mNoAnimationOnNextBarModeChange = false; } - private void checkBarMode(int mode, int windowState, BarTransitions transitions) { + private void checkBarMode(int mode, int windowState, BarTransitions transitions, + boolean noAnimation) { final boolean powerSave = mBatteryController.isPowerSave(); - final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN - && !powerSave; + final boolean anim = !noAnimation && (mScreenOn == null || mScreenOn) + && windowState != WINDOW_STATE_HIDDEN && !powerSave; if (powerSave && getBarState() == StatusBarState.SHADE) { mode = MODE_WARNING; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java index 84a9f64331a6..e7e4384f6f4a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowManager.java @@ -166,6 +166,7 @@ public class StatusBarWindowManager { private void apply(State state) { applyKeyguardFlags(state); + applyForceStatusBarVisibleFlag(state); applyFocusableFlag(state); adjustScreenOrientation(state); applyHeight(state); @@ -178,6 +179,16 @@ public class StatusBarWindowManager { } } + private void applyForceStatusBarVisibleFlag(State state) { + if (state.forceStatusBarVisible) { + mLpChanged.privateFlags |= WindowManager + .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; + } else { + mLpChanged.privateFlags &= ~WindowManager + .LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT; + } + } + private void applyModalFlag(State state) { if (state.headsUpShowing) { mLpChanged.flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; @@ -240,6 +251,11 @@ public class StatusBarWindowManager { apply(mCurrentState); } + public void setForceStatusBarVisible(boolean forceStatusBarVisible) { + mCurrentState.forceStatusBarVisible = forceStatusBarVisible; + apply(mCurrentState); + } + private static class State { boolean keyguardShowing; boolean keyguardOccluded; @@ -250,6 +266,7 @@ public class StatusBarWindowManager { boolean keyguardFadingAway; boolean qsExpanded; boolean headsUpShowing; + boolean forceStatusBarVisible; /** * The {@link BaseStatusBar} state from the status bar. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java index 18983ff41bc5..5893cb2bf905 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java @@ -20,6 +20,7 @@ import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.net.wifi.WifiManager.ActionListener; +import android.os.Looper; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -58,10 +59,10 @@ public class AccessPointControllerImpl private int mCurrentUser; - public AccessPointControllerImpl(Context context) { + public AccessPointControllerImpl(Context context, Looper bgLooper) { mContext = context; mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); - mWifiTracker = new WifiTracker(context, this, false, true); + mWifiTracker = new WifiTracker(context, this, bgLooper, false, true); mCurrentUser = ActivityManager.getCurrentUser(); } 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 df133e47668b..92e03654dc9c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -28,6 +28,7 @@ import android.net.NetworkCapabilities; import android.net.wifi.WifiManager; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Looper; import android.provider.Settings; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -115,12 +116,13 @@ public class NetworkControllerImpl extends BroadcastReceiver /** * Construct this controller object and register for updates. */ - public NetworkControllerImpl(Context context) { + public NetworkControllerImpl(Context context, Looper bgLooper) { this(context, (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE), (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE), (WifiManager) context.getSystemService(Context.WIFI_SERVICE), SubscriptionManager.from(context), Config.readConfig(context), - new AccessPointControllerImpl(context), new MobileDataControllerImpl(context)); + new AccessPointControllerImpl(context, bgLooper), + new MobileDataControllerImpl(context)); registerListeners(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 194bcfa3867d..ad27c6e1b8a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -43,6 +43,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; +import com.android.internal.logging.MetricsLogger; import com.android.internal.util.UserIcons; import com.android.systemui.BitmapHelper; import com.android.systemui.GuestResumeSessionReceiver; @@ -548,6 +549,11 @@ public class UserSwitcherController { @Override public void setToggleState(boolean state) { } + + @Override + public int getMetricsCategory() { + return MetricsLogger.QS_USERDETAIL; + } }; private final KeyguardMonitor.Callback mCallback = new KeyguardMonitor.Callback() { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 71158975bf65..4bc45dfddf66 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -26,6 +26,7 @@ import android.annotation.SuppressLint; import android.app.Dialog; import android.app.KeyguardManager; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Color; import android.graphics.PixelFormat; @@ -107,6 +108,8 @@ public class VolumeDialog { private final LayoutTransition mLayoutTransition; private final Object mSafetyWarningLock = new Object(); private final Accessibility mAccessibility = new Accessibility(); + private final ColorStateList mActiveSliderTint; + private final ColorStateList mInactiveSliderTint; private boolean mShowing; private boolean mExpanded; @@ -152,6 +155,8 @@ public class VolumeDialog { lp.gravity = Gravity.TOP; window.setAttributes(lp); + mActiveSliderTint = loadColorStateList(R.color.system_accent_color); + mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive); mDialog.setContentView(R.layout.volume_dialog); mDialogView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog); mDialogContentView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog_content); @@ -190,6 +195,10 @@ public class VolumeDialog { controller.getState(); } + private ColorStateList loadColorStateList(int colorResId) { + return ColorStateList.valueOf(mContext.getColor(colorResId)); + } + private void updateWindowWidthH() { final ViewGroup.LayoutParams lp = mDialogView.getLayoutParams(); final DisplayMetrics dm = mContext.getResources().getDisplayMetrics(); @@ -524,6 +533,8 @@ public class VolumeDialog { } Util.setVisOrInvis(row.settingsButton, false); row.header.setAlpha(mExpanded && isActive ? 1 : 0.5f); + row.slider.setProgressTintList(isActive ? mActiveSliderTint : mInactiveSliderTint); + row.slider.setThumbTintList(isActive ? mActiveSliderTint : mInactiveSliderTint); } } @@ -788,6 +799,7 @@ public class VolumeDialog { public void onConfigurationChanged() { updateWindowWidthH(); mSpTexts.update(); + mZenFooter.onConfigurationChanged(); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java index 8aded45b8d25..ccb2b5aa0549 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenFooter.java @@ -36,10 +36,11 @@ public class ZenFooter extends LinearLayout { private static final String TAG = Util.logTag(ZenFooter.class); private final Context mContext; + private final SpTexts mSpTexts; private TextView mSummaryLine1; private TextView mSummaryLine2; - private View mEndNowButton; + private TextView mEndNowButton; private int mZen = -1; private ZenModeConfig mConfig; private ZenModeController mController; @@ -47,6 +48,7 @@ public class ZenFooter extends LinearLayout { public ZenFooter(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; + mSpTexts = new SpTexts(mContext); setLayoutTransition(new LayoutTransition()); } @@ -55,7 +57,10 @@ public class ZenFooter extends LinearLayout { super.onFinishInflate(); mSummaryLine1 = (TextView) findViewById(R.id.volume_zen_summary_line_1); mSummaryLine2 = (TextView) findViewById(R.id.volume_zen_summary_line_2); - mEndNowButton = findViewById(R.id.volume_zen_end_now); + mEndNowButton = (TextView) findViewById(R.id.volume_zen_end_now); + mSpTexts.add(mSummaryLine1); + mSpTexts.add(mSummaryLine2); + mSpTexts.add(mEndNowButton); } public void init(final ZenModeController controller) { @@ -122,4 +127,8 @@ public class ZenFooter extends LinearLayout { Util.setText(mSummaryLine2, line2); } + public void onConfigurationChanged() { + mSpTexts.update(); + } + } diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java index 9f9c9ac87a25..b3b6725f9d1b 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java +++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java @@ -48,6 +48,7 @@ import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.TextView; +import com.android.internal.logging.MetricsLogger; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.statusbar.policy.ZenModeController; @@ -598,6 +599,7 @@ public class ZenModePanel extends LinearLayout { if (childTag == null || childTag == tag) continue; childTag.rb.setChecked(false); } + MetricsLogger.action(mContext, MetricsLogger.QS_DND_CONDITION_SELECT); select(tag.condition); announceConditionSelection(tag); } @@ -700,6 +702,7 @@ public class ZenModePanel extends LinearLayout { } private void onClickTimeButton(View row, ConditionTag tag, boolean up) { + MetricsLogger.action(mContext, MetricsLogger.QS_DND_TIME, up); Condition newCondition = null; final int N = MINUTE_BUCKETS.length; if (mBucketIndex == -1) { @@ -907,6 +910,7 @@ public class ZenModePanel extends LinearLayout { public void onSelected(final Object value) { if (value != null && mZenButtons.isShown() && isAttachedToWindow()) { final int zen = (Integer) value; + MetricsLogger.action(mContext, MetricsLogger.QS_DND_ZEN_SELECT, zen); if (DEBUG) Log.d(mTag, "mZenButtonsCallback selected=" + zen); final Uri realConditionId = getRealConditionId(mSessionExitCondition); AsyncTask.execute(new Runnable() { diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java index 3b61f9dfe798..70a5821bd6a3 100644 --- a/rs/java/android/renderscript/Allocation.java +++ b/rs/java/android/renderscript/Allocation.java @@ -1422,6 +1422,8 @@ public class Allocation extends BaseObj { } /** + * @hide + * * This is only intended to be used by auto-generated code reflected from * the RenderScript script files and should not be used by developers. * diff --git a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java index 5e28d3f5a372..f7e81b01cf64 100644 --- a/rs/java/android/renderscript/ScriptIntrinsicBLAS.java +++ b/rs/java/android/renderscript/ScriptIntrinsicBLAS.java @@ -1039,14 +1039,8 @@ public final class ScriptIntrinsicBLAS extends ScriptIntrinsic { if (cM != cN) { throw new RSRuntimeException("Matrix C is not symmetric"); } - if (TransA != NO_TRANSPOSE) { - if (aN != cM) { - throw new RSRuntimeException("Called BLAS with invalid dimensions"); - } - } else { - if (aM != cM) { - throw new RSRuntimeException("Called BLAS with invalid dimensions"); - } + if (aM != cM) { + throw new RSRuntimeException("Called BLAS with invalid dimensions"); } } else if (A != null && B != null) { // A and B only diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp index 58d0fce9604f..1833a1cd87a1 100644 --- a/rs/jni/android_renderscript_RenderScript.cpp +++ b/rs/jni/android_renderscript_RenderScript.cpp @@ -43,9 +43,6 @@ //#define LOG_API ALOGE static constexpr bool kLogApi = false; -static constexpr size_t kMaxNumberArgsAndBindings = 1000; -static constexpr size_t kMaxNumberClosuresInScriptGroup = 1000000; -static constexpr size_t kMaxNumberKernelArguments = 256; using namespace android; @@ -371,7 +368,7 @@ nClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong kernelID, goto exit; } - if (numValues > kMaxNumberArgsAndBindings) { + if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) { ALOGE("Too many arguments or globals in closure creation"); goto exit; } @@ -456,7 +453,7 @@ nInvokeClosureCreate(JNIEnv *_env, jobject _this, jlong con, jlong invokeID, numValues = (size_t) fieldIDs_length; - if (numValues > kMaxNumberArgsAndBindings) { + if (numValues > RS_CLOSURE_MAX_NUMBER_ARGS_AND_BINDINGS) { ALOGE("Too many arguments or globals in closure creation"); goto exit; } @@ -521,7 +518,7 @@ nScriptGroup2Create(JNIEnv *_env, jobject _this, jlong con, jstring name, RsClosure* closures; - if (numClosures > (jsize) kMaxNumberClosuresInScriptGroup) { + if (numClosures > (jsize) RS_SCRIPT_GROUP_MAX_NUMBER_CLOSURES) { ALOGE("Too many closures in script group"); goto exit; } @@ -1857,7 +1854,7 @@ nScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, jintArray limits) { if (kLogApi) { - ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%lli)", (RsContext)con, (void *)script, slot, ains, aout); + ALOGD("nScriptForEach, con(%p), s(%p), slot(%i) ains(%p) aout(%" PRId64 ")", (RsContext)con, (void *)script, slot, ains, aout); } jint in_len = 0; @@ -1867,7 +1864,7 @@ nScriptForEach(JNIEnv *_env, jobject _this, jlong con, jlong script, jint slot, if (ains != nullptr) { in_len = _env->GetArrayLength(ains); - if (in_len > (jint)kMaxNumberKernelArguments) { + if (in_len > (jint)RS_KERNEL_MAX_ARGUMENTS) { ALOGE("Too many arguments in kernel launch."); // TODO (b/20758983): Report back to Java and throw an exception return; diff --git a/services/core/java/com/android/server/AssetAtlasService.java b/services/core/java/com/android/server/AssetAtlasService.java index 26f4232ff835..ebc810f3a6e1 100644 --- a/services/core/java/com/android/server/AssetAtlasService.java +++ b/services/core/java/com/android/server/AssetAtlasService.java @@ -119,7 +119,6 @@ public class AssetAtlasService extends IAssetAtlas.Stub { // long0: SkBitmap*, the native bitmap object // long1: x position // long2: y position - // long3: rotated, 1 if the bitmap must be rotated, 0 otherwise private long[] mAtlasMap; /** @@ -236,7 +235,7 @@ public class AssetAtlasService extends IAssetAtlas.Stub { /** * Renders a list of bitmaps into the atlas. The position of each bitmap * was decided by the packing algorithm and will be honored by this - * method. If need be this method will also rotate bitmaps. + * method. * * @param buffer The buffer to render the atlas entries into * @param atlas The atlas to pack the bitmaps into @@ -280,16 +279,11 @@ public class AssetAtlasService extends IAssetAtlas.Stub { canvas.save(); canvas.translate(entry.x, entry.y); - if (entry.rotated) { - canvas.translate(bitmap.getHeight(), 0.0f); - canvas.rotate(90.0f); - } canvas.drawBitmap(bitmap, 0.0f, 0.0f, null); canvas.restore(); atlasMap[mapIndex++] = bitmap.refSkPixelRef(); atlasMap[mapIndex++] = entry.x; atlasMap[mapIndex++] = entry.y; - atlasMap[mapIndex++] = entry.rotated ? 1 : 0; } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 1019faa6d9c9..32b91d25fb17 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -512,7 +512,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { private void onBluetoothGattServiceUp() { if (DBG) Log.d(TAG,"BluetoothGatt Service is Up"); try{ - if (isBleAppPresent() == false && mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { + if (isBleAppPresent() == false && mBluetooth != null + && mBluetooth.getState() == BluetoothAdapter.STATE_BLE_ON) { mBluetooth.onLeServiceUp(); // waive WRITE_SECURE_SETTINGS permission check @@ -531,32 +532,26 @@ class BluetoothManagerService extends IBluetoothManager.Stub { */ private void sendBrEdrDownCallback() { if (DBG) Log.d(TAG,"Calling sendBrEdrDownCallback callbacks"); - int n = mCallbacks.beginBroadcast(); + + if(mBluetooth == null) { + Log.w(TAG, "Bluetooth handle is null"); + return; + } if (isBleAppPresent() == false) { try { mBluetooth.onBrEdrDown(); } catch(RemoteException e) { - Log.e(TAG,"Unable to call onBrEdrDown", e); + Log.e(TAG, "Call to onBrEdrDown() failed.", e); } - } - else{//need to stay at BLE ON. disconnect all Gatt connections + } else { + // Need to stay at BLE ON. Disconnect all Gatt connections try{ - mBluetoothGatt.unregAll();//disconnectAll(); + mBluetoothGatt.unregAll(); } catch(RemoteException e) { - Log.e(TAG,"Unable to disconn all", e); - } - } - - Log.d(TAG,"Broadcasting onBrEdrDown() to " + n + " receivers."); - for (int i=0; i <n; i++) { - try { - mCallbacks.getBroadcastItem(i).onBrEdrDown(); - } catch (RemoteException e) { - Log.e(TAG, "Unable to call sendBrEdrDownCallback() on callback #" + i, e); + Log.e(TAG, "Unable to disconnect all apps.", e); } } - mCallbacks.finishBroadcast(); } /** @hide*/ diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 8d1d1248137a..1dc2d7e719bb 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -190,7 +190,7 @@ public class ConnectivityService extends IConnectivityManager.Stub /** Set of ifaces that are costly. */ private HashSet<String> mMeteredIfaces = Sets.newHashSet(); - private Context mContext; + final private Context mContext; private int mNetworkPreference; // 0 is full bad, 100 is full good private int mDefaultInetConditionPublished = 0; @@ -344,6 +344,11 @@ public class ConnectivityService extends IConnectivityManager.Stub */ private static final int EVENT_PROMPT_UNVALIDATED = 29; + /** + * used internally to (re)configure mobile data always-on settings. + */ + private static final int EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON = 30; + /** Handler used for internal events. */ final private InternalHandler mHandler; /** Handler used for incoming {@link NetworkStateTracker} events. */ @@ -374,7 +379,7 @@ public class ConnectivityService extends IConnectivityManager.Stub private PacManager mPacManager = null; - private SettingsObserver mSettingsObserver; + final private SettingsObserver mSettingsObserver; private UserManager mUserManager; @@ -555,13 +560,12 @@ public class ConnectivityService extends IConnectivityManager.Stub INetworkStatsService statsService, INetworkPolicyManager policyManager) { if (DBG) log("ConnectivityService starting up"); - NetworkCapabilities netCap = new NetworkCapabilities(); - netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); - netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); - mDefaultRequest = new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId()); - NetworkRequestInfo nri = new NetworkRequestInfo(null, mDefaultRequest, new Binder(), - NetworkRequestInfo.REQUEST); - mNetworkRequests.put(mDefaultRequest, nri); + mDefaultRequest = createInternetRequestForTransport(-1); + mNetworkRequests.put(mDefaultRequest, new NetworkRequestInfo( + null, mDefaultRequest, new Binder(), NetworkRequestInfo.REQUEST)); + + mDefaultMobileDataRequest = createInternetRequestForTransport( + NetworkCapabilities.TRANSPORT_CELLULAR); HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread"); handlerThread.start(); @@ -696,8 +700,8 @@ public class ConnectivityService extends IConnectivityManager.Stub mInetLog = new ArrayList(); } - mSettingsObserver = new SettingsObserver(mHandler, EVENT_APPLY_GLOBAL_HTTP_PROXY); - mSettingsObserver.observe(mContext); + mSettingsObserver = new SettingsObserver(mContext, mHandler); + registerSettingsCallbacks(); mDataConnectionStats = new DataConnectionStats(mContext); mDataConnectionStats.startMonitoring(); @@ -707,6 +711,44 @@ public class ConnectivityService extends IConnectivityManager.Stub mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE); } + private NetworkRequest createInternetRequestForTransport(int transportType) { + NetworkCapabilities netCap = new NetworkCapabilities(); + netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); + netCap.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); + if (transportType > -1) { + netCap.addTransportType(transportType); + } + return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId()); + } + + private void handleMobileDataAlwaysOn() { + final boolean enable = (Settings.Global.getInt( + mContext.getContentResolver(), Settings.Global.MOBILE_DATA_ALWAYS_ON, 0) == 1); + final boolean isEnabled = (mNetworkRequests.get(mDefaultMobileDataRequest) != null); + if (enable == isEnabled) { + return; // Nothing to do. + } + + if (enable) { + handleRegisterNetworkRequest(new NetworkRequestInfo( + null, mDefaultMobileDataRequest, new Binder(), NetworkRequestInfo.REQUEST)); + } else { + handleReleaseNetworkRequest(mDefaultMobileDataRequest, Process.SYSTEM_UID); + } + } + + private void registerSettingsCallbacks() { + // Watch for global HTTP proxy changes. + mSettingsObserver.observe( + Settings.Global.getUriFor(Settings.Global.HTTP_PROXY), + EVENT_APPLY_GLOBAL_HTTP_PROXY); + + // Watch for whether or not to keep mobile data always on. + mSettingsObserver.observe( + Settings.Global.getUriFor(Settings.Global.MOBILE_DATA_ALWAYS_ON), + EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON); + } + private synchronized int nextNetworkRequestId() { return mNextNetworkRequestId++; } @@ -1491,6 +1533,9 @@ public class ConnectivityService extends IConnectivityManager.Stub mContext.registerReceiver(mUserPresentReceiver, filter); } + // Configure whether mobile data is always on. + mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON)); + mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY)); mPermissionMonitor.startMonitoring(); @@ -2107,12 +2152,10 @@ public class ConnectivityService extends IConnectivityManager.Stub + nri.request + " because their intents matched."); handleReleaseNetworkRequest(existingRequest.request, getCallingUid()); } - handleRegisterNetworkRequest(msg); + handleRegisterNetworkRequest(nri); } - private void handleRegisterNetworkRequest(Message msg) { - final NetworkRequestInfo nri = (NetworkRequestInfo) (msg.obj); - + private void handleRegisterNetworkRequest(NetworkRequestInfo nri) { mNetworkRequests.put(nri.request, nri); // TODO: This logic may be better replaced with a call to rematchNetworkAndRequests @@ -2423,7 +2466,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } case EVENT_REGISTER_NETWORK_REQUEST: case EVENT_REGISTER_NETWORK_LISTENER: { - handleRegisterNetworkRequest(msg); + handleRegisterNetworkRequest((NetworkRequestInfo) msg.obj); break; } case EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT: { @@ -2446,6 +2489,10 @@ public class ConnectivityService extends IConnectivityManager.Stub handlePromptUnvalidated((Network) msg.obj); break; } + case EVENT_CONFIGURE_MOBILE_DATA_ALWAYS_ON: { + handleMobileDataAlwaysOn(); + break; + } case EVENT_SYSTEM_READY: { for (NetworkAgentInfo nai : mNetworkAgentInfos.values()) { nai.networkMonitor.systemReady = true; @@ -2837,23 +2884,36 @@ public class ConnectivityService extends IConnectivityManager.Stub } private static class SettingsObserver extends ContentObserver { - private int mWhat; - private Handler mHandler; - SettingsObserver(Handler handler, int what) { - super(handler); + final private HashMap<Uri, Integer> mUriEventMap; + final private Context mContext; + final private Handler mHandler; + + SettingsObserver(Context context, Handler handler) { + super(null); + mUriEventMap = new HashMap<Uri, Integer>(); + mContext = context; mHandler = handler; - mWhat = what; } - void observe(Context context) { - ContentResolver resolver = context.getContentResolver(); - resolver.registerContentObserver(Settings.Global.getUriFor( - Settings.Global.HTTP_PROXY), false, this); + void observe(Uri uri, int what) { + mUriEventMap.put(uri, what); + final ContentResolver resolver = mContext.getContentResolver(); + resolver.registerContentObserver(uri, false, this); } @Override public void onChange(boolean selfChange) { - mHandler.obtainMessage(mWhat).sendToTarget(); + Slog.wtf(TAG, "Should never be reached."); + } + + @Override + public void onChange(boolean selfChange, Uri uri) { + final Integer what = mUriEventMap.get(uri); + if (what != null) { + mHandler.obtainMessage(what.intValue()).sendToTarget(); + } else { + loge("No matching event to send for URI=" + uri); + } } } @@ -3643,6 +3703,10 @@ public class ConnectivityService extends IConnectivityManager.Stub // Note: if mDefaultRequest is changed, NetworkMonitor needs to be updated. private final NetworkRequest mDefaultRequest; + // Request used to optionally keep mobile data active even when higher + // priority networks like Wi-Fi are active. + private final NetworkRequest mDefaultMobileDataRequest; + private NetworkAgentInfo getDefaultNetwork() { return mNetworkForRequestId.get(mDefaultRequest.requestId); } diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java index 759a6bea345c..e856a9357447 100644 --- a/services/core/java/com/android/server/InputMethodManagerService.java +++ b/services/core/java/com/android/server/InputMethodManagerService.java @@ -1695,6 +1695,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub vis = 0; } mImeWindowVis = vis; + mInputShown = ((mImeWindowVis & InputMethodService.IME_VISIBLE) != 0); mBackDisposition = backDisposition; final boolean iconVisibility = ((vis & (InputMethodService.IME_ACTIVE)) != 0) && (mWindowManagerService.isHardKeyboardAvailable() @@ -2038,11 +2039,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (!mIWindowManager.inputMethodClientHasFocus(client)) { if (DEBUG) Slog.w(TAG, "Ignoring hideSoftInput of uid " + uid + ": " + client); - setImeWindowVisibilityStatusHiddenLocked(); return false; } } catch (RemoteException e) { - setImeWindowVisibilityStatusHiddenLocked(); return false; } } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index 5df74c5edd05..ed2de4a9e485 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -356,28 +356,23 @@ public class LockSettingsService extends ILockSettings.Stub { return mStorage.hasPattern(userId); } - private void maybeUpdateKeystore(String password, int userHandle) { + private void setKeystorePassword(String password, int userHandle) { final UserManager um = (UserManager) mContext.getSystemService(USER_SERVICE); final KeyStore ks = KeyStore.getInstance(); final List<UserInfo> profiles = um.getProfiles(userHandle); - boolean shouldReset = TextUtils.isEmpty(password); - - // For historical reasons, don't wipe a non-empty keystore if we have a single user with a - // single profile. - if (userHandle == UserHandle.USER_OWNER && profiles.size() == 1) { - if (!ks.isEmpty()) { - shouldReset = false; - } + for (UserInfo pi : profiles) { + ks.onUserPasswordChanged(pi.id, password); } + } + + private void unlockKeystore(String password, int userHandle) { + final UserManager um = (UserManager) mContext.getSystemService(USER_SERVICE); + final KeyStore ks = KeyStore.getInstance(); + final List<UserInfo> profiles = um.getProfiles(userHandle); for (UserInfo pi : profiles) { - final int profileUid = UserHandle.getUid(pi.id, Process.SYSTEM_UID); - if (shouldReset) { - ks.resetUid(profileUid); - } else { - ks.passwordUid(password, profileUid); - } + ks.unlock(pi.id, password); } } @@ -423,7 +418,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (pattern == null) { getGateKeeperService().clearSecureUserId(userId); mStorage.writePatternHash(null, userId); - maybeUpdateKeystore(null, userId); + setKeystorePassword(null, userId); return; } @@ -451,7 +446,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (password == null) { getGateKeeperService().clearSecureUserId(userId); mStorage.writePasswordHash(null, userId); - maybeUpdateKeystore(null, userId); + setKeystorePassword(null, userId); return; } @@ -484,7 +479,7 @@ public class LockSettingsService extends ILockSettings.Stub { toEnrollBytes); if (hash != null) { - maybeUpdateKeystore(toEnroll, userId); + setKeystorePassword(toEnroll, userId); } return hash; @@ -530,7 +525,7 @@ public class LockSettingsService extends ILockSettings.Stub { byte[] hash = mLockPatternUtils.patternToHash( mLockPatternUtils.stringToPattern(pattern)); if (Arrays.equals(hash, storedHash.hash)) { - maybeUpdateKeystore(pattern, userId); + unlockKeystore(pattern, userId); // migrate password to GateKeeper setLockPattern(pattern, null, userId); if (!hasChallenge) { @@ -556,7 +551,7 @@ public class LockSettingsService extends ILockSettings.Stub { } // pattern has matched - maybeUpdateKeystore(pattern, userId); + unlockKeystore(pattern, userId); return token; } @@ -599,7 +594,7 @@ public class LockSettingsService extends ILockSettings.Stub { if (storedHash.version == CredentialHash.VERSION_LEGACY) { byte[] hash = mLockPatternUtils.passwordToHash(password, userId); if (Arrays.equals(hash, storedHash.hash)) { - maybeUpdateKeystore(password, userId); + unlockKeystore(password, userId); // migrate password to GateKeeper setLockPassword(password, null, userId); if (!hasChallenge) { @@ -625,7 +620,7 @@ public class LockSettingsService extends ILockSettings.Stub { } // password has matched - maybeUpdateKeystore(password, userId); + unlockKeystore(password, userId); return token; } diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 0925fa52e524..93ac51aecdc7 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -242,6 +242,7 @@ class MountService extends IMountService.Stub private static final int VERSION_INIT = 1; private static final int VERSION_ADD_PRIMARY = 2; + private static final int VERSION_FIX_PRIMARY = 3; private static final String TAG_VOLUMES = "volumes"; private static final String ATTR_VERSION = "version"; @@ -1187,8 +1188,17 @@ class MountService extends IMountService.Stub mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget(); } + private String getDefaultPrimaryStorageUuid() { + if (SystemProperties.getBoolean(StorageManager.PROP_PRIMARY_PHYSICAL, false)) { + return StorageManager.UUID_PRIMARY_PHYSICAL; + } else { + return StorageManager.UUID_PRIVATE_INTERNAL; + } + } + private void readSettingsLocked() { mRecords.clear(); + mPrimaryStorageUuid = getDefaultPrimaryStorageUuid(); FileInputStream fis = null; try { @@ -1202,16 +1212,13 @@ class MountService extends IMountService.Stub final String tag = in.getName(); if (TAG_VOLUMES.equals(tag)) { final int version = readIntAttribute(in, ATTR_VERSION, VERSION_INIT); - if (version >= VERSION_ADD_PRIMARY) { + final boolean primaryPhysical = SystemProperties.getBoolean( + StorageManager.PROP_PRIMARY_PHYSICAL, false); + final boolean validAttr = (version >= VERSION_FIX_PRIMARY) + || (version >= VERSION_ADD_PRIMARY && !primaryPhysical); + if (validAttr) { mPrimaryStorageUuid = readStringAttribute(in, ATTR_PRIMARY_STORAGE_UUID); - } else { - if (SystemProperties.getBoolean(StorageManager.PROP_PRIMARY_PHYSICAL, - false)) { - mPrimaryStorageUuid = StorageManager.UUID_PRIMARY_PHYSICAL; - } else { - mPrimaryStorageUuid = StorageManager.UUID_PRIVATE_INTERNAL; - } } } else if (TAG_VOLUME.equals(tag)) { @@ -1240,7 +1247,7 @@ class MountService extends IMountService.Stub out.setOutput(fos, "utf-8"); out.startDocument(null, true); out.startTag(null, TAG_VOLUMES); - writeIntAttribute(out, ATTR_VERSION, VERSION_ADD_PRIMARY); + writeIntAttribute(out, ATTR_VERSION, VERSION_FIX_PRIMARY); writeStringAttribute(out, ATTR_PRIMARY_STORAGE_UUID, mPrimaryStorageUuid); final int size = mRecords.size(); for (int i = 0; i < size; i++) { @@ -1482,7 +1489,7 @@ class MountService extends IMountService.Stub // If this had been primary storage, revert back to internal and // reset vold so we bind into new volume into place. if (Objects.equals(mPrimaryStorageUuid, fsUuid)) { - mPrimaryStorageUuid = StorageManager.UUID_PRIVATE_INTERNAL; + mPrimaryStorageUuid = getDefaultPrimaryStorageUuid(); resetIfReadyAndConnected(); } @@ -1497,11 +1504,13 @@ class MountService extends IMountService.Stub final String fsUuid = mRecords.keyAt(i); mCallbacks.notifyVolumeForgotten(fsUuid); } - mRecords.clear(); - writeSettingsLocked(); - mPrimaryStorageUuid = StorageManager.UUID_PRIVATE_INTERNAL; + if (!Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, mPrimaryStorageUuid)) { + mPrimaryStorageUuid = getDefaultPrimaryStorageUuid(); + } + + writeSettingsLocked(); resetIfReadyAndConnected(); } } @@ -1522,13 +1531,8 @@ class MountService extends IMountService.Stub waitForReady(); synchronized (mLock) { - final VolumeInfo from = Preconditions.checkNotNull( - findStorageForUuid(mPrimaryStorageUuid)); - final VolumeInfo to = Preconditions.checkNotNull( - findStorageForUuid(volumeUuid)); - - if (Objects.equals(from, to)) { - throw new IllegalArgumentException("Primary storage already at " + from); + if (Objects.equals(mPrimaryStorageUuid, volumeUuid)) { + throw new IllegalArgumentException("Primary storage already at " + volumeUuid); } if (mMoveCallback != null) { @@ -1537,10 +1541,26 @@ class MountService extends IMountService.Stub mMoveCallback = callback; mMoveTargetUuid = volumeUuid; - try { - mConnector.execute("volume", "move_storage", from.id, to.id); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + // When moving to/from primary physical volume, we probably just nuked + // the current storage location, so we have nothing to move. + if (Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, mPrimaryStorageUuid) + || Objects.equals(StorageManager.UUID_PRIMARY_PHYSICAL, volumeUuid)) { + Slog.d(TAG, "Skipping move to/from primary physical"); + onMoveStatusLocked(MOVE_STATUS_COPY_FINISHED); + onMoveStatusLocked(PackageManager.MOVE_SUCCEEDED); + resetIfReadyAndConnected(); + + } else { + final VolumeInfo from = Preconditions.checkNotNull( + findStorageForUuid(mPrimaryStorageUuid)); + final VolumeInfo to = Preconditions.checkNotNull( + findStorageForUuid(volumeUuid)); + + try { + mConnector.execute("volume", "move_storage", from.id, to.id); + } catch (NativeDaemonConnectorException e) { + throw e.rethrowAsParcelableException(); + } } } } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 3dece494c2d3..fa4d204b2e59 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Set; import android.app.ActivityThread; import android.os.Build; @@ -119,14 +120,13 @@ public final class ActiveServices { // at the same time. final int mMaxStartingBackground; - final SparseArray<ServiceMap> mServiceMap = new SparseArray<ServiceMap>(); + final SparseArray<ServiceMap> mServiceMap = new SparseArray<>(); /** * All currently bound service connections. Keys are the IBinder of * the client's IServiceConnection. */ - final ArrayMap<IBinder, ArrayList<ConnectionRecord>> mServiceConnections - = new ArrayMap<IBinder, ArrayList<ConnectionRecord>>(); + final ArrayMap<IBinder, ArrayList<ConnectionRecord>> mServiceConnections = new ArrayMap<>(); /** * List of services that we have been asked to start, @@ -134,20 +134,20 @@ public final class ActiveServices { * while waiting for their corresponding application thread to get * going. */ - final ArrayList<ServiceRecord> mPendingServices - = new ArrayList<ServiceRecord>(); + final ArrayList<ServiceRecord> mPendingServices = new ArrayList<>(); /** * List of services that are scheduled to restart following a crash. */ - final ArrayList<ServiceRecord> mRestartingServices - = new ArrayList<ServiceRecord>(); + final ArrayList<ServiceRecord> mRestartingServices = new ArrayList<>(); /** * List of services that are in the process of being destroyed. */ - final ArrayList<ServiceRecord> mDestroyingServices - = new ArrayList<ServiceRecord>(); + final ArrayList<ServiceRecord> mDestroyingServices = new ArrayList<>(); + + /** Temporary list for holding the results of calls to {@link #collectPackageServicesLocked} */ + private ArrayList<ServiceRecord> mTmpCollectionResults = null; /** Amount of time to allow a last ANR message to exist before freeing the memory. */ static final int LAST_ANR_LIFETIME_DURATION_MSECS = 2 * 60 * 60 * 1000; // Two hours @@ -162,10 +162,6 @@ public final class ActiveServices { } }; - static final class DelayingProcess extends ArrayList<ServiceRecord> { - long timeoout; - } - /** * Information about services for a single user. */ @@ -2076,14 +2072,16 @@ public final class ActiveServices { } } - private boolean collectForceStopServicesLocked(String name, int userId, - boolean evenPersistent, boolean doit, - ArrayMap<ComponentName, ServiceRecord> services, - ArrayList<ServiceRecord> result) { + private boolean collectPackageServicesLocked(String packageName, Set<String> filterByClasses, + boolean evenPersistent, boolean doit, ArrayMap<ComponentName, ServiceRecord> services) { boolean didSomething = false; - for (int i=0; i<services.size(); i++) { + for (int i = services.size() - 1; i >= 0; i--) { ServiceRecord service = services.valueAt(i); - if ((name == null || service.packageName.equals(name)) + final boolean sameComponent = packageName == null + || (service.packageName.equals(packageName) + && (filterByClasses == null + || filterByClasses.contains(service.name.getClassName()))); + if (sameComponent && (service.app == null || evenPersistent || !service.app.persistent)) { if (!doit) { return true; @@ -2098,19 +2096,27 @@ public final class ActiveServices { } service.app = null; service.isolatedProc = null; - result.add(service); + if (mTmpCollectionResults == null) { + mTmpCollectionResults = new ArrayList<>(); + } + mTmpCollectionResults.add(service); } } return didSomething; } - boolean forceStopLocked(String name, int userId, boolean evenPersistent, boolean doit) { + boolean bringDownDisabledPackageServicesLocked(String packageName, Set<String> filterByClasses, + int userId, boolean evenPersistent, boolean doit) { boolean didSomething = false; - ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>(); + + if (mTmpCollectionResults != null) { + mTmpCollectionResults.clear(); + } + if (userId == UserHandle.USER_ALL) { - for (int i=0; i<mServiceMap.size(); i++) { - didSomething |= collectForceStopServicesLocked(name, userId, evenPersistent, - doit, mServiceMap.valueAt(i).mServicesByName, services); + for (int i = mServiceMap.size() - 1; i >= 0; i--) { + didSomething |= collectPackageServicesLocked(packageName, filterByClasses, + evenPersistent, doit, mServiceMap.valueAt(i).mServicesByName); if (!doit && didSomething) { return true; } @@ -2119,22 +2125,24 @@ public final class ActiveServices { ServiceMap smap = mServiceMap.get(userId); if (smap != null) { ArrayMap<ComponentName, ServiceRecord> items = smap.mServicesByName; - didSomething = collectForceStopServicesLocked(name, userId, evenPersistent, - doit, items, services); + didSomething = collectPackageServicesLocked(packageName, filterByClasses, + evenPersistent, doit, items); } } - int N = services.size(); - for (int i=0; i<N; i++) { - bringDownServiceLocked(services.get(i)); + if (mTmpCollectionResults != null) { + for (int i = mTmpCollectionResults.size() - 1; i >= 0; i--) { + bringDownServiceLocked(mTmpCollectionResults.get(i)); + } + mTmpCollectionResults.clear(); } return didSomething; } void cleanUpRemovedTaskLocked(TaskRecord tr, ComponentName component, Intent baseIntent) { - ArrayList<ServiceRecord> services = new ArrayList<ServiceRecord>(); + ArrayList<ServiceRecord> services = new ArrayList<>(); ArrayMap<ComponentName, ServiceRecord> alls = getServices(tr.userId); - for (int i=0; i<alls.size(); i++) { + for (int i = alls.size() - 1; i >= 0; i--) { ServiceRecord sr = alls.valueAt(i); if (sr.packageName.equals(component.getPackageName())) { services.add(sr); @@ -2142,7 +2150,7 @@ public final class ActiveServices { } // Take care of any running services associated with the app. - for (int i=0; i<services.size(); i++) { + for (int i = services.size() - 1; i >= 0; i--) { ServiceRecord sr = services.get(i); if (sr.startRequested) { if ((sr.serviceInfo.flags&ServiceInfo.FLAG_STOP_WITH_TASK) != 0) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 82dbfeec2483..76ee3bcf55c7 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -375,6 +375,10 @@ public final class ActivityManagerService extends ActivityManagerNative // Delay in notifying task stack change listeners (in millis) static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 1000; + // Necessary ApplicationInfo flags to mark an app as persistent + private static final int PERSISTENT_MASK = + ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT; + /** All system services */ SystemServiceManager mSystemServiceManager; @@ -5363,39 +5367,117 @@ public final class ActivityManagerService extends ActivityManagerNative return N > 0; } - private final boolean forceStopPackageLocked(String name, int appId, + private void cleanupDisabledPackageComponentsLocked( + String packageName, int userId, String[] changedClasses) { + + Set<String> disabledClasses = null; + boolean packageDisabled = false; + IPackageManager pm = AppGlobals.getPackageManager(); + + if (changedClasses == null) { + // Nothing changed... + return; + } + + // Determine enable/disable state of the package and its components. + int enabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + for (int i = changedClasses.length - 1; i >= 0; i--) { + final String changedClass = changedClasses[i]; + + if (changedClass.equals(packageName)) { + try { + // Entire package setting changed + enabled = pm.getApplicationEnabledSetting(packageName, + (userId != UserHandle.USER_ALL) ? userId : UserHandle.USER_OWNER); + } catch (RemoteException e) { + // Can't happen... + } + packageDisabled = enabled != PackageManager.COMPONENT_ENABLED_STATE_ENABLED + && enabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; + if (packageDisabled) { + // Entire package is disabled. + // No need to continue to check component states. + disabledClasses = null; + break; + } + } else { + try { + enabled = pm.getComponentEnabledSetting( + new ComponentName(packageName, changedClass), + (userId != UserHandle.USER_ALL) ? userId : UserHandle.USER_OWNER); + } catch (RemoteException e) { + // Can't happen... + } + if (enabled != PackageManager.COMPONENT_ENABLED_STATE_ENABLED + && enabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { + if (disabledClasses == null) { + disabledClasses = new ArraySet<>(changedClasses.length); + } + disabledClasses.add(changedClass); + } + } + } + + if (!packageDisabled && disabledClasses == null) { + // Nothing to do here... + return; + } + + // Clean-up disabled activities. + if (mStackSupervisor.finishDisabledPackageActivitiesLocked( + packageName, disabledClasses, true, false, userId) && mBooted) { + mStackSupervisor.resumeTopActivitiesLocked(); + mStackSupervisor.scheduleIdleLocked(); + } + + // Clean-up disabled tasks + cleanupDisabledPackageTasksLocked(packageName, disabledClasses, userId); + + // Clean-up disabled services. + mServices.bringDownDisabledPackageServicesLocked( + packageName, disabledClasses, userId, false, true); + + // Clean-up disabled providers. + ArrayList<ContentProviderRecord> providers = new ArrayList<>(); + mProviderMap.collectPackageProvidersLocked( + packageName, disabledClasses, true, false, userId, providers); + for (int i = providers.size() - 1; i >= 0; i--) { + removeDyingProviderLocked(null, providers.get(i), true); + } + } + + private final boolean forceStopPackageLocked(String packageName, int appId, boolean callerWillRestart, boolean purgeCache, boolean doit, boolean evenPersistent, boolean uninstalling, int userId, String reason) { int i; - int N; - if (userId == UserHandle.USER_ALL && name == null) { + if (userId == UserHandle.USER_ALL && packageName == null) { Slog.w(TAG, "Can't force stop all processes of all users, that is insane!"); } - if (appId < 0 && name != null) { + if (appId < 0 && packageName != null) { try { appId = UserHandle.getAppId( - AppGlobals.getPackageManager().getPackageUid(name, 0)); + AppGlobals.getPackageManager().getPackageUid(packageName, 0)); } catch (RemoteException e) { } } if (doit) { - if (name != null) { - Slog.i(TAG, "Force stopping " + name + " appid=" + appId + if (packageName != null) { + Slog.i(TAG, "Force stopping " + packageName + " appid=" + appId + " user=" + userId + ": " + reason); } else { Slog.i(TAG, "Force stopping u" + userId + ": " + reason); } final ArrayMap<String, SparseArray<Long>> pmap = mProcessCrashTimes.getMap(); - for (int ip=pmap.size()-1; ip>=0; ip--) { + for (int ip = pmap.size() - 1; ip >= 0; ip--) { SparseArray<Long> ba = pmap.valueAt(ip); - for (i=ba.size()-1; i>=0; i--) { + for (i = ba.size() - 1; i >= 0; i--) { boolean remove = false; final int entUid = ba.keyAt(i); - if (name != null) { + if (packageName != null) { if (userId == UserHandle.USER_ALL) { if (UserHandle.getAppId(entUid) == appId) { remove = true; @@ -5418,46 +5500,47 @@ public final class ActivityManagerService extends ActivityManagerNative } } - boolean didSomething = killPackageProcessesLocked(name, appId, userId, + boolean didSomething = killPackageProcessesLocked(packageName, appId, userId, -100, callerWillRestart, true, doit, evenPersistent, - name == null ? ("stop user " + userId) : ("stop " + name)); + packageName == null ? ("stop user " + userId) : ("stop " + packageName)); - if (mStackSupervisor.forceStopPackageLocked(name, doit, evenPersistent, userId)) { + if (mStackSupervisor.finishDisabledPackageActivitiesLocked( + packageName, null, doit, evenPersistent, userId)) { if (!doit) { return true; } didSomething = true; } - if (mServices.forceStopLocked(name, userId, evenPersistent, doit)) { + if (mServices.bringDownDisabledPackageServicesLocked( + packageName, null, userId, evenPersistent, doit)) { if (!doit) { return true; } didSomething = true; } - if (name == null) { + if (packageName == null) { // Remove all sticky broadcasts from this user. mStickyBroadcasts.remove(userId); } - ArrayList<ContentProviderRecord> providers = new ArrayList<ContentProviderRecord>(); - if (mProviderMap.collectForceStopProviders(name, appId, doit, evenPersistent, + ArrayList<ContentProviderRecord> providers = new ArrayList<>(); + if (mProviderMap.collectPackageProvidersLocked(packageName, null, doit, evenPersistent, userId, providers)) { if (!doit) { return true; } didSomething = true; } - N = providers.size(); - for (i=0; i<N; i++) { + for (i = providers.size() - 1; i >= 0; i--) { removeDyingProviderLocked(null, providers.get(i), true); } // Remove transient permissions granted from/to this package/user - removeUriPermissionsForPackageLocked(name, userId, false); + removeUriPermissionsForPackageLocked(packageName, userId, false); - if (name == null || uninstalling) { + if (packageName == null || uninstalling) { // Remove pending intents. For now we only do this when force // stopping users, because we have some problems when doing this // for packages -- app widgets are not currently cleaned up for @@ -5476,7 +5559,7 @@ public final class ActivityManagerService extends ActivityManagerNative it.remove(); continue; } - if (name == null) { + if (packageName == null) { // Stopping user, remove all objects for the user. if (pir.key.userId != userId) { // Not the same user, skip it. @@ -5491,7 +5574,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Different user, skip it. continue; } - if (!pir.key.packageName.equals(name)) { + if (!pir.key.packageName.equals(packageName)) { // Different package, skip it. continue; } @@ -5510,10 +5593,10 @@ public final class ActivityManagerService extends ActivityManagerNative } if (doit) { - if (purgeCache && name != null) { + if (purgeCache && packageName != null) { AttributeCache ac = AttributeCache.instance(); if (ac != null) { - ac.removePackage(name); + ac.removePackage(packageName); } } if (mBooted) { @@ -8331,29 +8414,20 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private void removeTasksByRemovedPackageComponentsLocked(String packageName, int userId) { - final IPackageManager pm = AppGlobals.getPackageManager(); - final HashSet<ComponentName> componentsKnownToExist = new HashSet<ComponentName>(); + private void cleanupDisabledPackageTasksLocked(String packageName, Set<String> filterByClasses, + int userId) { for (int i = mRecentTasks.size() - 1; i >= 0; i--) { TaskRecord tr = mRecentTasks.get(i); - if (tr.userId != userId) continue; + if (userId != UserHandle.USER_ALL && tr.userId != userId) { + continue; + } ComponentName cn = tr.intent.getComponent(); - if (cn != null && cn.getPackageName().equals(packageName)) { - // Skip if component still exists in the package. - if (componentsKnownToExist.contains(cn)) continue; - - try { - ActivityInfo info = pm.getActivityInfo(cn, 0, userId); - if (info != null) { - componentsKnownToExist.add(cn); - } else { - removeTaskByIdLocked(tr.taskId, false); - } - } catch (RemoteException e) { - Log.e(TAG, "Activity info query failed. component=" + cn, e); - } + final boolean sameComponent = cn != null && cn.getPackageName().equals(packageName) + && (filterByClasses == null || filterByClasses.contains(cn.getClassName())); + if (sameComponent) { + removeTaskByIdLocked(tr.taskId, false); } } } @@ -9773,10 +9847,10 @@ public final class ActivityManagerService extends ActivityManagerNative String proc = customProcess != null ? customProcess : info.processName; BatteryStatsImpl.Uid.Proc ps = null; BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics(); + final int userId = UserHandle.getUserId(info.uid); int uid = info.uid; if (isolated) { if (isolatedUid == 0) { - int userId = UserHandle.getUserId(uid); int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1; while (true) { if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID @@ -9800,7 +9874,13 @@ public final class ActivityManagerService extends ActivityManagerNative uid = isolatedUid; } } - return new ProcessRecord(stats, info, proc, uid); + final ProcessRecord r = new ProcessRecord(stats, info, proc, uid); + if (!mBooted && !mBooting + && userId == UserHandle.USER_OWNER + && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { + r.persistent = true; + } + return r; } final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated, @@ -9832,8 +9912,7 @@ public final class ActivityManagerService extends ActivityManagerNative + info.packageName + ": " + e); } - if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) - == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) { + if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { app.persistent = true; app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ; } @@ -14121,6 +14200,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean dumpDetails = false; boolean dumpFullDetails = false; boolean dumpDalvik = false; + boolean dumpSummaryOnly = false; boolean oomOnly = false; boolean isCompact = false; boolean localOnly = false; @@ -14141,6 +14221,9 @@ public final class ActivityManagerService extends ActivityManagerNative dumpDalvik = true; } else if ("-c".equals(opt)) { isCompact = true; + } else if ("-s".equals(opt)) { + dumpDetails = true; + dumpSummaryOnly = true; } else if ("--oom".equals(opt)) { oomOnly = true; } else if ("--local".equals(opt)) { @@ -14148,10 +14231,11 @@ public final class ActivityManagerService extends ActivityManagerNative } else if ("--package".equals(opt)) { packages = true; } else if ("-h".equals(opt)) { - pw.println("meminfo dump options: [-a] [-d] [-c] [--oom] [process]"); + pw.println("meminfo dump options: [-a] [-d] [-c] [-s] [--oom] [process]"); pw.println(" -a: include all available information for each process."); pw.println(" -d: include dalvik details."); pw.println(" -c: dump in a compact machine-parseable representation."); + pw.println(" -s: dump only summary of application memory usage."); pw.println(" --oom: only show processes organized by oom adj."); pw.println(" --local: only collect details locally, don't call process."); pw.println(" --package: interpret process arg as package, dumping all"); @@ -14212,7 +14296,7 @@ public final class ActivityManagerService extends ActivityManagerNative mi.dalvikPrivateDirty = (int)tmpLong[0]; } ActivityThread.dumpMemInfoTable(pw, mi, isCheckinRequest, dumpFullDetails, - dumpDalvik, pid, r.baseName, 0, 0, 0, 0, 0, 0); + dumpDalvik, dumpSummaryOnly, pid, r.baseName, 0, 0, 0, 0, 0, 0); if (isCheckinRequest) { pw.println(); } @@ -14278,7 +14362,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (dumpDetails) { if (localOnly) { ActivityThread.dumpMemInfoTable(pw, mi, isCheckinRequest, dumpFullDetails, - dumpDalvik, pid, r.processName, 0, 0, 0, 0, 0, 0); + dumpDalvik, dumpSummaryOnly, pid, r.processName, 0, 0, 0, 0, 0, 0); if (isCheckinRequest) { pw.println(); } @@ -14286,7 +14370,7 @@ public final class ActivityManagerService extends ActivityManagerNative try { pw.flush(); thread.dumpMemInfo(fd, mi, isCheckinRequest, dumpFullDetails, - dumpDalvik, innerArgs); + dumpDalvik, dumpSummaryOnly, innerArgs); } catch (RemoteException e) { if (!isCheckinRequest) { pw.println("Got RemoteException!"); @@ -16071,7 +16155,9 @@ public final class ActivityManagerService extends ActivityManagerNative mBatteryStatsService.notePackageUninstalled(ssp); } } else { - removeTasksByRemovedPackageComponentsLocked(ssp, userId); + cleanupDisabledPackageComponentsLocked(ssp, userId, + intent.getStringArrayExtra( + Intent.EXTRA_CHANGED_COMPONENT_NAME_LIST)); if (userId == UserHandle.USER_OWNER) { mTaskPersister.addOtherDeviceTasksToRecentsLocked(ssp); } @@ -16089,9 +16175,6 @@ public final class ActivityManagerService extends ActivityManagerNative intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); mCompatModePackages.handlePackageAddedLocked(ssp, replacing); - if (replacing) { - removeTasksByRemovedPackageComponentsLocked(ssp, userId); - } if (userId == UserHandle.USER_OWNER) { mTaskPersister.addOtherDeviceTasksToRecentsLocked(ssp); } @@ -19868,6 +19951,14 @@ public final class ActivityManagerService extends ActivityManagerNative return token; } } + + @Override + public ComponentName getHomeActivityForUser(int userId) { + synchronized (ActivityManagerService.this) { + ActivityRecord homeActivity = mStackSupervisor.getHomeActivityForUser(userId); + return homeActivity == null ? null : homeActivity.realActivity; + } + } } private final class SleepTokenImpl extends SleepToken { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 62d70d2fa799..a86df2d2cc56 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -81,6 +81,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Set; /** * State and management of a single stack of activities. @@ -4000,7 +4001,8 @@ final class ActivityStack { } } - boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { + boolean finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses, + boolean doit, boolean evenPersistent, int userId) { boolean didSomething = false; TaskRecord lastTask = null; ComponentName homeActivity = null; @@ -4009,10 +4011,12 @@ final class ActivityStack { int numActivities = activities.size(); for (int activityNdx = 0; activityNdx < numActivities; ++activityNdx) { ActivityRecord r = activities.get(activityNdx); - final boolean samePackage = r.packageName.equals(name) - || (name == null && r.userId == userId); + final boolean sameComponent = + (r.packageName.equals(packageName) && (filterByClasses == null + || filterByClasses.contains(r.realActivity.getClassName()))) + || (packageName == null && r.userId == userId); if ((userId == UserHandle.USER_ALL || r.userId == userId) - && (samePackage || r.task == lastTask) + && (sameComponent || r.task == lastTask) && (r.app == null || evenPersistent || !r.app.persistent)) { if (!doit) { if (r.finishing) { @@ -4032,7 +4036,7 @@ final class ActivityStack { } didSomething = true; Slog.i(TAG, " Force finishing activity " + r); - if (samePackage) { + if (sameComponent) { if (r.app != null) { r.app.removed = true; } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 8c98f9f4f08c..cb5ba8e7bda4 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -118,6 +118,7 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; +import java.util.Set; public final class ActivityStackSupervisor implements DisplayListener { private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; @@ -2507,14 +2508,16 @@ public final class ActivityStackSupervisor implements DisplayListener { /** * @return true if some activity was finished (or would have finished if doit were true). */ - boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { + boolean finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses, + boolean doit, boolean evenPersistent, int userId) { boolean didSomething = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; final int numStacks = stacks.size(); for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { final ActivityStack stack = stacks.get(stackNdx); - if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { + if (stack.finishDisabledPackageActivitiesLocked( + packageName, filterByClasses, doit, evenPersistent, userId)) { didSomething = true; } } @@ -2653,6 +2656,10 @@ public final class ActivityStackSupervisor implements DisplayListener { } ActivityRecord getHomeActivity() { + return getHomeActivityForUser(UserHandle.USER_ALL); + } + + ActivityRecord getHomeActivityForUser(int userId) { final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks(); for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { final TaskRecord task = tasks.get(taskNdx); @@ -2660,7 +2667,8 @@ public final class ActivityStackSupervisor implements DisplayListener { final ArrayList<ActivityRecord> activities = task.mActivities; for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { final ActivityRecord r = activities.get(activityNdx); - if (r.isHomeActivity()) { + if (r.isHomeActivity() + && ((userId == UserHandle.USER_ALL) || (r.userId == userId))) { return r; } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index e5c5dffdf31c..e89ef5724dcd 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -85,7 +85,7 @@ public final class BroadcastQueue { * a bunch of processes to execute IntentReceiver components. Background- * and foreground-priority broadcasts are queued separately. */ - final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<BroadcastRecord>(); + final ArrayList<BroadcastRecord> mParallelBroadcasts = new ArrayList<>(); /** * List of all active broadcasts that are to be executed one at a time. @@ -94,7 +94,7 @@ public final class BroadcastQueue { * broadcasts, separate background- and foreground-priority queues are * maintained. */ - final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<BroadcastRecord>(); + final ArrayList<BroadcastRecord> mOrderedBroadcasts = new ArrayList<>(); /** * Historical data of past broadcasts, for debugging. This is a ring buffer diff --git a/services/core/java/com/android/server/am/ProviderMap.java b/services/core/java/com/android/server/am/ProviderMap.java index 7da8c48dea35..a1dc3e3c0769 100644 --- a/services/core/java/com/android/server/am/ProviderMap.java +++ b/services/core/java/com/android/server/am/ProviderMap.java @@ -31,6 +31,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Set; /** * Keeps track of content providers by authority (name) and class. It separates the mapping by @@ -184,13 +185,17 @@ public final class ProviderMap { } } - private boolean collectForceStopProvidersLocked(String name, int appId, - boolean doit, boolean evenPersistent, int userId, + private boolean collectPackageProvidersLocked(String packageName, + Set<String> filterByClasses, boolean doit, boolean evenPersistent, HashMap<ComponentName, ContentProviderRecord> providers, ArrayList<ContentProviderRecord> result) { boolean didSomething = false; for (ContentProviderRecord provider : providers.values()) { - if ((name == null || provider.info.packageName.equals(name)) + final boolean sameComponent = packageName == null + || (provider.info.packageName.equals(packageName) + && (filterByClasses == null + || filterByClasses.contains(provider.name.getClassName()))); + if (sameComponent && (provider.proc == null || evenPersistent || !provider.proc.persistent)) { if (!doit) { return true; @@ -202,18 +207,18 @@ public final class ProviderMap { return didSomething; } - boolean collectForceStopProviders(String name, int appId, + boolean collectPackageProvidersLocked(String packageName, Set<String> filterByClasses, boolean doit, boolean evenPersistent, int userId, ArrayList<ContentProviderRecord> result) { - boolean didSomething = collectForceStopProvidersLocked(name, appId, doit, - evenPersistent, userId, mSingletonByClass, result); + boolean didSomething = collectPackageProvidersLocked(packageName, filterByClasses, + doit, evenPersistent, mSingletonByClass, result); if (!doit && didSomething) { return true; } if (userId == UserHandle.USER_ALL) { - for (int i=0; i<mProvidersByClassPerUser.size(); i++) { - if (collectForceStopProvidersLocked(name, appId, doit, evenPersistent, - userId, mProvidersByClassPerUser.valueAt(i), result)) { + for (int i = 0; i < mProvidersByClassPerUser.size(); i++) { + if (collectPackageProvidersLocked(packageName, filterByClasses, + doit, evenPersistent, mProvidersByClassPerUser.valueAt(i), result)) { if (!doit) { return true; } @@ -224,8 +229,8 @@ public final class ProviderMap { HashMap<ComponentName, ContentProviderRecord> items = getProvidersByClass(userId); if (items != null) { - didSomething |= collectForceStopProvidersLocked(name, appId, doit, - evenPersistent, userId, items, result); + didSomething |= collectPackageProvidersLocked(packageName, filterByClasses, + doit, evenPersistent, items, result); } } return didSomething; diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 06fba3421af7..2149b7a6246f 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -20,9 +20,13 @@ import static android.Manifest.permission.REMOTE_AUDIO_PLAYBACK; 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.os.Process.FIRST_APPLICATION_UID; +import android.Manifest; import android.app.ActivityManager; +import android.app.ActivityManagerInternal; import android.app.ActivityManagerNative; +import android.app.AppGlobals; import android.app.AppOpsManager; import android.app.KeyguardManager; import android.bluetooth.BluetoothA2dp; @@ -37,7 +41,10 @@ import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.pm.UserInfo; import android.content.res.Configuration; import android.content.res.Resources; import android.content.res.XmlResourceParser; @@ -82,11 +89,13 @@ import android.os.RemoteException; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserHandle; +import android.os.UserManager; import android.os.Vibrator; import android.provider.Settings; import android.provider.Settings.System; import android.telecom.TelecomManager; import android.text.TextUtils; +import android.util.AndroidRuntimeException; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; @@ -102,6 +111,7 @@ import android.view.accessibility.AccessibilityManager; import com.android.internal.util.XmlUtils; import com.android.server.EventLogTags; import com.android.server.LocalServices; +import com.android.server.pm.UserManagerService; import org.xmlpull.v1.XmlPullParserException; @@ -645,6 +655,8 @@ public class AudioService extends IAudioService.Stub { intentFilter.addAction(Intent.ACTION_SCREEN_ON); intentFilter.addAction(Intent.ACTION_SCREEN_OFF); intentFilter.addAction(Intent.ACTION_USER_SWITCHED); + intentFilter.addAction(Intent.ACTION_USER_BACKGROUND); + intentFilter.addAction(Intent.ACTION_USER_FOREGROUND); intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); intentFilter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); @@ -668,7 +680,7 @@ public class AudioService extends IAudioService.Stub { setRotationForAudioSystem(); } - context.registerReceiver(mReceiver, intentFilter); + context.registerReceiverAsUser(mReceiver, UserHandle.ALL, intentFilter, null, null); LocalServices.addService(AudioManagerInternal.class, new AudioServiceInternal()); } @@ -4975,10 +4987,62 @@ public class AudioService extends IAudioService.Stub { 0, 0, mStreamStates[AudioSystem.STREAM_MUSIC], 0); + } else if (action.equals(Intent.ACTION_USER_BACKGROUND)) { + // Disable audio recording for the background user/profile + int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + if (userId >= 0) { + // TODO Kill recording streams instead of killing processes holding permission + UserInfo userInfo = UserManagerService.getInstance().getUserInfo(userId); + killBackgroundUserProcessesWithRecordAudioPermission(userInfo); + } + UserManagerService.getInstance().setSystemControlledUserRestriction( + UserManager.DISALLOW_RECORD_AUDIO, true, userId); + } else if (action.equals(Intent.ACTION_USER_FOREGROUND)) { + // Enable audio recording for foreground user/profile + int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); + UserManagerService.getInstance().setSystemControlledUserRestriction( + UserManager.DISALLOW_RECORD_AUDIO, false, userId); } } } // end class AudioServiceBroadcastReceiver + private void killBackgroundUserProcessesWithRecordAudioPermission(UserInfo oldUser) { + PackageManager pm = mContext.getPackageManager(); + // Find the home activity of the user. It should not be killed to avoid expensive restart, + // when the user switches back. For managed profiles, we should kill all recording apps + ComponentName homeActivityName = null; + if (!oldUser.isManagedProfile()) { + homeActivityName = LocalServices.getService(ActivityManagerInternal.class) + .getHomeActivityForUser(oldUser.id); + } + final String[] permissions = { Manifest.permission.RECORD_AUDIO }; + List<PackageInfo> packages; + try { + packages = AppGlobals.getPackageManager() + .getPackagesHoldingPermissions(permissions, 0, oldUser.id).getList(); + } catch (RemoteException e) { + throw new AndroidRuntimeException(e); + } + for (int j = packages.size() - 1; j >= 0; j--) { + PackageInfo pkg = packages.get(j); + // Skip system processes + if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) { + continue; + } + if (homeActivityName != null + && pkg.packageName.equals(homeActivityName.getPackageName()) + && pkg.applicationInfo.isSystemApp()) { + continue; + } + try { + ActivityManagerNative.getDefault().killUid(pkg.applicationInfo.uid, + "killBackgroundUserProcessesWithAudioRecordPermission"); + } catch (RemoteException e) { + Log.w(TAG, "Error calling killUid", e); + } + } + } + //========================================================================================== // RemoteControlDisplay / RemoteControlClient / Remote info //========================================================================================== diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index a07591c94110..aeecdf3cab02 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -217,14 +217,21 @@ public class Vpn { * @return true if the operation is succeeded. */ public synchronized boolean prepare(String oldPackage, String newPackage) { - if (oldPackage != null && getAppUid(oldPackage, mUserHandle) != mOwnerUID) { - // The package doesn't match. We return false (to obtain user consent) unless the user - // has already consented to that VPN package. - if (!oldPackage.equals(VpnConfig.LEGACY_VPN) && isVpnUserPreConsented(oldPackage)) { - prepareInternal(oldPackage); - return true; + if (oldPackage != null) { + if (getAppUid(oldPackage, mUserHandle) != mOwnerUID) { + // The package doesn't match. We return false (to obtain user consent) unless the + // user has already consented to that VPN package. + if (!oldPackage.equals(VpnConfig.LEGACY_VPN) && isVpnUserPreConsented(oldPackage)) { + prepareInternal(oldPackage); + return true; + } + return false; + } else if (!oldPackage.equals(VpnConfig.LEGACY_VPN) + && !isVpnUserPreConsented(oldPackage)) { + // Currently prepared VPN is revoked, so unprepare it and return false. + prepareInternal(VpnConfig.LEGACY_VPN); + return false; } - return false; } // Return true if we do not need to revoke. @@ -481,6 +488,10 @@ public class Vpn { if (Binder.getCallingUid() != mOwnerUID) { return null; } + // Check to ensure consent hasn't been revoked since we were prepared. + if (!isVpnUserPreConsented(mPackage)) { + return null; + } // Check if the service is properly declared. Intent intent = new Intent(VpnConfig.SERVICE_INTERFACE); intent.setClassName(mPackage, config.user); @@ -488,7 +499,8 @@ public class Vpn { try { // Restricted users are not allowed to create VPNs, they are tied to Owner UserInfo user = mgr.getUserInfo(mUserHandle); - if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) { + if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN, + new UserHandle(mUserHandle))) { throw new SecurityException("Restricted users cannot establish VPNs"); } @@ -896,7 +908,8 @@ public class Vpn { } UserManager mgr = UserManager.get(mContext); UserInfo user = mgr.getUserInfo(mUserHandle); - if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN)) { + if (user.isRestricted() || mgr.hasUserRestriction(UserManager.DISALLOW_CONFIG_VPN, + new UserHandle(mUserHandle))) { throw new SecurityException("Restricted users cannot establish VPNs"); } diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java index 7cccef2e8fcf..3dc282bb7d81 100644 --- a/services/core/java/com/android/server/content/SyncManager.java +++ b/services/core/java/com/android/server/content/SyncManager.java @@ -52,6 +52,7 @@ import android.content.pm.RegisteredServicesCache; import android.content.pm.RegisteredServicesCacheListener; import android.content.pm.ResolveInfo; import android.content.pm.UserInfo; +import android.database.ContentObserver; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.BatteryStats; @@ -99,6 +100,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; @@ -157,7 +159,19 @@ public class SyncManager { /** * How long to wait before considering an active sync to have timed-out, and cancelling it. */ - private static final long ACTIVE_SYNC_TIMEOUT_MILLIS = 30L * 60 * 1000; // 30 mins. + private static final long ACTIVE_SYNC_TIMEOUT_MILLIS = 30L * 60 * 1000; // 30 mins + + /** + * How long to delay each queued {@link SyncHandler} message that may have occurred before boot + * or befor the device became provisioned. + */ + private static final long PER_SYNC_BOOT_DELAY_MILLIS = 3000L; // 3 seconds + + /** + * The maximum amount of time we're willing to delay syncs out of boot, after device has been + * provisioned, etc. + */ + private static final long MAX_SYNC_BOOT_DELAY_MILLIS = 120000L; // 2 minutes private static final String SYNC_WAKE_LOCK_PREFIX = "*sync*/"; private static final String HANDLE_SYNC_ALARM_WAKE_LOCK = "SyncManagerHandleSyncAlarm"; @@ -198,6 +212,9 @@ public class SyncManager { // its accessor, getConnManager(). private ConnectivityManager mConnManagerDoNotUseDirectly; + /** Track whether the device has already been provisioned. */ + private boolean mProvisioned; + protected SyncAdaptersCache mSyncAdapters; private final AppIdleMonitor mAppIdleMonitor; @@ -242,6 +259,7 @@ public class SyncManager { private BroadcastReceiver mBootCompletedReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + mBootCompleted = true; mSyncHandler.onBootCompleted(); } }; @@ -491,12 +509,41 @@ public class SyncManager { mSyncStorageEngine.addStatusChangeListener( ContentResolver.SYNC_OBSERVER_TYPE_SETTINGS, new ISyncStatusObserver.Stub() { - @Override - public void onStatusChanged(int which) { - // force the sync loop to run if the settings change - sendCheckAlarmsMessage(); + @Override + public void onStatusChanged(int which) { + // force the sync loop to run if the settings change + sendCheckAlarmsMessage(); + } + }); + + mProvisioned = isDeviceProvisioned(); + if (!mProvisioned) { + final ContentResolver resolver = context.getContentResolver(); + ContentObserver provisionedObserver = + new ContentObserver(null /* current thread */) { + public void onChange(boolean selfChange) { + mProvisioned |= isDeviceProvisioned(); + if (mProvisioned) { + mSyncHandler.onDeviceProvisioned(); + resolver.unregisterContentObserver(this); + } + } + }; + + synchronized (mSyncHandler) { + resolver.registerContentObserver( + Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), + false /* notifyForDescendents */, + provisionedObserver); + + // The device *may* have been provisioned while we were registering above observer. + // Check again to make sure. + mProvisioned |= isDeviceProvisioned(); + if (mProvisioned) { + resolver.unregisterContentObserver(provisionedObserver); + } } - }); + } if (!factoryTest) { // Register for account list updates for all users @@ -510,6 +557,10 @@ public class SyncManager { mSyncRandomOffsetMillis = mSyncStorageEngine.getSyncRandomOffset() * 1000; } + private boolean isDeviceProvisioned() { + final ContentResolver resolver = mContext.getContentResolver(); + return (Settings.Global.getInt(resolver, Settings.Global.DEVICE_PROVISIONED, 0) != 0); + } /** * Return a random value v that satisfies minValue <= v < maxValue. The difference between * maxValue and minValue must be less than Integer.MAX_VALUE. @@ -2000,20 +2051,36 @@ public class SyncManager { public final SyncTimeTracker mSyncTimeTracker = new SyncTimeTracker(); private final HashMap<String, PowerManager.WakeLock> mWakeLocks = Maps.newHashMap(); - private List<Message> mBootQueue = new ArrayList<Message>(); + private List<Message> mUnreadyQueue = new ArrayList<Message>(); - public void onBootCompleted() { + void onBootCompleted() { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "Boot completed, clearing boot queue."); } doDatabaseCleanup(); synchronized(this) { // Dispatch any stashed messages. - for (Message message : mBootQueue) { - sendMessage(message); + maybeEmptyUnreadyQueueLocked(); + } + } + + void onDeviceProvisioned() { + if (Log.isLoggable(TAG, Log.DEBUG)) { + Log.d(TAG, "mProvisioned=" + mProvisioned); + } + synchronized (this) { + maybeEmptyUnreadyQueueLocked(); + } + } + + private void maybeEmptyUnreadyQueueLocked() { + if (mProvisioned && mBootCompleted) { + // Dispatch any stashed messages. + for (int i=0; i<mUnreadyQueue.size(); i++) { + sendMessageDelayed(mUnreadyQueue.get(i), + Math.max(PER_SYNC_BOOT_DELAY_MILLIS * i, MAX_SYNC_BOOT_DELAY_MILLIS)); } - mBootQueue = null; - mBootCompleted = true; + mUnreadyQueue = null; } } @@ -2030,20 +2097,23 @@ public class SyncManager { } /** - * Stash any messages that come to the handler before boot is complete. - * {@link #onBootCompleted()} will disable this and dispatch all the messages collected. + * Stash any messages that come to the handler before boot is complete or before the device + * is properly provisioned (i.e. out of set-up wizard). + * {@link #onBootCompleted()} and {@link #onDeviceProvisioned(boolean)} both need to come + * in before we start syncing. * @param msg Message to dispatch at a later point. * @return true if a message was enqueued, false otherwise. This is to avoid losing the * message if we manage to acquire the lock but by the time we do boot has completed. */ private boolean tryEnqueueMessageUntilReadyToRun(Message msg) { synchronized (this) { - if (!mBootCompleted) { + if (!mBootCompleted || !mProvisioned) { // Need to copy the message bc looper will recycle it. - mBootQueue.add(Message.obtain(msg)); + mUnreadyQueue.add(Message.obtain(msg)); return true; + } else { + return false; } - return false; } } @@ -2100,7 +2170,7 @@ public class SyncManager { } cancelActiveSync(expiredContext.mSyncOperation.target, expiredContext.mSyncOperation.extras); - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); break; case SyncHandler.MESSAGE_CANCEL: { @@ -2111,7 +2181,7 @@ public class SyncManager { + payload + " bundle: " + extras); } cancelActiveSyncLocked(payload, extras); - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); break; } @@ -2120,17 +2190,17 @@ public class SyncManager { Log.v(TAG, "handleSyncHandlerMessage: MESSAGE_SYNC_FINISHED"); } SyncHandlerMessagePayload payload = (SyncHandlerMessagePayload) msg.obj; - if (!isSyncStillActive(payload.activeSyncContext)) { + if (!isSyncStillActiveH(payload.activeSyncContext)) { Log.d(TAG, "handleSyncHandlerMessage: dropping since the " + "sync is no longer active: " + payload.activeSyncContext); break; } - runSyncFinishedOrCanceledLocked(payload.syncResult, + runSyncFinishedOrCanceledH(payload.syncResult, payload.activeSyncContext); // since a sync just finished check if it is time to start a new sync - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); break; case SyncHandler.MESSAGE_SERVICE_CONNECTED: { @@ -2140,7 +2210,7 @@ public class SyncManager { + msgData.activeSyncContext); } // check that this isn't an old message - if (isSyncStillActive(msgData.activeSyncContext)) { + if (isSyncStillActiveH(msgData.activeSyncContext)) { runBoundToAdapter( msgData.activeSyncContext, msgData.adapter); @@ -2156,7 +2226,7 @@ public class SyncManager { + currentSyncContext); } // check that this isn't an old message - if (isSyncStillActive(currentSyncContext)) { + if (isSyncStillActiveH(currentSyncContext)) { // cancel the sync if we have a syncadapter, which means one is // outstanding try { @@ -2174,10 +2244,10 @@ public class SyncManager { // which is a soft error SyncResult syncResult = new SyncResult(); syncResult.stats.numIoExceptions++; - runSyncFinishedOrCanceledLocked(syncResult, currentSyncContext); + runSyncFinishedOrCanceledH(syncResult, currentSyncContext); // since a sync just finished check if it is time to start a new sync - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); } break; @@ -2190,7 +2260,7 @@ public class SyncManager { } mAlarmScheduleTime = null; try { - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); } finally { mHandleAlarmWakeLock.release(); } @@ -2201,7 +2271,7 @@ public class SyncManager { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "handleSyncHandlerMessage: MESSAGE_CHECK_ALARMS"); } - nextPendingSyncTime = maybeStartNextSyncLocked(); + nextPendingSyncTime = maybeStartNextSyncH(); break; } } finally { @@ -2393,7 +2463,7 @@ public class SyncManager { 0 : (earliestFuturePollTime - nowAbsolute)); } - private long maybeStartNextSyncLocked() { + private long maybeStartNextSyncH() { final boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE); if (isLoggable) Log.v(TAG, "maybeStartNextSync"); @@ -2612,7 +2682,7 @@ public class SyncManager { } if (toReschedule != null) { - runSyncFinishedOrCanceledLocked(null, toReschedule); + runSyncFinishedOrCanceledH(null, toReschedule); scheduleSyncOperation(toReschedule.mSyncOperation); } synchronized (mSyncQueue) { @@ -2845,14 +2915,14 @@ public class SyncManager { false /* no config settings */)) { continue; } - runSyncFinishedOrCanceledLocked(null /* no result since this is a cancel */, + runSyncFinishedOrCanceledH(null /* no result since this is a cancel */, activeSyncContext); } } } - private void runSyncFinishedOrCanceledLocked(SyncResult syncResult, - ActiveSyncContext activeSyncContext) { + private void runSyncFinishedOrCanceledH(SyncResult syncResult, + ActiveSyncContext activeSyncContext) { boolean isLoggable = Log.isLoggable(TAG, Log.VERBOSE); final SyncOperation syncOperation = activeSyncContext.mSyncOperation; @@ -3257,7 +3327,7 @@ public class SyncManager { } } - private boolean isSyncStillActive(ActiveSyncContext activeSyncContext) { + private boolean isSyncStillActiveH(ActiveSyncContext activeSyncContext) { for (ActiveSyncContext sync : mActiveSyncContexts) { if (sync == activeSyncContext) { return true; diff --git a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java index 6f59b54d56ce..7f961ae84840 100644 --- a/services/core/java/com/android/server/display/VirtualDisplayAdapter.java +++ b/services/core/java/com/android/server/display/VirtualDisplayAdapter.java @@ -82,7 +82,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { appToken.linkToDeath(device, 0); } catch (RemoteException ex) { mVirtualDisplayDevices.remove(appToken); - device.destroyLocked(); + device.destroyLocked(false); return null; } @@ -110,7 +110,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { public DisplayDevice releaseVirtualDisplayLocked(IBinder appToken) { VirtualDisplayDevice device = mVirtualDisplayDevices.remove(appToken); if (device != null) { - device.destroyLocked(); + device.destroyLocked(true); appToken.unlinkToDeath(device, 0); } @@ -147,7 +147,7 @@ final class VirtualDisplayAdapter extends DisplayAdapter { if (device != null) { Slog.i(TAG, "Virtual display device released because application token died: " + device.mOwnerPackageName); - device.destroyLocked(); + device.destroyLocked(false); sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_REMOVED); } } @@ -205,19 +205,19 @@ final class VirtualDisplayAdapter extends DisplayAdapter { @Override public void binderDied() { synchronized (getSyncRoot()) { - if (mSurface != null) { - handleBinderDiedLocked(mAppToken); - } + handleBinderDiedLocked(mAppToken); } } - public void destroyLocked() { + public void destroyLocked(boolean binderAlive) { if (mSurface != null) { mSurface.release(); mSurface = null; } SurfaceControl.destroyDisplay(getDisplayTokenLocked()); - mCallback.dispatchDisplayStopped(); + if (binderAlive) { + mCallback.dispatchDisplayStopped(); + } } @Override diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java index e434f396fc8f..8c12060abc06 100644 --- a/services/core/java/com/android/server/hdmi/Constants.java +++ b/services/core/java/com/android/server/hdmi/Constants.java @@ -214,6 +214,10 @@ final class Constants { // values which denotes the device type in HDMI Spec 1.4. static final String PROPERTY_DEVICE_TYPE = "ro.hdmi.device_type"; + // TODO(OEM): Set this to false to keep the playback device in sleep upon hotplug event. + // True by default. + static final String PROPERTY_WAKE_ON_HOTPLUG = "ro.hdmi.wake_on_hotplug"; + // Set to false to allow playback device to go to suspend mode even // when it's an active source. True by default. static final String PROPERTY_KEEP_AWAKE = "persist.sys.hdmi.keep_awake"; diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index 89ffe457fd0e..fd3364a6034b 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -34,6 +34,9 @@ import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly; final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { private static final String TAG = "HdmiCecLocalDevicePlayback"; + private static final boolean WAKE_ON_HOTPLUG = + SystemProperties.getBoolean(Constants.PROPERTY_WAKE_ON_HOTPLUG, true); + private boolean mIsActiveSource = false; // Used to keep the device awake while it is the active source. For devices that @@ -130,7 +133,7 @@ final class HdmiCecLocalDevicePlayback extends HdmiCecLocalDevice { assertRunOnServiceThread(); mCecMessageCache.flushAll(); // We'll not clear mIsActiveSource on the hotplug event to pass CETC 11.2.2-2 ~ 3. - if (connected && mService.isPowerStandbyOrTransient()) { + if (WAKE_ON_HOTPLUG && connected && mService.isPowerStandbyOrTransient()) { mService.wakeUp(); } if (!connected) { diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java index 5ac027dc54ab..51ba32d3b597 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java @@ -486,6 +486,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiLogger.debug("Input not ready for device: %X; buffering the command", info.getId()); mDelayedMessageBuffer.add(message); } else { + updateDevicePowerStatus(logicalAddress, HdmiControlManager.POWER_STATUS_ON); ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress); ActiveSourceHandler.create(this, null).process(activeSource, info.getDeviceType()); } @@ -905,14 +906,22 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { @ServiceThreadOnly private void updateArcFeatureStatus(int portId, boolean isConnected) { assertRunOnServiceThread(); + HdmiPortInfo portInfo = mService.getPortInfo(portId); + if (!portInfo.isArcSupported()) { + return; + } HdmiDeviceInfo avr = getAvrDeviceInfo(); if (avr == null) { + if (isConnected) { + // Update the status (since TV may not have seen AVR yet) so + // that ARC can be initiated after discovery. + mArcFeatureEnabled.put(portId, isConnected); + } return; } // HEAC 2.4, HEACT 5-15 // Should not activate ARC if +5V status is false. - HdmiPortInfo portInfo = mService.getPortInfo(portId); - if (avr.getPortId() == portId && portInfo.isArcSupported()) { + if (avr.getPortId() == portId) { changeArcFeatureEnabled(portId, isConnected); } } @@ -1613,6 +1622,8 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { super.disableDevice(initiatedByCec, callback); clearDeviceInfoList(); + getActiveSource().invalidate(); + setActivePath(Constants.INVALID_PHYSICAL_ADDRESS); checkIfPendingActionsCleared(); } diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java index 09d050148df1..dca762c9f07f 100644 --- a/services/core/java/com/android/server/media/MediaSessionRecord.java +++ b/services/core/java/com/android/server/media/MediaSessionRecord.java @@ -27,9 +27,6 @@ import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.Rating; import android.media.VolumeProvider; -import android.media.routing.IMediaRouter; -import android.media.routing.IMediaRouterDelegate; -import android.media.routing.IMediaRouterStateCallback; import android.media.session.ISession; import android.media.session.ISessionCallback; import android.media.session.ISessionController; @@ -718,11 +715,6 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { } @Override - public void setMediaRouter(IMediaRouter router) { - mHandler.post(MessageHandler.MSG_UPDATE_SESSION_STATE); - } - - @Override public void setMediaButtonReceiver(PendingIntent pi) { mMediaButtonReceiver = pi; } @@ -1209,13 +1201,6 @@ public class MediaSessionRecord implements IBinder.DeathRecipient { public boolean isTransportControlEnabled() { return MediaSessionRecord.this.isTransportControlEnabled(); } - - @Override - public IMediaRouterDelegate createMediaRouterDelegate( - IMediaRouterStateCallback callback) { - // todo - return null; - } } private class MessageHandler extends Handler { diff --git a/services/core/java/com/android/server/notification/CalendarTracker.java b/services/core/java/com/android/server/notification/CalendarTracker.java index 28da73ccb3ed..71d7f19ef2fc 100644 --- a/services/core/java/com/android/server/notification/CalendarTracker.java +++ b/services/core/java/com/android/server/notification/CalendarTracker.java @@ -16,6 +16,8 @@ package com.android.server.notification; +import static android.service.notification.ZenModeConfig.EventInfo.ANY_CALENDAR; + import android.content.ContentResolver; import android.content.ContentUris; import android.content.Context; @@ -150,7 +152,7 @@ public class CalendarTracker { eventId, owner, calendarId)); final boolean meetsTime = time >= begin && time < end; final boolean meetsCalendar = visible - && (filter.calendar == 0 || filter.calendar == calendarId) + && (filter.calendar == ANY_CALENDAR || filter.calendar == calendarId) && availability != Instances.AVAILABILITY_FREE; if (meetsCalendar) { if (DEBUG) Log.d(TAG, " MEETS CALENDAR"); diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index b92c734365d3..6f8e3cac058b 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -189,6 +189,10 @@ abstract public class ManagedServices { } } + public boolean isComponentEnabledForPackage(String pkg) { + return mEnabledServicesPackageNames.contains(pkg); + } + public void onPackagesChanged(boolean queryReplace, String[] pkgList) { if (DEBUG) Slog.d(TAG, "onPackagesChanged queryReplace=" + queryReplace + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList)) diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 25998da26785..791c1de42b95 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -37,7 +37,6 @@ import android.app.NotificationManager.Policy; import android.app.PendingIntent; import android.app.StatusBarManager; import android.app.usage.UsageEvents; -import android.app.usage.UsageStats; import android.app.usage.UsageStatsManagerInternal; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -233,7 +232,7 @@ public class NotificationManagerService extends SystemService { new ArrayMap<String, NotificationRecord>(); final ArrayList<ToastRecord> mToastQueue = new ArrayList<ToastRecord>(); final ArrayMap<String, NotificationRecord> mSummaryByGroupKey = new ArrayMap<>(); - private final ArrayMap<String, Policy.Token> mPolicyTokens = new ArrayMap<>(); + private final ArrayMap<String, Boolean> mPolicyAccess = new ArrayMap<>(); // The last key in this list owns the hardware. @@ -899,6 +898,7 @@ public class NotificationManagerService extends SystemService { @Override void onZenModeChanged() { + sendRegisteredOnlyBroadcast(NotificationManager.ACTION_INTERRUPTION_FILTER_CHANGED); synchronized(mNotificationList) { updateInterruptionFilterLocked(); } @@ -906,9 +906,12 @@ public class NotificationManagerService extends SystemService { @Override void onPolicyChanged() { - getContext().sendBroadcast( - new Intent(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)); + sendRegisteredOnlyBroadcast(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED); + } + + private void sendRegisteredOnlyBroadcast(String action) { + getContext().sendBroadcast(new Intent(action) + .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY)); } }); final File systemDir = new File(Environment.getDataDirectory(), "system"); @@ -1607,6 +1610,19 @@ public class NotificationManagerService extends SystemService { } @Override + public void setInterruptionFilter(String pkg, int filter) throws RemoteException { + enforcePolicyAccess(pkg, "setInterruptionFilter"); + final int zen = NotificationManager.zenModeFromInterruptionFilter(filter, -1); + if (zen == -1) throw new IllegalArgumentException("Invalid filter: " + filter); + final long identity = Binder.clearCallingIdentity(); + try { + mZenModeHelper.setManualZenMode(zen, null, "setInterruptionFilter"); + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + @Override public void notifyConditions(String pkg, IConditionProvider provider, Condition[] conditions) { final ManagedServiceInfo info = mConditionProviders.checkServiceToken(provider); @@ -1641,16 +1657,19 @@ public class NotificationManagerService extends SystemService { message); } - private void enforcePolicyToken(Policy.Token token, String method) { - if (!checkPolicyToken(token)) { - Slog.w(TAG, "Invalid notification policy token calling " + method); - throw new SecurityException("Invalid notification policy token"); + private void enforcePolicyAccess(String pkg, String method) { + if (!checkPolicyAccess(pkg)) { + Slog.w(TAG, "Notification policy access denied calling " + method); + throw new SecurityException("Notification policy access denied"); } } - private boolean checkPolicyToken(Policy.Token token) { - return mPolicyTokens.containsValue(token) - || mListeners.mPolicyTokens.containsValue(token); + private boolean checkPackagePolicyAccess(String pkg) { + return Boolean.TRUE.equals(mPolicyAccess.get(pkg)); + } + + private boolean checkPolicyAccess(String pkg) { + return checkPackagePolicyAccess(pkg) || mListeners.isComponentEnabledForPackage(pkg); } @Override @@ -1702,52 +1721,76 @@ public class NotificationManagerService extends SystemService { } @Override - public Policy.Token getPolicyTokenFromListener(INotificationListener listener) { + public void requestNotificationPolicyAccess(String pkg, + INotificationManagerCallback callback) throws RemoteException { + if (callback == null) { + Slog.w(TAG, "requestNotificationPolicyAccess: no callback specified"); + return; + } + if (pkg == null) { + Slog.w(TAG, "requestNotificationPolicyAccess denied: no package specified"); + callback.onPolicyRequestResult(false); + return; + } final long identity = Binder.clearCallingIdentity(); try { - return mListeners.getPolicyToken(listener); + synchronized (mNotificationList) { + // immediately grant for now + mPolicyAccess.put(pkg, true); + if (DBG) Slog.w(TAG, "requestNotificationPolicyAccess granted for " + pkg); + } } finally { Binder.restoreCallingIdentity(identity); } + callback.onPolicyRequestResult(true); } @Override - public void requestNotificationPolicyToken(String pkg, - INotificationManagerCallback callback) throws RemoteException { - if (callback == null) { - Slog.w(TAG, "requestNotificationPolicyToken: no callback specified"); - return; - } - if (pkg == null) { - Slog.w(TAG, "requestNotificationPolicyToken denied: no package specified"); - callback.onPolicyToken(null); - return; - } - Policy.Token token = null; + public boolean isNotificationPolicyAccessGranted(String pkg) { + return checkPolicyAccess(pkg); + } + + @Override + public boolean isNotificationPolicyAccessGrantedForPackage(String pkg) { + enforceSystemOrSystemUI("request policy access status for another package"); + return checkPackagePolicyAccess(pkg); + } + + @Override + public String[] getPackagesRequestingNotificationPolicyAccess() + throws RemoteException { + enforceSystemOrSystemUI("request policy access packages"); final long identity = Binder.clearCallingIdentity(); try { synchronized (mNotificationList) { - token = mPolicyTokens.get(pkg); - if (token == null) { - token = new Policy.Token(new Binder()); - mPolicyTokens.put(pkg, token); + final String[] rt = new String[mPolicyAccess.size()]; + for (int i = 0; i < mPolicyAccess.size(); i++) { + rt[i] = mPolicyAccess.keyAt(i); } - if (DBG) Slog.w(TAG, "requestNotificationPolicyToken granted for " + pkg); + return rt; } } finally { Binder.restoreCallingIdentity(identity); } - callback.onPolicyToken(token); } @Override - public boolean isNotificationPolicyTokenValid(String pkg, Policy.Token token) { - return checkPolicyToken(token); + public void setNotificationPolicyAccessGranted(String pkg, boolean granted) + throws RemoteException { + enforceSystemOrSystemUI("grant notification policy access"); + final long identity = Binder.clearCallingIdentity(); + try { + synchronized (mNotificationList) { + mPolicyAccess.put(pkg, granted); + } + } finally { + Binder.restoreCallingIdentity(identity); + } } @Override - public Policy getNotificationPolicy(Policy.Token token) { - enforcePolicyToken(token, "getNotificationPolicy"); + public Policy getNotificationPolicy(String pkg) { + enforcePolicyAccess(pkg, "getNotificationPolicy"); final long identity = Binder.clearCallingIdentity(); try { return mZenModeHelper.getNotificationPolicy(); @@ -1757,8 +1800,8 @@ public class NotificationManagerService extends SystemService { } @Override - public void setNotificationPolicy(Policy.Token token, Policy policy) { - enforcePolicyToken(token, "setNotificationPolicy"); + public void setNotificationPolicy(String pkg, Policy policy) { + enforcePolicyAccess(pkg, "setNotificationPolicy"); final long identity = Binder.clearCallingIdentity(); try { mZenModeHelper.setNotificationPolicy(policy); @@ -1881,11 +1924,9 @@ public class NotificationManagerService extends SystemService { pw.print(listener.component); } pw.println(')'); - pw.print(" mPolicyTokens.keys: "); - pw.println(TextUtils.join(",", mPolicyTokens.keySet())); - pw.print(" mListeners.mPolicyTokens.keys: "); - pw.println(TextUtils.join(",", mListeners.mPolicyTokens.keySet())); } + pw.println("\n Policy access:"); + pw.print(" mPolicyAccess: "); pw.println(mPolicyAccess); pw.println("\n Condition providers:"); mConditionProviders.dump(pw, filter); @@ -3138,18 +3179,12 @@ public class NotificationManagerService extends SystemService { public class NotificationListeners extends ManagedServices { private final ArraySet<ManagedServiceInfo> mLightTrimListeners = new ArraySet<>(); - private final ArrayMap<ComponentName, Policy.Token> mPolicyTokens = new ArrayMap<>(); private boolean mNotificationGroupsDesired; public NotificationListeners() { super(getContext(), mHandler, mNotificationList, mUserProfiles); } - public Policy.Token getPolicyToken(INotificationListener listener) { - final ManagedServiceInfo info = checkServiceTokenLocked(listener); - return info == null ? null : mPolicyTokens.get(info.component); - } - @Override protected Config getConfig() { Config c = new Config(); @@ -3174,7 +3209,6 @@ public class NotificationManagerService extends SystemService { synchronized (mNotificationList) { updateNotificationGroupsDesiredLocked(); update = makeRankingUpdateLocked(info); - mPolicyTokens.put(info.component, new Policy.Token(new Binder())); } try { listener.onListenerConnected(update); @@ -3191,7 +3225,6 @@ public class NotificationManagerService extends SystemService { } mLightTrimListeners.remove(removed); updateNotificationGroupsDesiredLocked(); - mPolicyTokens.remove(removed.component); } public void setOnNotificationPostedTrimLocked(ManagedServiceInfo info, int trim) { diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java index e97def82d436..aeb6b78e39e1 100644 --- a/services/core/java/com/android/server/notification/ZenModeHelper.java +++ b/services/core/java/com/android/server/notification/ZenModeHelper.java @@ -22,6 +22,7 @@ import static android.media.AudioAttributes.USAGE_NOTIFICATION; import static android.media.AudioAttributes.USAGE_NOTIFICATION_RINGTONE; import android.app.AppOpsManager; +import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.ComponentName; import android.content.ContentResolver; @@ -42,6 +43,7 @@ import android.provider.Settings.Global; import android.service.notification.IConditionListener; import android.service.notification.NotificationListenerService; import android.service.notification.ZenModeConfig; +import android.service.notification.ZenModeConfig.EventInfo; import android.service.notification.ZenModeConfig.ScheduleInfo; import android.service.notification.ZenModeConfig.ZenRule; import android.util.ArraySet; @@ -90,6 +92,7 @@ public class ZenModeHelper { mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE); mDefaultConfig = readDefaultConfig(context.getResources()); appendDefaultScheduleRules(mDefaultConfig); + appendDefaultEventRules(mDefaultConfig); mConfig = mDefaultConfig; mSettingsObserver = new SettingsObserver(mHandler); mSettingsObserver.observe(); @@ -142,11 +145,11 @@ public class ZenModeHelper { } public int getZenModeListenerInterruptionFilter() { - return getZenModeListenerInterruptionFilter(mZenMode); + return NotificationManager.zenModeToInterruptionFilter(mZenMode); } - public void requestFromListener(ComponentName name, int interruptionFilter) { - final int newZen = zenModeFromListenerInterruptionFilter(interruptionFilter, -1); + public void requestFromListener(ComponentName name, int filter) { + final int newZen = NotificationManager.zenModeFromInterruptionFilter(filter, -1); if (newZen != -1) { setManualZenMode(newZen, null, "listener:" + (name != null ? name.flattenToShortString() : null)); @@ -393,37 +396,6 @@ public class ZenModeHelper { } } - private static int getZenModeListenerInterruptionFilter(int zen) { - switch (zen) { - case Global.ZEN_MODE_OFF: - return NotificationListenerService.INTERRUPTION_FILTER_ALL; - case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: - return NotificationListenerService.INTERRUPTION_FILTER_PRIORITY; - case Global.ZEN_MODE_ALARMS: - return NotificationListenerService.INTERRUPTION_FILTER_ALARMS; - case Global.ZEN_MODE_NO_INTERRUPTIONS: - return NotificationListenerService.INTERRUPTION_FILTER_NONE; - default: - return 0; - } - } - - private static int zenModeFromListenerInterruptionFilter(int listenerInterruptionFilter, - int defValue) { - switch (listenerInterruptionFilter) { - case NotificationListenerService.INTERRUPTION_FILTER_ALL: - return Global.ZEN_MODE_OFF; - case NotificationListenerService.INTERRUPTION_FILTER_PRIORITY: - return Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; - case NotificationListenerService.INTERRUPTION_FILTER_ALARMS: - return Global.ZEN_MODE_ALARMS; - case NotificationListenerService.INTERRUPTION_FILTER_NONE: - return Global.ZEN_MODE_NO_INTERRUPTIONS; - default: - return defValue; - } - } - private ZenModeConfig readDefaultConfig(Resources resources) { XmlResourceParser parser = null; try { @@ -469,6 +441,20 @@ public class ZenModeHelper { config.automaticRules.put(config.newRuleId(), rule2); } + private void appendDefaultEventRules(ZenModeConfig config) { + if (config == null) return; + + final EventInfo events = new EventInfo(); + events.calendar = EventInfo.ANY_CALENDAR; + events.reply = EventInfo.REPLY_YES_OR_MAYBE; + final ZenRule rule = new ZenRule(); + rule.enabled = false; + rule.name = mContext.getResources().getString(R.string.zen_mode_default_events_name); + rule.conditionId = ZenModeConfig.toEventConditionId(events); + rule.zenMode = Global.ZEN_MODE_ALARMS; + config.automaticRules.put(config.newRuleId(), rule); + } + private static int zenSeverity(int zen) { switch (zen) { case Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS: return 1; @@ -511,6 +497,7 @@ public class ZenModeHelper { Log.i(TAG, "No existing V1 downtime found, generating default schedules"); appendDefaultScheduleRules(rt); } + appendDefaultEventRules(rt); return rt; } }; diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index a42e4e72a507..b505f7e131c8 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.List; import dalvik.system.DexFile; -import dalvik.system.StaleDexCacheError; import static com.android.server.pm.InstructionSets.getAppDexInstructionSets; import static com.android.server.pm.InstructionSets.getDexCodeInstructionSets; @@ -112,61 +111,60 @@ final class PackageDexOptimizer { } for (String path : paths) { - try { - final int dexoptNeeded; - if (forceDex) { - dexoptNeeded = DexFile.DEX2OAT_NEEDED; - } else { - dexoptNeeded = DexFile.getDexOptNeeded(path, - pkg.packageName, dexCodeInstructionSet, defer); + final int dexoptNeeded; + if (forceDex) { + dexoptNeeded = DexFile.DEX2OAT_NEEDED; + } else { + try { + dexoptNeeded = DexFile.getDexOptNeeded(path, pkg.packageName, + dexCodeInstructionSet, defer); + } catch (IOException ioe) { + Slog.w(TAG, "IOException reading apk: " + path, ioe); + return DEX_OPT_FAILED; } + } - if (!forceDex && defer && dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) { - // We're deciding to defer a needed dexopt. Don't bother dexopting for other - // paths and instruction sets. We'll deal with them all together when we process - // our list of deferred dexopts. - addPackageForDeferredDexopt(pkg); - return DEX_OPT_DEFERRED; - } + if (!forceDex && defer && dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) { + // We're deciding to defer a needed dexopt. Don't bother dexopting for other + // paths and instruction sets. We'll deal with them all together when we process + // our list of deferred dexopts. + addPackageForDeferredDexopt(pkg); + return DEX_OPT_DEFERRED; + } - if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) { - final String dexoptType; - String oatDir = null; - if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) { - dexoptType = "dex2oat"; + if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) { + final String dexoptType; + String oatDir = null; + if (dexoptNeeded == DexFile.DEX2OAT_NEEDED) { + dexoptType = "dex2oat"; + try { oatDir = createOatDirIfSupported(pkg, dexCodeInstructionSet); - } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) { - dexoptType = "patchoat"; - } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) { - dexoptType = "self patchoat"; - } else { - throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded); - } - Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg=" - + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet - + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable - + " oatDir = " + oatDir); - final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid); - final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid, - !pkg.isForwardLocked(), pkg.packageName, dexCodeInstructionSet, - dexoptNeeded, vmSafeMode, debuggable, oatDir); - if (ret < 0) { + } catch (IOException ioe) { + Slog.w(TAG, "Unable to create oatDir for package: " + pkg.packageName); return DEX_OPT_FAILED; } + } else if (dexoptNeeded == DexFile.PATCHOAT_NEEDED) { + dexoptType = "patchoat"; + } else if (dexoptNeeded == DexFile.SELF_PATCHOAT_NEEDED) { + dexoptType = "self patchoat"; + } else { + throw new IllegalStateException("Invalid dexopt needed: " + dexoptNeeded); + } + + Log.i(TAG, "Running dexopt (" + dexoptType + ") on: " + path + " pkg=" + + pkg.applicationInfo.packageName + " isa=" + dexCodeInstructionSet + + " vmSafeMode=" + vmSafeMode + " debuggable=" + debuggable + + " oatDir = " + oatDir); + final int sharedGid = UserHandle.getSharedAppGid(pkg.applicationInfo.uid); + final int ret = mPackageManagerService.mInstaller.dexopt(path, sharedGid, + !pkg.isForwardLocked(), pkg.packageName, dexCodeInstructionSet, + dexoptNeeded, vmSafeMode, debuggable, oatDir); + + // Dex2oat might fail due to compiler / verifier errors. We soldier on + // regardless, and attempt to interpret the app as a safety net. + if (ret == 0) { performedDexOpt = true; } - } catch (FileNotFoundException e) { - Slog.w(TAG, "Apk not found for dexopt: " + path); - return DEX_OPT_FAILED; - } catch (IOException e) { - Slog.w(TAG, "IOException reading apk: " + path, e); - return DEX_OPT_FAILED; - } catch (StaleDexCacheError e) { - Slog.w(TAG, "StaleDexCacheError when reading apk: " + path, e); - return DEX_OPT_FAILED; - } catch (Exception e) { - Slog.w(TAG, "Exception when doing dexopt : ", e); - return DEX_OPT_FAILED; } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f30a56746ab3..a120c1f7958c 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11853,6 +11853,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mPackages) { if (deletedPs != null) { if ((flags&PackageManager.DELETE_KEEP_DATA) == 0) { + clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL); if (outInfo != null) { mSettings.mKeySetManagerService.removeAppKeySetDataLPw(packageName); outInfo.removedAppId = mSettings.removePackageLPw(packageName); @@ -11883,7 +11884,6 @@ public class PackageManagerService extends IPackageManager.Stub { } } clearPackagePreferredActivitiesLPw(deletedPs.name, UserHandle.USER_ALL); - clearIntentFilterVerificationsLPw(deletedPs.name, UserHandle.USER_ALL); } // make sure to preserve per-user disabled state if this removal was just // a downgrade of a system app to the factory package @@ -12744,13 +12744,16 @@ public class PackageManagerService extends IPackageManager.Stub { /** This method takes a specific user id as well as UserHandle.USER_ALL. */ void clearIntentFilterVerificationsLPw(String packageName, int userId) { if (userId == UserHandle.USER_ALL) { - mSettings.removeIntentFilterVerificationLPw(packageName, sUserManager.getUserIds()); - for (int oneUserId : sUserManager.getUserIds()) { - scheduleWritePackageRestrictionsLocked(oneUserId); + if (mSettings.removeIntentFilterVerificationLPw(packageName, + sUserManager.getUserIds())) { + for (int oneUserId : sUserManager.getUserIds()) { + scheduleWritePackageRestrictionsLocked(oneUserId); + } } } else { - mSettings.removeIntentFilterVerificationLPw(packageName, userId); - scheduleWritePackageRestrictionsLocked(userId); + if (mSettings.removeIntentFilterVerificationLPw(packageName, userId)) { + scheduleWritePackageRestrictionsLocked(userId); + } } } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index d476bfde8301..fd70ce11ca0c 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -1067,19 +1067,22 @@ final class Settings { return result; } - void removeIntentFilterVerificationLPw(String packageName, int userId) { + boolean removeIntentFilterVerificationLPw(String packageName, int userId) { PackageSetting ps = mPackages.get(packageName); if (ps == null) { Slog.w(PackageManagerService.TAG, "No package known for name: " + packageName); - return; + return false; } ps.clearDomainVerificationStatusForUser(userId); + return true; } - void removeIntentFilterVerificationLPw(String packageName, int[] userIds) { + boolean removeIntentFilterVerificationLPw(String packageName, int[] userIds) { + boolean result = false; for (int userId : userIds) { - removeIntentFilterVerificationLPw(packageName, userId); + result |= removeIntentFilterVerificationLPw(packageName, userId); } + return result; } boolean setDefaultBrowserPackageNameLPr(String packageName, int userId) { diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index e79a20618139..8dccfdfb2271 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -50,6 +50,8 @@ import android.util.SparseBooleanArray; import android.util.TimeUtils; import android.util.Xml; +import com.google.android.collect.Sets; + import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.IAppOpsService; import com.android.internal.util.ArrayUtils; @@ -68,11 +70,9 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; import java.util.ArrayList; import java.util.List; +import java.util.Set; import libcore.io.IoUtils; @@ -88,10 +88,6 @@ public class UserManagerService extends IUserManager.Stub { private static final String ATTR_ID = "id"; private static final String ATTR_CREATION_TIME = "created"; private static final String ATTR_LAST_LOGGED_IN_TIME = "lastLoggedIn"; - private static final String ATTR_SALT = "salt"; - private static final String ATTR_PIN_HASH = "pinHash"; - private static final String ATTR_FAILED_ATTEMPTS = "failedAttempts"; - private static final String ATTR_LAST_RETRY_MS = "lastAttemptMs"; private static final String ATTR_SERIAL_NO = "serialNumber"; private static final String ATTR_NEXT_SERIAL_NO = "nextSerialNumber"; private static final String ATTR_PARTIAL = "partial"; @@ -129,16 +125,13 @@ public class UserManagerService extends IUserManager.Stub { private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms - // Number of attempts before jumping to the next BACKOFF_TIMES slot - private static final int BACKOFF_INC_INTERVAL = 5; - // Maximum number of managed profiles permitted is 1. This cannot be increased // without first making sure that the rest of the framework is prepared for it. private static final int MAX_MANAGED_PROFILES = 1; - // Amount of time to force the user to wait before entering the PIN again, after failing - // BACKOFF_INC_INTERVAL times. - private static final int[] BACKOFF_TIMES = { 0, 30*1000, 60*1000, 5*60*1000, 30*60*1000 }; + // Set of user restrictions, which can only be enforced by the system + private static final Set<String> SYSTEM_CONTROLLED_RESTRICTIONS = Sets.newArraySet( + UserManager.DISALLOW_RECORD_AUDIO); static final int WRITE_USER_MSG = 1; static final int WRITE_USER_DELAY = 2*1000; // 2 seconds @@ -158,16 +151,6 @@ public class UserManagerService extends IUserManager.Stub { private final SparseArray<Bundle> mUserRestrictions = new SparseArray<Bundle>(); private final Bundle mGuestRestrictions = new Bundle(); - class RestrictionsPinState { - long salt; - String pinHash; - int failedAttempts; - long lastAttemptTime; - } - - private final SparseArray<RestrictionsPinState> mRestrictionsPinStates = - new SparseArray<RestrictionsPinState>(); - /** * Set of user IDs being actively removed. Removed IDs linger in this set * for several seconds to work around a VFS caching issue. @@ -234,6 +217,14 @@ public class UserManagerService extends IUserManager.Stub { mUserListFile = new File(mUsersDir, USER_LIST_FILENAME); initDefaultGuestRestrictions(); readUserListLocked(); + sInstance = this; + } + } + } + + void systemReady() { + synchronized (mInstallLock) { + synchronized (mPackagesLock) { // Prune out any partially created/partially removed users. ArrayList<UserInfo> partials = new ArrayList<UserInfo>(); for (int i = 0; i < mUsers.size(); i++) { @@ -248,12 +239,8 @@ public class UserManagerService extends IUserManager.Stub { + " (name=" + ui.name + ")"); removeUserStateLocked(ui.id); } - sInstance = this; } } - } - - void systemReady() { userForeground(UserHandle.USER_OWNER); mAppOpsService = IAppOpsService.Stub.asInterface( ServiceManager.getService(Context.APP_OPS_SERVICE)); @@ -520,7 +507,7 @@ public class UserManagerService extends IUserManager.Stub { public boolean hasUserRestriction(String restrictionKey, int userId) { synchronized (mPackagesLock) { Bundle restrictions = mUserRestrictions.get(userId); - return restrictions != null ? restrictions.getBoolean(restrictionKey) : false; + return restrictions != null && restrictions.getBoolean(restrictionKey); } } @@ -535,23 +522,57 @@ public class UserManagerService extends IUserManager.Stub { } @Override + public void setUserRestriction(String key, boolean value, int userId) { + synchronized (mPackagesLock) { + if (!SYSTEM_CONTROLLED_RESTRICTIONS.contains(key)) { + Bundle restrictions = getUserRestrictions(userId); + restrictions.putBoolean(key, value); + setUserRestrictionsInternalLocked(restrictions, userId); + } + } + } + + @Override + public void setSystemControlledUserRestriction(String key, boolean value, int userId) { + checkSystemOrRoot("setSystemControlledUserRestriction"); + synchronized (mPackagesLock) { + Bundle restrictions = getUserRestrictions(userId); + restrictions.putBoolean(key, value); + setUserRestrictionsInternalLocked(restrictions, userId); + } + } + + @Override public void setUserRestrictions(Bundle restrictions, int userId) { checkManageUsersPermission("setUserRestrictions"); if (restrictions == null) return; synchronized (mPackagesLock) { - mUserRestrictions.get(userId).clear(); - mUserRestrictions.get(userId).putAll(restrictions); - long token = Binder.clearCallingIdentity(); - try { - mAppOpsService.setUserRestrictions(mUserRestrictions.get(userId), userId); - } catch (RemoteException e) { - Log.w(LOG_TAG, "Unable to notify AppOpsService of UserRestrictions"); - } finally { - Binder.restoreCallingIdentity(token); + final Bundle oldUserRestrictions = mUserRestrictions.get(userId); + // Restore the original state of system controlled restrictions from oldUserRestrictions + for (String key : SYSTEM_CONTROLLED_RESTRICTIONS) { + restrictions.remove(key); + if (oldUserRestrictions.containsKey(key)) { + restrictions.putBoolean(key, oldUserRestrictions.getBoolean(key)); + } } - scheduleWriteUserLocked(mUsers.get(userId)); + setUserRestrictionsInternalLocked(restrictions, userId); + } + } + + private void setUserRestrictionsInternalLocked(Bundle restrictions, int userId) { + final Bundle userRestrictions = mUserRestrictions.get(userId); + userRestrictions.clear(); + userRestrictions.putAll(restrictions); + long token = Binder.clearCallingIdentity(); + try { + mAppOpsService.setUserRestrictions(userRestrictions, userId); + } catch (RemoteException e) { + Log.w(LOG_TAG, "Unable to notify AppOpsService of UserRestrictions"); + } finally { + Binder.restoreCallingIdentity(token); } + scheduleWriteUserLocked(mUsers.get(userId)); } /** @@ -589,6 +610,13 @@ public class UserManagerService extends IUserManager.Stub { } } + private static void checkSystemOrRoot(String message) { + final int uid = Binder.getCallingUid(); + if (uid != Process.SYSTEM_UID && uid != 0) { + throw new SecurityException("Only system may call: " + message); + } + } + private void writeBitmapLocked(UserInfo info, Bitmap bitmap) { try { File dir = new File(mUsersDir, Integer.toString(info.id)); @@ -806,21 +834,6 @@ public class UserManagerService extends IUserManager.Stub { serializer.attribute(null, ATTR_CREATION_TIME, Long.toString(userInfo.creationTime)); serializer.attribute(null, ATTR_LAST_LOGGED_IN_TIME, Long.toString(userInfo.lastLoggedInTime)); - RestrictionsPinState pinState = mRestrictionsPinStates.get(userInfo.id); - if (pinState != null) { - if (pinState.salt != 0) { - serializer.attribute(null, ATTR_SALT, Long.toString(pinState.salt)); - } - if (pinState.pinHash != null) { - serializer.attribute(null, ATTR_PIN_HASH, pinState.pinHash); - } - if (pinState.failedAttempts != 0) { - serializer.attribute(null, ATTR_FAILED_ATTEMPTS, - Integer.toString(pinState.failedAttempts)); - serializer.attribute(null, ATTR_LAST_RETRY_MS, - Long.toString(pinState.lastAttemptTime)); - } - } if (userInfo.iconPath != null) { serializer.attribute(null, ATTR_ICON_PATH, userInfo.iconPath); } @@ -940,11 +953,7 @@ public class UserManagerService extends IUserManager.Stub { String iconPath = null; long creationTime = 0L; long lastLoggedInTime = 0L; - long salt = 0L; - String pinHash = null; - int failedAttempts = 0; int profileGroupId = UserInfo.NO_PROFILE_GROUP_ID; - long lastAttemptTime = 0L; boolean partial = false; boolean guestToRemove = false; Bundle restrictions = new Bundle(); @@ -978,10 +987,6 @@ public class UserManagerService extends IUserManager.Stub { iconPath = parser.getAttributeValue(null, ATTR_ICON_PATH); creationTime = readLongAttribute(parser, ATTR_CREATION_TIME, 0); lastLoggedInTime = readLongAttribute(parser, ATTR_LAST_LOGGED_IN_TIME, 0); - salt = readLongAttribute(parser, ATTR_SALT, 0L); - pinHash = parser.getAttributeValue(null, ATTR_PIN_HASH); - failedAttempts = readIntAttribute(parser, ATTR_FAILED_ATTEMPTS, 0); - lastAttemptTime = readLongAttribute(parser, ATTR_LAST_RETRY_MS, 0L); profileGroupId = readIntAttribute(parser, ATTR_PROFILE_GROUP_ID, UserInfo.NO_PROFILE_GROUP_ID); String valueString = parser.getAttributeValue(null, ATTR_PARTIAL); @@ -1019,17 +1024,6 @@ public class UserManagerService extends IUserManager.Stub { userInfo.guestToRemove = guestToRemove; userInfo.profileGroupId = profileGroupId; mUserRestrictions.append(id, restrictions); - if (salt != 0L) { - RestrictionsPinState pinState = mRestrictionsPinStates.get(id); - if (pinState == null) { - pinState = new RestrictionsPinState(); - mRestrictionsPinStates.put(id, pinState); - } - pinState.salt = salt; - pinState.pinHash = pinHash; - pinState.failedAttempts = failedAttempts; - pinState.lastAttemptTime = lastAttemptTime; - } return userInfo; } catch (IOException ioe) { @@ -1431,8 +1425,6 @@ public class UserManagerService extends IUserManager.Stub { // Remove this user from the list mUsers.remove(userHandle); - - mRestrictionsPinStates.remove(userHandle); // Remove user file AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + XML_SUFFIX)); userFile.delete(); @@ -1504,92 +1496,6 @@ public class UserManagerService extends IUserManager.Stub { } @Override - public boolean setRestrictionsChallenge(String newPin) { - checkManageUsersPermission("Only system can modify the restrictions pin"); - int userId = UserHandle.getCallingUserId(); - synchronized (mPackagesLock) { - RestrictionsPinState pinState = mRestrictionsPinStates.get(userId); - if (pinState == null) { - pinState = new RestrictionsPinState(); - } - if (newPin == null) { - pinState.salt = 0; - pinState.pinHash = null; - } else { - try { - pinState.salt = SecureRandom.getInstance("SHA1PRNG").nextLong(); - } catch (NoSuchAlgorithmException e) { - pinState.salt = (long) (Math.random() * Long.MAX_VALUE); - } - pinState.pinHash = passwordToHash(newPin, pinState.salt); - pinState.failedAttempts = 0; - } - mRestrictionsPinStates.put(userId, pinState); - writeUserLocked(mUsers.get(userId)); - } - return true; - } - - @Override - public int checkRestrictionsChallenge(String pin) { - checkManageUsersPermission("Only system can verify the restrictions pin"); - int userId = UserHandle.getCallingUserId(); - synchronized (mPackagesLock) { - RestrictionsPinState pinState = mRestrictionsPinStates.get(userId); - // If there's no pin set, return error code - if (pinState == null || pinState.salt == 0 || pinState.pinHash == null) { - return UserManager.PIN_VERIFICATION_FAILED_NOT_SET; - } else if (pin == null) { - // If just checking if user can be prompted, return remaining time - int waitTime = getRemainingTimeForPinAttempt(pinState); - Slog.d(LOG_TAG, "Remaining waittime peek=" + waitTime); - return waitTime; - } else { - int waitTime = getRemainingTimeForPinAttempt(pinState); - Slog.d(LOG_TAG, "Remaining waittime=" + waitTime); - if (waitTime > 0) { - return waitTime; - } - if (passwordToHash(pin, pinState.salt).equals(pinState.pinHash)) { - pinState.failedAttempts = 0; - scheduleWriteUserLocked(mUsers.get(userId)); - return UserManager.PIN_VERIFICATION_SUCCESS; - } else { - pinState.failedAttempts++; - pinState.lastAttemptTime = System.currentTimeMillis(); - scheduleWriteUserLocked(mUsers.get(userId)); - return waitTime; - } - } - } - } - - private int getRemainingTimeForPinAttempt(RestrictionsPinState pinState) { - int backoffIndex = Math.min(pinState.failedAttempts / BACKOFF_INC_INTERVAL, - BACKOFF_TIMES.length - 1); - int backoffTime = (pinState.failedAttempts % BACKOFF_INC_INTERVAL) == 0 ? - BACKOFF_TIMES[backoffIndex] : 0; - return (int) Math.max(backoffTime + pinState.lastAttemptTime - System.currentTimeMillis(), - 0); - } - - @Override - public boolean hasRestrictionsChallenge() { - int userId = UserHandle.getCallingUserId(); - synchronized (mPackagesLock) { - return hasRestrictionsPinLocked(userId); - } - } - - private boolean hasRestrictionsPinLocked(int userId) { - RestrictionsPinState pinState = mRestrictionsPinStates.get(userId); - if (pinState == null || pinState.salt == 0 || pinState.pinHash == null) { - return false; - } - return true; - } - - @Override public void removeRestrictions() { checkManageUsersPermission("Only system can remove restrictions"); final int userHandle = UserHandle.getCallingUserId(); @@ -1600,8 +1506,6 @@ public class UserManagerService extends IUserManager.Stub { synchronized (mPackagesLock) { // Remove all user restrictions setUserRestrictions(new Bundle(), userHandle); - // Remove restrictions pin - setRestrictionsChallenge(null); // Remove any app restrictions cleanAppRestrictions(userHandle); } @@ -1633,42 +1537,6 @@ public class UserManagerService extends IUserManager.Stub { } }); } - - /* - * Generate a hash for the given password. To avoid brute force attacks, we use a salted hash. - * Not the most secure, but it is at least a second level of protection. First level is that - * the file is in a location only readable by the system process. - * @param password the password. - * @param salt the randomly generated salt - * @return the hash of the pattern in a String. - */ - private String passwordToHash(String password, long salt) { - if (password == null) { - return null; - } - String algo = null; - String hashed = salt + password; - try { - byte[] saltedPassword = (password + salt).getBytes(); - byte[] sha1 = MessageDigest.getInstance(algo = "SHA-1").digest(saltedPassword); - byte[] md5 = MessageDigest.getInstance(algo = "MD5").digest(saltedPassword); - hashed = toHex(sha1) + toHex(md5); - } catch (NoSuchAlgorithmException e) { - Log.w(LOG_TAG, "Failed to encode string because of missing algorithm: " + algo); - } - return hashed; - } - - private static String toHex(byte[] ary) { - final String hex = "0123456789ABCDEF"; - String ret = ""; - for (int i = 0; i < ary.length; i++) { - ret += hex.charAt((ary[i] >> 4) & 0xf); - ret += hex.charAt(ary[i] & 0xf); - } - return ret; - } - private int getUidForPackage(String packageName) { long ident = Binder.clearCallingIdentity(); try { @@ -1954,11 +1822,6 @@ public class UserManagerService extends IUserManager.Stub { return RESTRICTIONS_FILE_PREFIX + packageName + XML_SUFFIX; } - private String restrictionsFileNameToPackage(String fileName) { - return fileName.substring(RESTRICTIONS_FILE_PREFIX.length(), - (int) (fileName.length() - XML_SUFFIX.length())); - } - @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) diff --git a/services/core/java/com/android/server/policy/BarController.java b/services/core/java/com/android/server/policy/BarController.java index e972ec72cc31..5877b3eb8598 100644 --- a/services/core/java/com/android/server/policy/BarController.java +++ b/services/core/java/com/android/server/policy/BarController.java @@ -58,6 +58,9 @@ public class BarController { private int mTransientBarState; private boolean mPendingShow; private long mLastTranslucent; + private boolean mShowTransparent; + private boolean mSetUnHideFlagWhenNextTransparent; + private boolean mNoAnimationOnNextShow; public BarController(String tag, int transientFlag, int unhideFlag, int translucentFlag, int statusBarManagerId, int translucentWmFlag) { @@ -74,6 +77,14 @@ public class BarController { mWin = win; } + public void setShowTransparent(boolean transparent) { + if (transparent != mShowTransparent) { + mShowTransparent = transparent; + mSetUnHideFlagWhenNextTransparent = transparent; + mNoAnimationOnNextShow = true; + } + } + public void showTransient() { if (mWin != null) { setTransientBarState(TRANSIENT_BAR_SHOW_REQUESTED); @@ -135,7 +146,9 @@ public class BarController { } final boolean wasVis = mWin.isVisibleLw(); final boolean wasAnim = mWin.isAnimatingLw(); - final boolean change = show ? mWin.showLw(true) : mWin.hideLw(true); + final boolean change = show ? mWin.showLw(!mNoAnimationOnNextShow) + : mWin.hideLw(!mNoAnimationOnNextShow); + mNoAnimationOnNextShow = false; final int state = computeStateLw(wasVis, wasAnim, mWin, change); final boolean stateChanged = updateStateLw(state); return change || stateChanged; @@ -233,6 +246,13 @@ public class BarController { setTransientBarState(TRANSIENT_BAR_NONE); // request denied } } + if (mShowTransparent) { + vis |= View.SYSTEM_UI_TRANSPARENT; + if (mSetUnHideFlagWhenNextTransparent) { + vis |= mUnhideFlag; + mSetUnHideFlagWhenNextTransparent = false; + } + } if (mTransientBarState != TRANSIENT_BAR_NONE) { vis |= mTransientFlag; // ignore clear requests until transition completes vis &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE; // never show transient bars in low profile diff --git a/services/core/java/com/android/server/policy/GlobalActions.java b/services/core/java/com/android/server/policy/GlobalActions.java index b431b33598f4..3cee9279c018 100644 --- a/services/core/java/com/android/server/policy/GlobalActions.java +++ b/services/core/java/com/android/server/policy/GlobalActions.java @@ -1138,7 +1138,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac public GlobalActionsDialog(Context context, AlertParams params) { super(context, getDialogTheme(context)); - mContext = context; + mContext = getContext(); mAlert = new AlertController(mContext, this, getWindow()); mAdapter = (MyAdapter) params.mAdapter; mWindowTouchSlop = ViewConfiguration.get(context).getScaledWindowTouchSlop(); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 51503ec295fc..185ef03200a9 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -93,7 +93,7 @@ import android.view.KeyCharacterMap; import android.view.KeyCharacterMap.FallbackAction; import android.view.KeyEvent; import android.view.MotionEvent; -import android.view.PhoneWindow; +import com.android.internal.policy.PhoneWindow; import android.view.Surface; import android.view.View; import android.view.ViewConfiguration; @@ -476,6 +476,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mTopIsFullscreen; boolean mForceStatusBar; boolean mForceStatusBarFromKeyguard; + private boolean mForceStatusBarTransparent; boolean mHideLockScreen; boolean mForcingShowNavBar; int mForcingShowNavBarLayer; @@ -4129,6 +4130,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mAppsThatDismissKeyguard.clear(); mForceStatusBar = false; mForceStatusBarFromKeyguard = false; + mForceStatusBarTransparent = false; mForcingShowNavBar = false; mForcingShowNavBarLayer = -1; @@ -4154,8 +4156,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { mForcingShowNavBar = true; mForcingShowNavBarLayer = win.getSurfaceLayer(); } - if (attrs.type == TYPE_STATUS_BAR && (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { - mForceStatusBarFromKeyguard = true; + if (attrs.type == TYPE_STATUS_BAR) { + if ((attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { + mForceStatusBarFromKeyguard = true; + } + if ((attrs.privateFlags & PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT) != 0) { + mForceStatusBarTransparent = true; + } } boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW @@ -4302,7 +4309,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (DEBUG_LAYOUT) Slog.i(TAG, "force=" + mForceStatusBar + " forcefkg=" + mForceStatusBarFromKeyguard + " top=" + mTopFullscreenOpaqueWindowState); - if (mForceStatusBar || mForceStatusBarFromKeyguard) { + boolean shouldBeTransparent = mForceStatusBarTransparent + && !mForceStatusBar + && !mForceStatusBarFromKeyguard; + if (!shouldBeTransparent) { + mStatusBarController.setShowTransparent(false /* transparent */); + } else if (!mStatusBar.isVisibleLw()) { + mStatusBarController.setShowTransparent(true /* transparent */); + } + if (mForceStatusBar || mForceStatusBarFromKeyguard || mForceStatusBarTransparent) { if (DEBUG_LAYOUT) Slog.v(TAG, "Showing status bar: forced"); if (mStatusBarController.setBarShowingLw(true)) { changes |= FINISH_LAYOUT_REDO_LAYOUT; diff --git a/services/core/java/com/android/server/power/Notifier.java b/services/core/java/com/android/server/power/Notifier.java index c48367e3e6d0..fd98010e5032 100644 --- a/services/core/java/com/android/server/power/Notifier.java +++ b/services/core/java/com/android/server/power/Notifier.java @@ -539,9 +539,11 @@ final class Notifier { }; private void playWirelessChargingStartedSound() { + final boolean enabled = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.CHARGING_SOUNDS_ENABLED, 1) != 0; final String soundPath = Settings.Global.getString(mContext.getContentResolver(), Settings.Global.WIRELESS_CHARGING_STARTED_SOUND); - if (soundPath != null) { + if (enabled && soundPath != null) { final Uri soundUri = Uri.parse("file://" + soundPath); if (soundUri != null) { final Ringtone sfx = RingtoneManager.getRingtone(mContext, soundUri); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6f01ca02b580..67c198fe6d54 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2897,7 +2897,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { boolean callerIsDeviceOwnerAdmin = isCallerDeviceOwnerOrInitializer(callingUid); boolean doNotAskCredentialsOnBoot = - (flags & DevicePolicyManager.DO_NOT_ASK_CREDENTIALS_ON_BOOT) != 0; + (flags & DevicePolicyManager.RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT) != 0; if (callerIsDeviceOwnerAdmin && doNotAskCredentialsOnBoot) { setDoNotAskCredentialsOnBoot(); } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 2d265e2446f9..925a6091354a 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -28,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.content.res.Resources.Theme; import android.os.Build; import android.os.Environment; import android.os.FactoryTest; @@ -291,7 +292,7 @@ public final class SystemServer { private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); - mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); + mSystemContext.setTheme(android.R.style.Theme_Material_DayNight_DarkActionBar); } /** @@ -1026,6 +1027,12 @@ public final class SystemServer { w.getDefaultDisplay().getMetrics(metrics); context.getResources().updateConfiguration(config, metrics); + // The system context's theme may be configuration-dependent. + final Theme systemTheme = context.getTheme(); + if (systemTheme.getChangingConfigurations() != 0) { + systemTheme.rebase(); + } + try { // TODO: use boot phase mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService()); diff --git a/services/midi/java/com/android/server/midi/MidiService.java b/services/midi/java/com/android/server/midi/MidiService.java index c1c5c566aae8..176f54b1d63e 100644 --- a/services/midi/java/com/android/server/midi/MidiService.java +++ b/services/midi/java/com/android/server/midi/MidiService.java @@ -294,8 +294,10 @@ public class MidiService extends IMidiManager.Stub { @Override public String toString() { - StringBuilder sb = new StringBuilder("Device: "); + StringBuilder sb = new StringBuilder("Device Info: "); sb.append(mDeviceInfo); + sb.append(" Status: "); + sb.append(mDeviceStatus); sb.append(" UID: "); sb.append(mUid); return sb.toString(); diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 117cbe4b5bc2..48b127aeac78 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -718,10 +718,10 @@ public class UsageStatsService extends SystemService implements } @Override - public boolean isAppIdle(String packageName, int userId) { + public boolean isAppInactive(String packageName, int userId) { try { userId = ActivityManagerNative.getDefault().handleIncomingUser(Binder.getCallingPid(), - Binder.getCallingUid(), userId, false, true, "isAppIdle", null); + Binder.getCallingUid(), userId, false, true, "isAppInactive", null); } catch (RemoteException re) { return false; } @@ -734,7 +734,7 @@ public class UsageStatsService extends SystemService implements } @Override - public void setAppIdle(String packageName, boolean idle, int userId) { + public void setAppInactive(String packageName, boolean idle, int userId) { final int callingUid = Binder.getCallingUid(); try { userId = ActivityManagerNative.getDefault().handleIncomingUser( diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 6adb8be6c78b..f84beb60de6d 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -78,8 +78,6 @@ public class UsbDeviceManager { "/sys/class/android_usb/android0/functions"; private static final String STATE_PATH = "/sys/class/android_usb/android0/state"; - private static final String MASS_STORAGE_FILE_PATH = - "/sys/class/android_usb/android0/f_mass_storage/lun/file"; private static final String RNDIS_ETH_ADDR_PATH = "/sys/class/android_usb/android0/f_rndis/ethaddr"; private static final String AUDIO_SOURCE_PCM_PATH = @@ -832,8 +830,6 @@ public class UsbDeviceManager { + FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim()); pw.println(" Kernel function list: " + FileUtils.readTextFile(new File(FUNCTIONS_PATH), 0, null).trim()); - pw.println(" Mass storage backing file: " - + FileUtils.readTextFile(new File(MASS_STORAGE_FILE_PATH), 0, null).trim()); } catch (IOException e) { pw.println("IOException: " + e); } @@ -866,15 +862,6 @@ public class UsbDeviceManager { mHandler.sendMessage(MSG_SET_CURRENT_FUNCTIONS, functions, makeDefault); } - public void setMassStorageBackingFile(String path) { - if (path == null) path = ""; - try { - FileUtils.stringToFile(MASS_STORAGE_FILE_PATH, path); - } catch (IOException e) { - Slog.e(TAG, "failed to write to " + MASS_STORAGE_FILE_PATH); - } - } - private void readOemUsbOverrideConfig() { String[] configList = mContext.getResources().getStringArray( com.android.internal.R.array.config_oemUsbModeOverride); diff --git a/services/usb/java/com/android/server/usb/UsbService.java b/services/usb/java/com/android/server/usb/UsbService.java index fda8076d9ac2..e03884fbae0b 100644 --- a/services/usb/java/com/android/server/usb/UsbService.java +++ b/services/usb/java/com/android/server/usb/UsbService.java @@ -271,16 +271,6 @@ public class UsbService extends IUsbManager.Stub { } @Override - public void setMassStorageBackingFile(String path) { - mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); - if (mDeviceManager != null) { - mDeviceManager.setMassStorageBackingFile(path); - } else { - throw new IllegalStateException("USB device mode not supported"); - } - } - - @Override public void allowUsbDebugging(boolean alwaysAllow, String publicKey) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USB, null); mDeviceManager.allowUsbDebugging(alwaysAllow, publicKey); diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java index 2897c616dee7..fcdb6d6cff60 100644 --- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java +++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java @@ -754,7 +754,7 @@ public class VoiceInteractionManagerService extends SystemService { public boolean activeServiceSupportsAssist() { enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE); synchronized (this) { - return mImpl != null && mImpl.mInfo.getSupportsAssist(); + return mImpl != null && mImpl.mInfo != null && mImpl.mInfo.getSupportsAssist(); } } @@ -762,7 +762,8 @@ public class VoiceInteractionManagerService extends SystemService { public boolean activeServiceSupportsLaunchFromKeyguard() throws RemoteException { enforceCallingPermission(Manifest.permission.ACCESS_VOICE_INTERACTION_SERVICE); synchronized (this) { - return mImpl != null && mImpl.mInfo.getSupportsLaunchFromKeyguard(); + return mImpl != null && mImpl.mInfo != null + && mImpl.mInfo.getSupportsLaunchFromKeyguard(); } } diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index 0424548fd1ad..e682697ab338 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -179,7 +179,6 @@ public abstract class Conference implements Conferenceable { /** * Returns VideoProvider of the primary call. This can be null. - * @hide */ public VideoProvider getVideoProvider() { return null; @@ -187,7 +186,6 @@ public abstract class Conference implements Conferenceable { /** * Returns video state of the primary call. - * @hide */ public int getVideoState() { return VideoProfile.VideoState.AUDIO_ONLY; @@ -373,7 +371,6 @@ public abstract class Conference implements Conferenceable { * {@link VideoProfile.VideoState#RX_ENABLED}. * * @param videoState The new video state. - * @hide */ public final void setVideoState(Connection c, int videoState) { Log.d(this, "setVideoState Conference: %s Connection: %s VideoState: %s", @@ -387,7 +384,6 @@ public abstract class Conference implements Conferenceable { * Sets the video connection provider. * * @param videoProvider The video provider. - * @hide */ public final void setVideoProvider(Connection c, Connection.VideoProvider videoProvider) { Log.d(this, "setVideoProvider Conference: %s Connection: %s VideoState: %s", diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 4bc639b7b101..0bf91189b87d 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -106,38 +106,32 @@ public abstract class Connection implements Conferenceable { /** * Local device supports receiving video. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_LOCAL_RX = 0x00000100; /** * Local device supports transmitting video. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_LOCAL_TX = 0x00000200; /** * Local device supports bidirectional video calling. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_LOCAL_BIDIRECTIONAL = CAPABILITY_SUPPORTS_VT_LOCAL_RX | CAPABILITY_SUPPORTS_VT_LOCAL_TX; /** * Remote device supports receiving video. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_REMOTE_RX = 0x00000400; /** * Remote device supports transmitting video. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_REMOTE_TX = 0x00000800; /** * Remote device supports bidirectional video calling. - * @hide */ public static final int CAPABILITY_SUPPORTS_VT_REMOTE_BIDIRECTIONAL = CAPABILITY_SUPPORTS_VT_REMOTE_RX | CAPABILITY_SUPPORTS_VT_REMOTE_TX; @@ -187,14 +181,12 @@ public abstract class Connection implements Conferenceable { /** * Call can be upgraded to a video call. - * @hide */ public static final int CAPABILITY_CAN_UPGRADE_TO_VIDEO = 0x00080000; /** * For video calls, indicates whether the outgoing video for the call can be paused using * the {@link android.telecom.VideoProfile.VideoState#PAUSED} VideoState. - * @hide */ public static final int CAPABILITY_CAN_PAUSE_VIDEO = 0x00100000; @@ -1041,7 +1033,6 @@ public abstract class Connection implements Conferenceable { * {@link VideoProfile.VideoState#RX_ENABLED}. * * @param videoState The new video state. - * @hide */ public final void setVideoState(int videoState) { checkImmutable(); @@ -1105,7 +1096,6 @@ public abstract class Connection implements Conferenceable { /** * Sets the video connection provider. * @param videoProvider The video provider. - * @hide */ public final void setVideoProvider(VideoProvider videoProvider) { checkImmutable(); @@ -1414,7 +1404,6 @@ public abstract class Connection implements Conferenceable { * a request to accept. * * @param videoState The video state in which to answer the connection. - * @hide */ public void onAnswer(int videoState) {} diff --git a/telecomm/java/android/telecom/ConnectionRequest.java b/telecomm/java/android/telecom/ConnectionRequest.java index 71b481b89c77..f5cceea80060 100644 --- a/telecomm/java/android/telecom/ConnectionRequest.java +++ b/telecomm/java/android/telecom/ConnectionRequest.java @@ -50,7 +50,6 @@ public final class ConnectionRequest implements Parcelable { * @param handle The handle (e.g., phone number) to which the {@link Connection} is to connect. * @param extras Application-specific extra data. * @param videoState Determines the video state for the connection. - * @hide */ public ConnectionRequest( PhoneAccountHandle accountHandle, @@ -95,7 +94,6 @@ public final class ConnectionRequest implements Parcelable { * {@link VideoProfile.VideoState#RX_ENABLED}. * * @return The video state for the connection. - * @hide */ public int getVideoState() { return mVideoState; diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index 41856515f434..13eb016e8ec1 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -147,7 +147,6 @@ public abstract class ConnectionService extends Service { } @Override - /** @hide */ public void answerVideo(String callId, int videoState) { SomeArgs args = SomeArgs.obtain(); args.arg1 = callId; diff --git a/telecomm/java/android/telecom/DefaultDialerManager.java b/telecomm/java/android/telecom/DefaultDialerManager.java index fd0c06d66495..d3df1510c406 100644 --- a/telecomm/java/android/telecom/DefaultDialerManager.java +++ b/telecomm/java/android/telecom/DefaultDialerManager.java @@ -20,6 +20,7 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.net.Uri; import android.provider.Settings; import android.text.TextUtils; @@ -151,14 +152,14 @@ public class DefaultDialerManager { for (ResolveInfo resolveInfo : resolveInfoList) { final ActivityInfo activityInfo = resolveInfo.activityInfo; - if (activityInfo == null) { - continue; + if (activityInfo != null && !packageNames.contains(activityInfo.packageName)) { + packageNames.add(activityInfo.packageName); } - packageNames.add(activityInfo.packageName); } - // TODO: Filter for apps that don't handle DIAL intent with tel scheme - return packageNames; + final Intent dialIntentWithTelScheme = new Intent(Intent.ACTION_DIAL); + dialIntentWithTelScheme.setData(Uri.fromParts(PhoneAccount.SCHEME_TEL, "", null)); + return filterByIntent(context, packageNames, dialIntentWithTelScheme); } /** @@ -182,6 +183,36 @@ public class DefaultDialerManager { || packageName.equals(tm.getSystemDialerPackage()); } + /** + * Filter a given list of package names for those packages that contain an activity that has + * an intent filter for a given intent. + * + * @param context A valid context + * @param packageNames List of package names to filter. + * @return The filtered list. + */ + private static List<String> filterByIntent(Context context, List<String> packageNames, + Intent intent) { + if (packageNames == null || packageNames.isEmpty()) { + return new ArrayList<>(); + } + + final List<String> result = new ArrayList<>(); + final List<ResolveInfo> resolveInfoList = + context.getPackageManager().queryIntentActivities(intent, 0); + final int length = resolveInfoList.size(); + for (int i = 0; i < length; i++) { + final ActivityInfo info = resolveInfoList.get(i).activityInfo; + if (info != null && packageNames.contains(info.packageName) + && !result.contains(info.packageName)) { + result.add(info.packageName); + } + } + + return result; + } + + private static TelecomManager getTelecomManager(Context context) { return (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE); } diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 1431eb8be125..ebd3f12d0fc7 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -1143,8 +1143,12 @@ public class TelecomManager { public void placeCall(Uri address, Bundle extras) { ITelecomService service = getTelecomService(); if (service != null) { + if (address == null) { + Log.w(TAG, "Cannot place call to empty address."); + } try { - service.placeCall(address, extras, mContext.getOpPackageName()); + service.placeCall(address, extras == null ? new Bundle() : extras, + mContext.getOpPackageName()); } catch (RemoteException e) { Log.e(TAG, "Error calling ITelecomService#placeCall", e); } diff --git a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java index dd823aeaff00..1f9e63644bde 100644 --- a/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java +++ b/tests/Compatibility/src/com/android/compatibilitytest/AppCompatibility.java @@ -30,6 +30,7 @@ import android.util.Log; import junit.framework.Assert; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -102,7 +103,11 @@ public class AppCompatibility extends InstrumentationTestCase { // otherwise raise an // exception with the first error encountered. assertNull(getStackTrace(err), err); - assertTrue("App crashed after launch.", processStillUp(packageName)); + try { + assertTrue("App crashed after launch.", processStillUp(packageName)); + } finally { + returnHome(); + } } else { Log.d(TAG, "Missing argument, use " + PACKAGE_TO_LAUNCH + " to specify the package to launch"); @@ -138,6 +143,19 @@ public class AppCompatibility extends InstrumentationTestCase { } } + private void returnHome() { + Intent homeIntent = new Intent(Intent.ACTION_MAIN); + homeIntent.addCategory(Intent.CATEGORY_HOME); + homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // Send the "home" intent and wait 2 seconds for us to get there + mContext.startActivity(homeIntent); + try { + Thread.sleep(mWorkspaceLaunchTimeout); + } catch (InterruptedException e) { + // ignore + } + } + /** * Launches and activity and queries for errors. * @@ -150,9 +168,6 @@ public class AppCompatibility extends InstrumentationTestCase { // the recommended way to see if this is a tv or not. boolean isleanback = !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN) && !mPackageManager.hasSystemFeature(PackageManager.FEATURE_TELEPHONY); - Intent homeIntent = new Intent(Intent.ACTION_MAIN); - homeIntent.addCategory(Intent.CATEGORY_HOME); - homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Intent intent; if (isleanback) { Log.d(TAG, "Leanback and relax! " + packageName); @@ -173,14 +188,6 @@ public class AppCompatibility extends InstrumentationTestCase { // ignore } - // Send the "home" intent and wait 2 seconds for us to get there - mContext.startActivity(homeIntent); - try { - Thread.sleep(mWorkspaceLaunchTimeout); - } catch (InterruptedException e) { - // ignore - } - // See if there are any errors. We wait until down here to give ANRs as // much time as // possible to occur. @@ -198,6 +205,13 @@ public class AppCompatibility extends InstrumentationTestCase { return null; } + private boolean ensureForegroundActivity(RunningAppProcessInfo info) { + Log.d(TAG, String.format("ensureForegroundActivity: proc=%s, pid=%d, state=%d", + info.processName, info.pid, info.processState)); + return info.processState == ActivityManager.PROCESS_STATE_TOP + || info.processState == ActivityManager.PROCESS_STATE_TOP_SLEEPING; + } + /** * Determine if a given package is still running. * @@ -207,19 +221,32 @@ public class AppCompatibility extends InstrumentationTestCase { private boolean processStillUp(String packageName) { String processName = getProcessName(packageName); List<RunningAppProcessInfo> runningApps = mActivityManager.getRunningAppProcesses(); + List<RunningAppProcessInfo> relatedProcs = new ArrayList<>(); for (RunningAppProcessInfo app : runningApps) { if (app.processName.equalsIgnoreCase(processName)) { - Log.d(TAG, "Found process " + app.processName); + if (!ensureForegroundActivity(app)) { + Log.w(TAG, "Found process but it's not top activity."); + return false; + } return true; } for (String relatedPackage : app.pkgList) { - if (relatedPackage.equalsIgnoreCase(processName)) { - Log.d(TAG, "Found process " + app.processName); + if (relatedPackage.equalsIgnoreCase(packageName)) { + relatedProcs.add(app); + } + } + } + // now that we are here, we've found no RAPI's directly matching processName, but + // potentially a List of them with one of related packages being processName + if (!relatedProcs.isEmpty()) { + for (RunningAppProcessInfo app : relatedProcs) { + if (ensureForegroundActivity(app)) { return true; } } + Log.w(TAG, "Found related processes, but none has top activity."); } - Log.d(TAG, "Failed to find process " + processName + " with package name " + Log.w(TAG, "Failed to find process " + processName + " with package name " + packageName); return false; } diff --git a/tests/HierarchyViewerTest/.gitignore b/tests/HierarchyViewerTest/.gitignore new file mode 100644 index 000000000000..75eec9832203 --- /dev/null +++ b/tests/HierarchyViewerTest/.gitignore @@ -0,0 +1,6 @@ +.gradle +.idea +*.iml +gradle* +build +local.properties diff --git a/tests/HierarchyViewerTest/Android.mk b/tests/HierarchyViewerTest/Android.mk new file mode 100644 index 000000000000..07b90f0fa638 --- /dev/null +++ b/tests/HierarchyViewerTest/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH:= $(call my-dir) +include $(CLEAR_VARS) + +LOCAL_MODULE_TAGS := tests + +LOCAL_SRC_FILES := $(call all-subdir-java-files) + +LOCAL_PACKAGE_NAME := HierarchyViewerTest + +LOCAL_JAVA_LIBRARIES := android.test.runner + +include $(BUILD_PACKAGE) diff --git a/tests/HierarchyViewerTest/AndroidManifest.xml b/tests/HierarchyViewerTest/AndroidManifest.xml new file mode 100644 index 000000000000..65f2fd3e1a9c --- /dev/null +++ b/tests/HierarchyViewerTest/AndroidManifest.xml @@ -0,0 +1,36 @@ +<!-- + ~ Copyright (C) 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 + --> + +<manifest xmlns:android="http://schemas.android.com/apk/res/android" + package="com.android.test.hierarchyviewer"> + + <application> + <uses-library android:name="android.test.runner" /> + + <activity + android:name=".MainActivity" + android:label="HvTest" > + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + </intent-filter> + </activity> + </application> + + <instrumentation + android:name="android.test.InstrumentationTestRunner" + android:targetPackage="com.android.test.hierarchyviewer" /> +</manifest> diff --git a/tests/HierarchyViewerTest/build.gradle b/tests/HierarchyViewerTest/build.gradle new file mode 100644 index 000000000000..e8cdfa28e180 --- /dev/null +++ b/tests/HierarchyViewerTest/build.gradle @@ -0,0 +1,31 @@ +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.1.0+' + + } +} + +apply plugin: 'com.android.application' + +android { + compileSdkVersion 21 + buildToolsVersion "22.0.0" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + res.srcDirs = ['res'] + } + } +} diff --git a/tests/HierarchyViewerTest/res/layout/activity_main.xml b/tests/HierarchyViewerTest/res/layout/activity_main.xml new file mode 100644 index 000000000000..410a77690a23 --- /dev/null +++ b/tests/HierarchyViewerTest/res/layout/activity_main.xml @@ -0,0 +1,12 @@ +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" + android:layout_height="match_parent"> + + <TextView + android:id="@+id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:scaleX="10" + android:text="@string/test" /> + +</RelativeLayout> diff --git a/tests/HierarchyViewerTest/res/menu/menu_main.xml b/tests/HierarchyViewerTest/res/menu/menu_main.xml new file mode 100644 index 000000000000..9b78a1efb861 --- /dev/null +++ b/tests/HierarchyViewerTest/res/menu/menu_main.xml @@ -0,0 +1,5 @@ +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> + <item android:id="@+id/action_settings" android:title="Settings" + android:orderInCategory="100" android:showAsAction="never" /> +</menu> diff --git a/tests/HierarchyViewerTest/res/values/strings.xml b/tests/HierarchyViewerTest/res/values/strings.xml new file mode 100644 index 000000000000..800ee1c5b396 --- /dev/null +++ b/tests/HierarchyViewerTest/res/values/strings.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <string name="test">Hello World</string> +</resources>
\ No newline at end of file diff --git a/tests/HierarchyViewerTest/run_tests.sh b/tests/HierarchyViewerTest/run_tests.sh new file mode 100644 index 000000000000..094bb4c95638 --- /dev/null +++ b/tests/HierarchyViewerTest/run_tests.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +# Runs the tests in this apk +adb install $OUT/data/app/HierarchyViewerTest/HierarchyViewerTest.apk +adb shell am instrument -w com.android.test.hierarchyviewer/android.test.InstrumentationTestRunner diff --git a/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/Decoder.java b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/Decoder.java new file mode 100644 index 000000000000..c6f147004546 --- /dev/null +++ b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/Decoder.java @@ -0,0 +1,101 @@ +package com.android.test.hierarchyviewer; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.Map; + +public class Decoder { + // Prefixes for simple primitives. These match the JNI definitions. + public static final byte SIG_BOOLEAN = 'Z'; + public static final byte SIG_BYTE = 'B'; + public static final byte SIG_SHORT = 'S'; + public static final byte SIG_INT = 'I'; + public static final byte SIG_LONG = 'J'; + public static final byte SIG_FLOAT = 'F'; + public static final byte SIG_DOUBLE = 'D'; + + // Prefixes for some commonly used objects + public static final byte SIG_STRING = 'R'; + + public static final byte SIG_MAP = 'M'; // a map with an short key + public static final short SIG_END_MAP = 0; + + private final ByteBuffer mBuf; + + public Decoder(byte[] buf) { + this(ByteBuffer.wrap(buf)); + } + + public Decoder(ByteBuffer buf) { + mBuf = buf; + } + + public boolean hasRemaining() { + return mBuf.hasRemaining(); + } + + public Object readObject() { + byte sig = mBuf.get(); + + switch (sig) { + case SIG_BOOLEAN: + return mBuf.get() == 0 ? Boolean.FALSE : Boolean.TRUE; + case SIG_BYTE: + return mBuf.get(); + case SIG_SHORT: + return mBuf.getShort(); + case SIG_INT: + return mBuf.getInt(); + case SIG_LONG: + return mBuf.getLong(); + case SIG_FLOAT: + return mBuf.getFloat(); + case SIG_DOUBLE: + return mBuf.getDouble(); + case SIG_STRING: + return readString(); + case SIG_MAP: + return readMap(); + default: + throw new DecoderException(sig, mBuf.position() - 1); + } + } + + private String readString() { + short len = mBuf.getShort(); + byte[] b = new byte[len]; + mBuf.get(b, 0, len); + return new String(b, Charset.forName("utf-8")); + } + + private Map<Short, Object> readMap() { + Map<Short, Object> m = new HashMap<Short, Object>(); + + while (true) { + Object o = readObject(); + if (!(o instanceof Short)) { + throw new DecoderException("Expected short key, got " + o.getClass()); + } + + Short key = (Short)o; + if (key == SIG_END_MAP) { + break; + } + + m.put(key, readObject()); + } + + return m; + } + + public static class DecoderException extends RuntimeException { + public DecoderException(byte seen, int pos) { + super(String.format("Unexpected byte %c seen at position %d", (char)seen, pos)); + } + + public DecoderException(String msg) { + super(msg); + } + } +} diff --git a/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivity.java b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivity.java new file mode 100644 index 000000000000..3a672735581d --- /dev/null +++ b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivity.java @@ -0,0 +1,44 @@ +package com.android.test.hierarchyviewer; + +import android.app.Activity; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; + + +public class MainActivity extends Activity { + private static final String TAG = "Main"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + View textView = findViewById(R.id.textView); + Log.d(TAG, "x, y = " + textView.getX() + ", " + textView.getY()); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.menu_main, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + // Handle action bar item clicks here. The action bar will + // automatically handle clicks on the Home/Up button, so long + // as you specify a parent activity in AndroidManifest.xml. + int id = item.getItemId(); + + //noinspection SimplifiableIfStatement + if (id == R.id.action_settings) { + return true; + } + + return super.onOptionsItemSelected(item); + } +} diff --git a/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivityTest.java b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivityTest.java new file mode 100644 index 000000000000..ea3710da486e --- /dev/null +++ b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/MainActivityTest.java @@ -0,0 +1,81 @@ +package com.android.test.hierarchyviewer; + +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; + +import java.io.ByteArrayOutputStream; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +public class MainActivityTest extends ActivityInstrumentationTestCase2<MainActivity> { + private MainActivity mActivity; + private View mTextView; + + + public MainActivityTest() { + super(MainActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + + mActivity = getActivity(); + mTextView = mActivity.findViewById(R.id.textView); + } + + private byte[] encode(View view) throws ClassNotFoundException, NoSuchMethodException, + IllegalAccessException, InstantiationException, InvocationTargetException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 1024); + + Object encoder = createEncoder(baos); + invokeMethod(View.class, view, "encode", encoder); + invokeMethod(encoder.getClass(), encoder, "endStream"); + + return baos.toByteArray(); + } + + private Object invokeMethod(Class targetClass, Object target, String methodName, Object... params) + throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class[] paramClasses = new Class[params.length]; + for (int i = 0; i < params.length; i++) { + paramClasses[i] = params[i].getClass(); + } + Method method = targetClass.getDeclaredMethod(methodName, paramClasses); + method.setAccessible(true); + return method.invoke(target, params); + } + + private Object createEncoder(ByteArrayOutputStream baos) throws ClassNotFoundException, + NoSuchMethodException, IllegalAccessException, InvocationTargetException, + InstantiationException { + Class clazz = Class.forName("android.view.ViewHierarchyEncoder"); + Constructor constructor = clazz.getConstructor(ByteArrayOutputStream.class); + return constructor.newInstance(baos); + } + + public void testTextView() throws Exception { + byte[] data = encode(mTextView); + assertNotNull(data); + assertTrue(data.length > 0); + + ViewDumpParser parser = new ViewDumpParser(); + parser.parse(data); + + List<Map<Short, Object>> views = parser.getViews(); + Map<String, Short> propertyNameTable = parser.getIds(); + + assertEquals(1, views.size()); + assertNotNull(propertyNameTable); + + Map<Short, Object> textViewProperties = views.get(0); + assertEquals("android.widget.TextView", + textViewProperties.get(propertyNameTable.get("meta:__name__"))); + + assertEquals(mActivity.getString(R.string.test), + textViewProperties.get(propertyNameTable.get("text:text"))); + } +} diff --git a/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/ViewDumpParser.java b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/ViewDumpParser.java new file mode 100644 index 000000000000..0111bc631650 --- /dev/null +++ b/tests/HierarchyViewerTest/src/com/android/test/hierarchyviewer/ViewDumpParser.java @@ -0,0 +1,73 @@ +package com.android.test.hierarchyviewer; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class ViewDumpParser { + private Map<String, Short> mIds; + private List<Map<Short,Object>> mViews; + + public void parse(byte[] data) { + Decoder d = new Decoder(ByteBuffer.wrap(data)); + + mViews = new ArrayList<>(100); + while (d.hasRemaining()) { + Object o = d.readObject(); + if (o instanceof Map) { + //noinspection unchecked + mViews.add((Map<Short, Object>) o); + } + } + + if (mViews.isEmpty()) { + return; + } + + // the last one is the property map + Map<Short,Object> idMap = mViews.remove(mViews.size() - 1); + mIds = reverse(idMap); + } + + public String getFirstView() { + if (mViews.isEmpty()) { + return null; + } + + Map<Short, Object> props = mViews.get(0); + Object name = getProperty(props, "__name__"); + Object hash = getProperty(props, "__hash__"); + + if (name instanceof String && hash instanceof Integer) { + return String.format(Locale.US, "%s@%x", name, hash); + } else { + return null; + } + } + + private Object getProperty(Map<Short, Object> props, String key) { + return props.get(mIds.get(key)); + } + + private static Map<String, Short> reverse(Map<Short, Object> m) { + Map<String, Short> r = new HashMap<String, Short>(m.size()); + + for (Map.Entry<Short, Object> e : m.entrySet()) { + r.put((String)e.getValue(), e.getKey()); + } + + return r; + } + + public List<Map<Short, Object>> getViews() { + return mViews; + } + + public Map<String, Short> getIds() { + return mIds; + } + +} diff --git a/tests/OneMedia/Android.mk b/tests/OneMedia/Android.mk index b7d7f98bd601..9fc64035a914 100644 --- a/tests/OneMedia/Android.mk +++ b/tests/OneMedia/Android.mk @@ -9,9 +9,6 @@ LOCAL_SRC_FILES := $(call all-subdir-java-files) \ LOCAL_PACKAGE_NAME := OneMedia LOCAL_CERTIFICATE := platform -LOCAL_STATIC_JAVA_LIBRARIES := \ - android-support-media-protocols - LOCAL_JAVA_LIBRARIES += org.apache.http.legacy LOCAL_PROGUARD_ENABLED := disabled diff --git a/tests/OneMedia/AndroidManifest.xml b/tests/OneMedia/AndroidManifest.xml index ef3fad5ebbf3..c6824ecea976 100644 --- a/tests/OneMedia/AndroidManifest.xml +++ b/tests/OneMedia/AndroidManifest.xml @@ -27,15 +27,6 @@ android:name="com.android.onemedia.OnePlayerService" android:exported="true" android:process="com.android.onemedia.service" /> - <service - android:name=".provider.OneMediaRouteProvider" - android:permission="android.permission.BIND_MEDIA_ROUTE_SERVICE" - android:exported="true" - android:process="com.android.onemedia.provider"> - <intent-filter> - <action android:name="android.media.routing.MediaRouteService" /> - </intent-filter> - </service> </application> </manifest> diff --git a/tests/OneMedia/src/com/android/onemedia/PlayerSession.java b/tests/OneMedia/src/com/android/onemedia/PlayerSession.java index 141a209d9936..2455c9ccf59f 100644 --- a/tests/OneMedia/src/com/android/onemedia/PlayerSession.java +++ b/tests/OneMedia/src/com/android/onemedia/PlayerSession.java @@ -19,25 +19,17 @@ import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.media.MediaMetadata; -import android.media.routing.MediaRouteSelector; -import android.media.routing.MediaRouter; -import android.media.routing.MediaRouter.ConnectionRequest; -import android.media.routing.MediaRouter.DestinationInfo; -import android.media.routing.MediaRouter.RouteInfo; import android.media.session.MediaSession; import android.media.session.MediaSession.QueueItem; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; import android.os.Bundle; -import android.support.media.protocols.MediaPlayerProtocol; -import android.support.media.protocols.MediaPlayerProtocol.MediaStatus; import android.os.RemoteException; import android.os.SystemClock; import android.util.Log; import android.view.KeyEvent; import com.android.onemedia.playback.LocalRenderer; -import com.android.onemedia.playback.OneMRPRenderer; import com.android.onemedia.playback.Renderer; import com.android.onemedia.playback.RequestUtils; @@ -48,7 +40,6 @@ public class PlayerSession { private static final String TAG = "PlayerSession"; protected MediaSession mSession; - protected MediaRouter mRouter; protected Context mContext; protected Renderer mRenderer; protected MediaSession.Callback mCallback; @@ -84,22 +75,11 @@ public class PlayerSession { .getSystemService(Context.MEDIA_SESSION_SERVICE); Log.d(TAG, "Creating session for package " + mContext.getBasePackageName()); - mRouter = new MediaRouter(mContext); - mRouter.addSelector(new MediaRouteSelector.Builder() - .addRequiredProtocol(MediaPlayerProtocol.class) - .build()); - mRouter.addSelector(new MediaRouteSelector.Builder() - .setRequiredFeatures(MediaRouter.ROUTE_FEATURE_LIVE_AUDIO) - .setOptionalFeatures(MediaRouter.ROUTE_FEATURE_LIVE_VIDEO) - .build()); - mRouter.setRoutingCallback(new RoutingCallback(), null); - mSession = new MediaSession(mContext, "OneMedia"); mSession.setCallback(mCallback); mSession.setPlaybackState(mPlaybackState); mSession.setFlags(MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSession.FLAG_HANDLES_MEDIA_BUTTONS); - mSession.setMediaRouter(mRouter); mSession.setActive(true); updateMetadata(); } @@ -117,10 +97,6 @@ public class PlayerSession { mSession.release(); mSession = null; } - if (mRouter != null) { - mRouter.release(); - mRouter = null; - } } public void setListener(Listener listener) { @@ -278,63 +254,4 @@ public class PlayerSession { mRenderer.onPause(); } } - - private class RoutingCallback extends MediaRouter.RoutingCallback { - @Override - public void onConnectionStateChanged(int state) { - if (state == MediaRouter.CONNECTION_STATE_CONNECTING) { - if (mRenderer != null) { - mRenderer.onStop(); - } - mRenderer = null; - updateState(PlaybackState.STATE_CONNECTING); - return; - } - - MediaRouter.ConnectionInfo connection = mRouter.getConnection(); - if (connection != null) { - MediaPlayerProtocol protocol = - connection.getProtocolObject(MediaPlayerProtocol.class); - if (protocol != null) { - Log.d(TAG, "Connected to route using media player protocol"); - - protocol.setCallback(new PlayerCallback(), null); - mRenderer = new OneMRPRenderer(protocol); - updateState(PlaybackState.STATE_NONE); - return; - } - } - - // Use local route - mRenderer = new LocalRenderer(mContext, null); - mRenderer.registerListener(mRenderListener); - updateState(PlaybackState.STATE_NONE); - } - } - - private class PlayerCallback extends MediaPlayerProtocol.Callback { - @Override - public void onStatusUpdated(MediaStatus status, Bundle extras) { - if (status != null) { - Log.d(TAG, "Received status update: " + status.toBundle()); - switch (status.getPlayerState()) { - case MediaStatus.PLAYER_STATE_BUFFERING: - updateState(PlaybackState.STATE_BUFFERING); - break; - case MediaStatus.PLAYER_STATE_IDLE: - updateState(PlaybackState.STATE_STOPPED); - break; - case MediaStatus.PLAYER_STATE_PAUSED: - updateState(PlaybackState.STATE_PAUSED); - break; - case MediaStatus.PLAYER_STATE_PLAYING: - updateState(PlaybackState.STATE_PLAYING); - break; - case MediaStatus.PLAYER_STATE_UNKNOWN: - updateState(PlaybackState.STATE_NONE); - break; - } - } - } - } } diff --git a/tests/OneMedia/src/com/android/onemedia/playback/OneMRPRenderer.java b/tests/OneMedia/src/com/android/onemedia/playback/OneMRPRenderer.java deleted file mode 100644 index 55eb92cdb7fe..000000000000 --- a/tests/OneMedia/src/com/android/onemedia/playback/OneMRPRenderer.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.android.onemedia.playback; - -import android.os.Bundle; -import android.support.media.protocols.MediaPlayerProtocol; -import android.support.media.protocols.MediaPlayerProtocol.MediaInfo; - -/** - * Renderer for communicating with the OneMRP route - */ -public class OneMRPRenderer extends Renderer { - private final MediaPlayerProtocol mProtocol; - - public OneMRPRenderer(MediaPlayerProtocol protocol) { - super(null, null); - mProtocol = protocol; - } - - @Override - public void setContent(Bundle request) { - MediaInfo mediaInfo = new MediaInfo(request.getString(RequestUtils.EXTRA_KEY_SOURCE), - MediaInfo.STREAM_TYPE_BUFFERED, "audio/mp3"); - mProtocol.load(mediaInfo, true, 0, null); - } - - @Override - public boolean onStop() { - mProtocol.stop(null); - return true; - } - - @Override - public boolean onPlay() { - mProtocol.play(null); - return true; - } - - @Override - public boolean onPause() { - mProtocol.pause(null); - return true; - } - - @Override - public long getSeekPosition() { - return -1; - } -} diff --git a/tests/OneMedia/src/com/android/onemedia/provider/OneMediaRouteProvider.java b/tests/OneMedia/src/com/android/onemedia/provider/OneMediaRouteProvider.java deleted file mode 100644 index 5845e48db6e5..000000000000 --- a/tests/OneMedia/src/com/android/onemedia/provider/OneMediaRouteProvider.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * 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. - */ -package com.android.onemedia.provider; - -import android.media.routing.MediaRouteSelector; -import android.media.routing.MediaRouteService; -import android.media.routing.MediaRouter.ConnectionInfo; -import android.media.routing.MediaRouter.ConnectionRequest; -import android.media.routing.MediaRouter.DestinationInfo; -import android.media.routing.MediaRouter.DiscoveryRequest; -import android.media.routing.MediaRouter.RouteInfo; -import android.media.session.PlaybackState; -import android.os.Bundle; -import android.os.Handler; -import android.os.Process; -import android.support.media.protocols.MediaPlayerProtocol; -import android.support.media.protocols.MediaPlayerProtocol.MediaInfo; -import android.support.media.protocols.MediaPlayerProtocol.MediaStatus; -import android.os.Looper; -import android.os.ResultReceiver; -import android.os.SystemClock; -import android.util.Log; - -import com.android.onemedia.playback.LocalRenderer; -import com.android.onemedia.playback.Renderer; -import com.android.onemedia.playback.RequestUtils; - -import java.util.ArrayList; - -/** - * Test of MediaRouteProvider. Show a dummy provider with a simple interface for - * playing music. - */ -public class OneMediaRouteProvider extends MediaRouteService { - private static final String TAG = "OneMRP"; - private static final boolean DEBUG = true; - - private static final String TEST_DESTINATION_ID = "testDestination"; - private static final String TEST_ROUTE_ID = "testRoute"; - - private Renderer mRenderer; - private RenderListener mRenderListener; - private PlaybackState mPlaybackState; - private Handler mHandler; - - private OneStub mStub; - - @Override - public void onCreate() { - mHandler = new Handler(); - mRenderer = new LocalRenderer(this, null); - mRenderListener = new RenderListener(); - PlaybackState.Builder bob = new PlaybackState.Builder(); - bob.setActions(PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY); - mPlaybackState = bob.build(); - - mRenderer.registerListener(mRenderListener); - } - - @Override - public ClientSession onCreateClientSession(ClientInfo client) { - if (client.getUid() != Process.myUid()) { - // for testing purposes, only allow connections from this application - // since this provider is not fully featured - return null; - } - return new OneSession(client); - } - - private final class OneSession extends ClientSession { - private final ClientInfo mClient; - - public OneSession(ClientInfo client) { - mClient = client; - } - - @Override - public boolean onStartDiscovery(DiscoveryRequest req, DiscoveryCallback callback) { - for (MediaRouteSelector selector : req.getSelectors()) { - if (isMatch(selector)) { - DestinationInfo destination = new DestinationInfo.Builder( - TEST_DESTINATION_ID, getServiceMetadata(), "OneMedia") - .setDescription("Test route from OneMedia app.") - .build(); - ArrayList<RouteInfo> routes = new ArrayList<RouteInfo>(); - routes.add(new RouteInfo.Builder( - TEST_ROUTE_ID, destination, selector).build()); - callback.onDestinationFound(destination, routes); - return true; - } - } - return false; - } - - @Override - public void onStopDiscovery() { - } - - @Override - public boolean onConnect(ConnectionRequest req, ConnectionCallback callback) { - if (req.getRoute().getId().equals(TEST_ROUTE_ID)) { - mStub = new OneStub(); - ConnectionInfo connection = new ConnectionInfo.Builder(req.getRoute()) - .setProtocolStub(MediaPlayerProtocol.class, mStub) - .build(); - callback.onConnected(connection); - return true; - } - return false; - } - - @Override - public void onDisconnect() { - mStub = null; - } - - private boolean isMatch(MediaRouteSelector selector) { - if (!selector.containsProtocol(MediaPlayerProtocol.class)) { - return false; - } - for (String protocol : selector.getRequiredProtocols()) { - if (!protocol.equals(MediaPlayerProtocol.class.getName())) { - return false; - } - } - return true; - } - } - - private final class OneStub extends MediaPlayerProtocol.Stub { - MediaInfo mMediaInfo; - - public OneStub() { - super(mHandler); - } - - @Override - public void onLoad(MediaInfo mediaInfo, boolean autoplay, long playPosition, - Bundle extras) { - if (DEBUG) { - Log.d(TAG, "Attempting to play " + mediaInfo.getContentId()); - } - // look up the route and send a play command to it - mMediaInfo = mediaInfo; - Bundle bundle = new Bundle(); - bundle.putString(RequestUtils.EXTRA_KEY_SOURCE, mediaInfo.getContentId()); - mRenderer.setContent(bundle); - } - - @Override - public void onPlay(Bundle extras) { - mRenderer.onPlay(); - } - - @Override - public void onPause(Bundle extras) { - mRenderer.onPause(); - } - } - - private class RenderListener implements Renderer.Listener { - - @Override - public void onError(int type, int extra, Bundle extras, Throwable error) { - Log.d(TAG, "Sending onError with type " + type + " and extra " + extra); - sendStatusUpdate(PlaybackState.STATE_ERROR); - } - - @Override - public void onStateChanged(int newState) { - long position = -1; - if (mRenderer != null) { - position = mRenderer.getSeekPosition(); - } - int pbState; - float rate = 0; - String errorMsg = null; - switch (newState) { - case Renderer.STATE_ENDED: - case Renderer.STATE_STOPPED: - pbState = PlaybackState.STATE_STOPPED; - break; - case Renderer.STATE_INIT: - case Renderer.STATE_PREPARING: - pbState = PlaybackState.STATE_BUFFERING; - break; - case Renderer.STATE_ERROR: - pbState = PlaybackState.STATE_ERROR; - break; - case Renderer.STATE_PAUSED: - pbState = PlaybackState.STATE_PAUSED; - break; - case Renderer.STATE_PLAYING: - pbState = PlaybackState.STATE_PLAYING; - rate = 1; - break; - default: - pbState = PlaybackState.STATE_ERROR; - errorMsg = "unknown state"; - break; - } - PlaybackState.Builder bob = new PlaybackState.Builder(mPlaybackState); - bob.setState(pbState, position, rate, SystemClock.elapsedRealtime()); - bob.setErrorMessage(errorMsg); - mPlaybackState = bob.build(); - - sendStatusUpdate(mPlaybackState.getState()); - } - - @Override - public void onBufferingUpdate(int percent) { - } - - @Override - public void onFocusLost() { - Log.d(TAG, "Focus lost, pausing"); - // Don't update state here, we'll get a separate call to - // onStateChanged when it pauses - mRenderer.onPause(); - } - - @Override - public void onNextStarted() { - } - - private void sendStatusUpdate(int state) { - if (mStub != null) { - MediaStatus status = new MediaStatus(1, mStub.mMediaInfo); - switch (state) { - case PlaybackState.STATE_BUFFERING: - case PlaybackState.STATE_FAST_FORWARDING: - case PlaybackState.STATE_REWINDING: - case PlaybackState.STATE_SKIPPING_TO_NEXT: - case PlaybackState.STATE_SKIPPING_TO_PREVIOUS: - status.setPlayerState(MediaStatus.PLAYER_STATE_BUFFERING); - break; - case PlaybackState.STATE_CONNECTING: - case PlaybackState.STATE_STOPPED: - status.setPlayerState(MediaStatus.PLAYER_STATE_IDLE); - break; - case PlaybackState.STATE_PAUSED: - status.setPlayerState(MediaStatus.PLAYER_STATE_PAUSED); - break; - case PlaybackState.STATE_PLAYING: - status.setPlayerState(MediaStatus.PLAYER_STATE_PLAYING); - break; - case PlaybackState.STATE_NONE: - case PlaybackState.STATE_ERROR: - default: - status.setPlayerState(MediaStatus.PLAYER_STATE_UNKNOWN); - break; - } - mStub.sendStatusUpdatedEvent(status, null); - } - } - } -} diff --git a/tests/VoiceInteraction/res/layout/main.xml b/tests/VoiceInteraction/res/layout/main.xml index 34a7563f4eb2..092d37dc4a20 100644 --- a/tests/VoiceInteraction/res/layout/main.xml +++ b/tests/VoiceInteraction/res/layout/main.xml @@ -34,12 +34,6 @@ android:text="@string/asyncStructure" /> - <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:assistBlocked="true" - android:textAppearance="?android:attr/textAppearanceMedium" - android:text="This won't be included in assist." - /> - </LinearLayout> diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/AsyncStructure.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/AsyncStructure.java index 73e04e525878..ae8e9e49aad1 100644 --- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/AsyncStructure.java +++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/AsyncStructure.java @@ -20,7 +20,7 @@ import android.annotation.Nullable; import android.content.Context; import android.util.AttributeSet; import android.view.View; -import android.view.ViewAssistStructure; +import android.view.ViewStructure; import android.widget.TextView; /** @@ -32,9 +32,9 @@ public class AsyncStructure extends TextView { } @Override - public void onProvideVirtualAssistStructure(ViewAssistStructure structure) { + public void onProvideVirtualStructure(ViewStructure structure) { structure.setChildCount(1); - final ViewAssistStructure child = structure.asyncNewChild(0); + final ViewStructure child = structure.asyncNewChild(0); final int width = getWidth(); final int height = getHeight(); (new Thread() { diff --git a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java index 4bd83e92fa3c..41d94b7d03e0 100644 --- a/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java +++ b/tools/layoutlib/bridge/src/android/content/res/Resources_Theme_Delegate.java @@ -27,6 +27,7 @@ import com.android.tools.layoutlib.annotations.LayoutlibDelegate; import android.content.res.Resources.NotFoundException; import android.content.res.Resources.Theme; +import android.content.res.Resources.ThemeKey; import android.util.AttributeSet; import android.util.TypedValue; @@ -110,22 +111,16 @@ public class Resources_Theme_Delegate { private static boolean setupResources(Theme thisTheme) { // Key is a space-separated list of theme ids applied that have been merged into the // BridgeContext's theme to make thisTheme. - String[] appliedStyles = thisTheme.getKey().split(" "); + final ThemeKey key = thisTheme.getKey(); + final int[] resId = key.mResId; + final boolean[] force = key.mForce; + boolean changed = false; - for (String s : appliedStyles) { - if (s.isEmpty()) { - continue; - } - // See the definition of force parameter in Theme.applyStyle(). - boolean force = false; - if (s.charAt(s.length() - 1) == '!') { - force = true; - s = s.substring(0, s.length() - 1); - } - int styleId = Integer.parseInt(s, 16); - StyleResourceValue style = resolveStyle(styleId); + for (int i = 0, N = key.mCount; i < N; i++) { + StyleResourceValue style = resolveStyle(resId[i]); if (style != null) { - RenderSessionImpl.getCurrentContext().getRenderResources().applyStyle(style, force); + RenderSessionImpl.getCurrentContext().getRenderResources().applyStyle( + style, force[i]); changed = true; } diff --git a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java index 9eea66338402..87762a63a058 100644 --- a/tools/layoutlib/bridge/src/android/view/BridgeInflater.java +++ b/tools/layoutlib/bridge/src/android/view/BridgeInflater.java @@ -16,19 +16,15 @@ package android.view; -import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.ide.common.rendering.api.LayoutLog; +import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.ide.common.rendering.api.MergeCookie; import com.android.ide.common.rendering.api.ResourceReference; import com.android.ide.common.rendering.api.ResourceValue; import com.android.layoutlib.bridge.Bridge; -import com.android.layoutlib.bridge.BridgeConstants; import com.android.layoutlib.bridge.android.BridgeContext; import com.android.layoutlib.bridge.android.BridgeXmlBlockParser; -import com.android.layoutlib.bridge.android.support.RecyclerViewUtil; -import com.android.layoutlib.bridge.android.support.RecyclerViewUtil.LayoutManagerType; import com.android.layoutlib.bridge.impl.ParserFactory; -import com.android.layoutlib.bridge.impl.RenderSessionImpl; import com.android.resources.ResourceType; import com.android.util.Pair; @@ -233,22 +229,6 @@ public final class BridgeInflater extends LayoutInflater { if (viewKey != null) { bc.addViewKey(view, viewKey); } - if (RenderSessionImpl.isInstanceOf(view, RecyclerViewUtil.CN_RECYCLER_VIEW)) { - String type = attrs.getAttributeValue(BridgeConstants.NS_RESOURCES, - BridgeConstants.ATTR_LAYOUT_MANAGER_TYPE); - if (type != null) { - LayoutManagerType layoutManagerType = LayoutManagerType.getByLogicalName(type); - if (layoutManagerType == null) { - layoutManagerType = LayoutManagerType.getByClassName(type); - } - if (layoutManagerType == null) { - // add the classname itself. - bc.addCookie(view, type); - } else { - bc.addCookie(view, layoutManagerType); - } - } - } } } diff --git a/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java b/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java index ec3a8d627fcc..30512aad4509 100644 --- a/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java +++ b/tools/layoutlib/bridge/src/android/view/RectShadowPainter.java @@ -19,6 +19,7 @@ package android.view; import com.android.layoutlib.bridge.impl.ResourceHelper; import android.graphics.Canvas; +import android.graphics.Canvas_Delegate; import android.graphics.LinearGradient; import android.graphics.Outline; import android.graphics.Paint; @@ -125,6 +126,9 @@ public class RectShadowPainter { private static void sideShadow(Canvas canvas, Paint edgePaint, RectF edgeShadowRect, float dx, float dy, int rotations) { + if (isRectEmpty(edgeShadowRect)) { + return; + } int saved = canvas.save(); canvas.translate(dx, dy); canvas.rotate(rotations * PERPENDICULAR_ANGLE); @@ -153,4 +157,15 @@ public class RectShadowPainter { canvas.drawPath(path, paint); canvas.restoreToCount(saved); } + + /** + * Differs from {@link RectF#isEmpty()} as this first converts the rect to int and then checks. + * <p/> + * This is required because {@link Canvas_Delegate#native_drawRect(long, float, float, float, + * float, long)} casts the co-ordinates to int and we want to ensure that it doesn't end up + * drawing empty rectangles, which results in IllegalArgumentException. + */ + private static boolean isRectEmpty(RectF rect) { + return (int) rect.left >= (int) rect.right || (int) rect.top >= (int) rect.bottom; + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java index 094778d2b4a5..eb5f59733ebf 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java @@ -93,6 +93,8 @@ import java.util.IdentityHashMap; import java.util.List; import java.util.Map; +import static com.android.layoutlib.bridge.android.RenderParamsFlags.FLAG_KEY_APPLICATION_PACKAGE; + /** * Custom implementation of Context/Activity to handle non compiled resources. */ @@ -306,7 +308,7 @@ public final class BridgeContext extends Context { // check if this is a style resource if (value instanceof StyleResourceValue) { // get the id that will represent this style. - outValue.resourceId = getDynamicIdByStyle((StyleResourceValue)value); + outValue.resourceId = getDynamicIdByStyle((StyleResourceValue) value); return true; } @@ -812,6 +814,14 @@ public final class BridgeContext extends Context { } + @Override + public String getPackageName() { + if (mApplicationInfo.packageName == null) { + mApplicationInfo.packageName = mLayoutlibCallback.getFlag(FLAG_KEY_APPLICATION_PACKAGE); + } + return mApplicationInfo.packageName; + } + // ------------- private new methods /** @@ -1225,12 +1235,6 @@ public final class BridgeContext extends Context { } @Override - public String getPackageName() { - // pass - return null; - } - - @Override public String getBasePackageName() { // pass return null; diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java index c44a57c98224..8899e53648d2 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeIInputMethodManager.java @@ -164,7 +164,8 @@ public class BridgeIInputMethodManager implements IInputMethodManager { } @Override - public void showInputMethodPickerFromClient(IInputMethodClient arg0) throws RemoteException { + public void showInputMethodPickerFromClient(IInputMethodClient arg0, + int arg1) throws RemoteException { // TODO Auto-generated method stub } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java index 2f45473bf53b..b98f96f27c91 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/RenderParamsFlags.java @@ -16,6 +16,7 @@ package com.android.layoutlib.bridge.android; +import com.android.ide.common.rendering.api.RenderParams; import com.android.ide.common.rendering.api.SessionParams.Key; /** @@ -31,10 +32,21 @@ public final class RenderParamsFlags { new Key<String>("rootTag", String.class); public static final Key<Boolean> FLAG_KEY_DISABLE_BITMAP_CACHING = new Key<Boolean>("disableBitmapCaching", Boolean.class); - public static final Key<Boolean> FLAG_KEY_RECYCLER_VIEW_SUPPORT = - new Key<Boolean>("recyclerViewSupport", Boolean.class); public static final Key<Boolean> FLAG_KEY_RENDER_ALL_DRAWABLE_STATES = new Key<Boolean>("renderAllDrawableStates", Boolean.class); + /** + * To tell LayoutLib that the IDE supports RecyclerView. + * <p/> + * Default is false. + */ + public static final Key<Boolean> FLAG_KEY_RECYCLER_VIEW_SUPPORT = + new Key<Boolean>("recyclerViewSupport", Boolean.class); + /** + * The application package name. Used via + * {@link com.android.ide.common.rendering.api.LayoutlibCallback#getFlag(Key)} + */ + public static final Key<String> FLAG_KEY_APPLICATION_PACKAGE = + new Key<String>("applicationPackage", String.class); // Disallow instances. private RenderParamsFlags() {} diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java index 9273ac248a13..e4c728842275 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/support/RecyclerViewUtil.java @@ -27,11 +27,12 @@ import com.android.layoutlib.bridge.android.RenderParamsFlags; import android.content.Context; import android.view.View; -import android.widget.LinearLayout; import java.lang.reflect.Method; -import static com.android.layoutlib.bridge.util.ReflectionUtils.*; +import static com.android.layoutlib.bridge.util.ReflectionUtils.ReflectionException; +import static com.android.layoutlib.bridge.util.ReflectionUtils.getMethod; +import static com.android.layoutlib.bridge.util.ReflectionUtils.invoke; /** * Utility class for working with android.support.v7.widget.RecyclerView @@ -39,17 +40,15 @@ import static com.android.layoutlib.bridge.util.ReflectionUtils.*; @SuppressWarnings("SpellCheckingInspection") // for "recycler". public class RecyclerViewUtil { - /** - * Used by {@link LayoutManagerType}. - * <p/> - * Not declared inside the enum, since it needs to be accessible in the constructor. - */ - private static final Object CONTEXT = new Object(); - - public static final String CN_RECYCLER_VIEW = "android.support.v7.widget.RecyclerView"; + private static final String RV_PKG_PREFIX = "android.support.v7.widget."; + public static final String CN_RECYCLER_VIEW = RV_PKG_PREFIX + "RecyclerView"; private static final String CN_LAYOUT_MANAGER = CN_RECYCLER_VIEW + "$LayoutManager"; private static final String CN_ADAPTER = CN_RECYCLER_VIEW + "$Adapter"; + // LinearLayoutManager related constants. + private static final String CN_LINEAR_LAYOUT_MANAGER = RV_PKG_PREFIX + "LinearLayoutManager"; + private static final Class<?>[] LLM_CONSTRUCTOR_SIGNATURE = new Class<?>[]{Context.class}; + /** * Tries to create an Adapter ({@code android.support.v7.widget.RecyclerView.Adapter} and a * LayoutManager {@code RecyclerView.LayoutManager} and assign these to the {@code RecyclerView} @@ -71,37 +70,33 @@ public class RecyclerViewUtil { private static void setLayoutManager(@NonNull View recyclerView, @NonNull BridgeContext context, @NonNull LayoutlibCallback callback) throws ReflectionException { - Object cookie = context.getCookie(recyclerView); - assert cookie == null || cookie instanceof LayoutManagerType || cookie instanceof String; - if (!(cookie instanceof LayoutManagerType)) { - if (cookie != null) { - // TODO: When layoutlib API is updated, try to load the class with a null - // constructor or a constructor taking one argument - the context. - Bridge.getLog().warning(LayoutLog.TAG_UNSUPPORTED, - "LayoutManager (" + cookie + ") not found, falling back to " + - "LinearLayoutManager", null); - } - cookie = LayoutManagerType.getDefault(); + if (getLayoutManager(recyclerView) == null) { + // Only set the layout manager if not already set by the recycler view. + Object layoutManager = createLayoutManager(context, callback); + setProperty(recyclerView, CN_LAYOUT_MANAGER, layoutManager, "setLayoutManager"); } - Object layoutManager = createLayoutManager((LayoutManagerType) cookie, context, callback); - setProperty(recyclerView, CN_LAYOUT_MANAGER, layoutManager, "setLayoutManager"); } + /** Creates a LinearLayoutManager using the provided context. */ @Nullable - private static Object createLayoutManager(@Nullable LayoutManagerType type, - @NonNull Context context, @NonNull LayoutlibCallback callback) + private static Object createLayoutManager(@NonNull Context context, + @NonNull LayoutlibCallback callback) throws ReflectionException { - if (type == null) { - type = LayoutManagerType.getDefault(); - } try { - return callback.loadView(type.getClassName(), type.getSignature(), type.getArgs(context)); + return callback.loadView(CN_LINEAR_LAYOUT_MANAGER, LLM_CONSTRUCTOR_SIGNATURE, + new Object[]{ context}); } catch (Exception e) { throw new ReflectionException(e); } } @Nullable + private static Object getLayoutManager(View recyclerview) throws ReflectionException { + Method getLayoutManager = getMethod(recyclerview.getClass(), "getLayoutManager"); + return getLayoutManager != null ? invoke(getLayoutManager, recyclerview) : null; + } + + @Nullable private static Object createAdapter(@NonNull SessionParams params) throws ReflectionException { Boolean ideSupport = params.getFlag(RenderParamsFlags.FLAG_KEY_RECYCLER_VIEW_SUPPORT); if (ideSupport != Boolean.TRUE) { @@ -145,74 +140,4 @@ public class RecyclerViewUtil { } throw new RuntimeException("invalid object/classname combination."); } - - /** Supported LayoutManagers. */ - public enum LayoutManagerType { - LINEAR_LAYOUT_MANGER("Linear", - "android.support.v7.widget.LinearLayoutManager", - new Class[]{Context.class}, new Object[]{CONTEXT}), - GRID_LAYOUT_MANAGER("Grid", - "android.support.v7.widget.GridLayoutManager", - new Class[]{Context.class, int.class}, new Object[]{CONTEXT, 2}), - STAGGERED_GRID_LAYOUT_MANAGER("StaggeredGrid", - "android.support.v7.widget.StaggeredGridLayoutManager", - new Class[]{int.class, int.class}, new Object[]{2, LinearLayout.VERTICAL}); - - private String mLogicalName; - private String mClassName; - private Class[] mSignature; - private Object[] mArgs; - - LayoutManagerType(String logicalName, String className, Class[] signature, Object[] args) { - mLogicalName = logicalName; - mClassName = className; - mSignature = signature; - mArgs = args; - } - - String getClassName() { - return mClassName; - } - - Class[] getSignature() { - return mSignature; - } - - @NonNull - Object[] getArgs(Context context) { - Object[] args = new Object[mArgs.length]; - System.arraycopy(mArgs, 0, args, 0, mArgs.length); - for (int i = 0; i < args.length; i++) { - if (args[i] == CONTEXT) { - args[i] = context; - } - } - return args; - } - - @NonNull - public static LayoutManagerType getDefault() { - return LINEAR_LAYOUT_MANGER; - } - - @Nullable - public static LayoutManagerType getByLogicalName(@NonNull String logicalName) { - for (LayoutManagerType type : values()) { - if (logicalName.equals(type.mLogicalName)) { - return type; - } - } - return null; - } - - @Nullable - public static LayoutManagerType getByClassName(@NonNull String className) { - for (LayoutManagerType type : values()) { - if (className.equals(type.mClassName)) { - return type; - } - } - return null; - } - } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java index 9f9b968a6598..dc89d0c6546a 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/Config.java @@ -74,7 +74,7 @@ public class Config { } public static String getTime(int platformVersion) { - if (platformVersion == 0) { + if (isGreaterOrEqual(platformVersion, LOLLIPOP_MR1)) { return "5:10"; } if (platformVersion < GINGERBREAD) { @@ -117,7 +117,7 @@ public class Config { } public static String getWifiIconType(int platformVersion) { - return platformVersion == 0 ? "xml" : "png"; + return isGreaterOrEqual(platformVersion, LOLLIPOP) ? "xml" : "png"; } /** diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java index 9450b6c3d3e7..04aadff95389 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/NavigationBar.java @@ -21,6 +21,10 @@ import com.android.resources.Density; import org.xmlpull.v1.XmlPullParserException; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.util.AttributeSet; +import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; @@ -29,6 +33,21 @@ public class NavigationBar extends CustomBar { /** Navigation bar background color attribute name. */ private static final String ATTR_COLOR = "navigationBarColor"; + /** + * Constructor to be used when creating the {@link NavigationBar} as a regular control. + * This is currently used by the theme editor. + */ + public NavigationBar(Context context, AttributeSet attrs) + throws XmlPullParserException { + this((BridgeContext) context, + Density.getEnum(((BridgeContext) context).getMetrics().densityDpi), + LinearLayout.HORIZONTAL, // In this mode, it doesn't need to be render vertically + ((BridgeContext) context).getConfiguration().getLayoutDirection() == + View.LAYOUT_DIRECTION_RTL, + (context.getApplicationInfo().flags & ApplicationInfo.FLAG_SUPPORTS_RTL) != 0, + context.getApplicationInfo().targetSdkVersion); + } + public NavigationBar(BridgeContext context, Density density, int orientation, boolean isRtl, boolean rtlEnabled, int simulatedPlatformVersion) throws XmlPullParserException { super(context, orientation, "/bars/navigation_bar.xml", "navigation_bar.xml", diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java index e5f1f68459e6..a0ed0e86d27f 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/bars/StatusBar.java @@ -25,7 +25,9 @@ import com.android.resources.Density; import org.xmlpull.v1.XmlPullParserException; +import android.content.Context; import android.graphics.drawable.Drawable; +import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.widget.ImageView; @@ -39,7 +41,20 @@ public class StatusBar extends CustomBar { private final int mSimulatedPlatformVersion; /** Status bar background color attribute name. */ - private static final String ATTR_COLOR = "colorPrimaryDark"; + private static final String ATTR_COLOR = "statusBarColor"; + + /** + * Constructor to be used when creating the {@link StatusBar} as a regular control. This + * is currently used by the theme editor. + */ + public StatusBar(Context context, AttributeSet attrs) throws XmlPullParserException { + this((BridgeContext) context, + Density.getEnum(((BridgeContext) context).getMetrics().densityDpi), + LinearLayout.HORIZONTAL, // In this mode, it doesn't need to be render vertically + ((BridgeContext) context).getConfiguration().getLayoutDirection() == + View.LAYOUT_DIRECTION_RTL, + context.getApplicationInfo().targetSdkVersion); + } public StatusBar(BridgeContext context, Density density, int direction, boolean RtlEnabled, int simulatedPlatformVersion) throws XmlPullParserException { @@ -50,6 +65,7 @@ public class StatusBar extends CustomBar { // FIXME: use FILL_H? setGravity(Gravity.START | Gravity.TOP | Gravity.RIGHT); + int color = getThemeAttrColor(ATTR_COLOR, true); setBackgroundColor(color == 0 ? Config.getStatusBarColor(simulatedPlatformVersion) : color); diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java index 3dee1e23dfe2..26f9000ad945 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderDrawable.java @@ -42,6 +42,10 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * Action to render a given Drawable provided through {@link DrawableParams#getDrawable()}. * diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index d957259130f9..f6e5ef18a383 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -1075,7 +1075,7 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { private void findStatusBar(RenderResources resources, DisplayMetrics metrics) { boolean windowFullscreen = getBooleanThemeValue(resources, - "windowFullscreen", false, !isThemeAppCompat(resources)); + "windowFullscreen", false, true); if (!windowFullscreen && !mWindowIsFloating) { // default value @@ -1210,15 +1210,15 @@ public class RenderSessionImpl extends RenderAction<SessionParams> { // between Theme.AppCompat.Light and Theme.AppCompat is Theme.Material (for v21). boolean isThemeAppCompat = false; for (int i = 0; i < 50; i++) { + if (defaultTheme == null) { + break; + } // for loop ensures that we don't run into cyclic theme inheritance. if (defaultTheme.getName().startsWith("Theme.AppCompat")) { isThemeAppCompat = true; break; } defaultTheme = resources.getParent(defaultTheme); - if (defaultTheme == null) { - break; - } } mIsThemeAppCompat = isThemeAppCompat; } diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class Binary files differindex d2524625e16c..8af93ebda1e4 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/MyActivity.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class Binary files differindex d109302c913f..069f9f7e826b 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$id.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class Binary files differindex 816ecc88cb54..36e2688c106f 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$layout.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class Binary files differindex b034b75d0df2..ca438add633e 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$menu.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class Binary files differindex f86b1d3d9e63..a98abf57306a 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$string.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class Binary files differindex 8bbae9035f0e..7d8cc8464334 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R$style.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class Binary files differindex 8af745dc8d3b..7e6113b3aa11 100644 --- a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/build/intermediates/classes/debug/com/android/layoutlib/test/myapplication/R.class diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png Binary files differnew file mode 100644 index 000000000000..c9b76bed16bf --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/golden/allwidgets.png diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml new file mode 100644 index 000000000000..2da2cb983a6c --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/layout/allwidgets.xml @@ -0,0 +1,393 @@ +<?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:ignore="HardcodedText,LabelFor,TextFields,ContentDescription,RtlHardcoded"> + + <FrameLayout + android:id="@id/frameLayout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_alignParentTop="true" + android:layout_marginEnd="311dp"> + + <TextView + android:id="@id/textView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="left|top" + android:text="New Text" /> + </FrameLayout> + + <TextView + android:id="@id/textView2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_below="@id/frameLayout" + android:text="Large Text" + android:textAppearance="?android:attr/textAppearanceLarge" /> + + <TextView + android:id="@id/textView3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_toEndOf="@id/textView2" + android:text="Medium Text" + android:textAppearance="?android:attr/textAppearanceMedium" /> + + <TextView + android:id="@id/textView4" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignTop="@id/textView2" + android:layout_toEndOf="@id/textView2" + android:text="Small Text" + android:textAppearance="?android:attr/textAppearanceSmall" /> + + <Button + android:id="@id/button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/textView3" + android:layout_toEndOf="@id/textView4" + android:text="New Button" /> + + <Button + android:id="@id/button2" + style="?android:attr/buttonStyleSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentTop="true" + android:layout_toEndOf="@id/button" + android:text="New Button" /> + + <CheckBox + android:id="@id/checkBox" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignEnd="@id/button" + android:layout_below="@id/button" + android:text="New CheckBox" /> + + <Switch + android:id="@id/switch1" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_below="@id/textView2" + android:text="New Switch" /> + + <ImageButton + android:id="@id/imageButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/button" + android:layout_toEndOf="@id/switch1" /> + + <ImageView + android:id="@id/imageView" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ic_launcher" + android:layout_below="@id/button" + android:layout_toEndOf="@id/imageButton" /> + + <GridLayout + android:id="@id/gridLayout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_below="@id/imageButton" + android:columnCount="2" + android:rowCount="2"> + + <ProgressBar + android:id="@id/progressBar" + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_row="0" /> + + <ProgressBar + android:id="@id/progressBar2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="0" /> + + <ProgressBar + android:id="@id/progressBar3" + style="?android:attr/progressBarStyleSmall" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="0" + android:layout_row="1" /> + + <ProgressBar + android:id="@id/progressBar4" + style="?android:attr/progressBarStyleHorizontal" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_column="1" + android:layout_row="1" /> + </GridLayout> + + <SeekBar + android:id="@id/seekBar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignTop="@id/gridLayout" + android:layout_toEndOf="@id/gridLayout" /> + + <RatingBar + android:id="@id/ratingBar" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/switch2" + android:layout_toEndOf="@id/gridLayout" /> + + <Switch + android:id="@id/switch2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/seekBar" + android:layout_toEndOf="@id/switch1" + android:checked="true" /> + + <EditText + android:id="@id/editText" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignBottom="@id/ratingBar" + android:layout_alignParentStart="true" + android:text="plain text" /> + + <EditText + android:id="@id/editText2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_below="@id/ratingBar" + android:ems="3" + android:inputType="textPersonName" + android:text="Name" /> + + <EditText + android:id="@id/editText3" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_toEndOf="@id/editText2" + android:ems="2" + android:inputType="textPassword" + android:text="password" /> + + <EditText + android:id="@id/editText4" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignTop="@id/editText3" + android:layout_toEndOf="@id/editText3" + android:ems="3" + android:inputType="numberPassword" + android:text="numeric password" /> + + <EditText + android:id="@id/editText5" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/editText3" + android:layout_toStartOf="@id/editText6" + android:ems="7" + android:inputType="textEmailAddress" + android:text="email@domain.com" /> + + <EditText + android:id="@id/editText6" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentEnd="true" + android:layout_below="@id/editText4" + android:ems="7" + android:inputType="phone" + android:text="+11235554344" /> + + <EditText + android:id="@id/editText7" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/editText" + android:layout_toEndOf="@id/editText4" + android:ems="10" + android:inputType="textPostalAddress" + android:text="1600 Amphitheatre" /> + + <EditText + android:id="@id/editText9" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/editText5" + android:layout_alignParentStart="true" + android:ems="3" + android:inputType="time" + android:text="12:12" /> + + <RadioGroup + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/editText5" + android:layout_toEndOf="@id/editText9" + android:orientation="horizontal"> + + <RadioButton + android:id="@id/radioButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="New RadioButton" /> + + <RadioButton + android:id="@id/radioButton2" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="New RadioButton" /> + + </RadioGroup> + + <CheckedTextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="CheckedTextView" + android:id="@id/checkedTextView" + android:layout_below="@id/button2" + android:layout_alignParentEnd="true" + android:layout_alignStart="@id/button2" /> + + <DialerFilter + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_below="@id/checkBox" + android:layout_toStartOf="@id/quickContactBadge" + android:id="@id/dialerFilter" + android:layout_above="@id/ratingBar" + android:layout_toEndOf="@id/seekBar"> + + <EditText + android:id="@android:id/hint" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:text="Hint" /> + + <EditText + android:id="@android:id/primary" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_below="@android:id/hint" + android:text="Primary" /> + </DialerFilter> + + <QuickContactBadge + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/quickContactBadge" + android:layout_below="@id/checkedTextView" + android:layout_alignParentEnd="true" /> + + <android.inputmethodservice.ExtractEditText + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="ExtractEditText" + android:id="@id/extractEditText" + android:layout_below="@id/editText9" + android:layout_alignParentEnd="true" + android:layout_alignStart="@id/checkedTextView" /> + + <ZoomControls + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/zoomControls" + android:layout_below="@id/editText9" + android:layout_alignParentStart="true" /> + + <TextureView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/textureView" + android:layout_below="@id/zoomControls" + android:layout_alignParentStart="true" + android:layout_alignBottom="@id/extractEditText" + android:layout_toStartOf="@id/editText3" /> + + <ListView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/listView" + android:layout_below="@id/textureView" + android:layout_alignParentStart="true" + android:layout_alignEnd="@id/textureView" /> + + <GridView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/gridView" + android:layout_below="@id/extractEditText" + android:layout_alignParentEnd="true" + android:layout_alignStart="@id/extractEditText" /> + + <ScrollView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/scrollView" + android:layout_below="@id/zoomControls" + android:layout_toRightOf="@id/listView" + android:layout_toLeftOf="@id/extractEditText"> + + <TabHost + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@id/tabHost"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <TabWidget + android:id="@android:id/tabs" + android:layout_width="match_parent" + android:layout_height="wrap_content"/> + + <FrameLayout + android:id="@android:id/tabcontent" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <LinearLayout + android:id="@id/linearLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"/> + + <LinearLayout + android:id="@id/linearLayout2" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"/> + + </FrameLayout> + </LinearLayout> + </TabHost> +</ScrollView> + + <SearchView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:id="@id/searchView" + android:layout_alignBottom="@id/zoomControls" + android:layout_toEndOf="@id/seekBar" /> + +</RelativeLayout> diff --git a/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/ids.xml b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/ids.xml new file mode 100644 index 000000000000..1dc2fa02debd --- /dev/null +++ b/tools/layoutlib/bridge/tests/res/testApp/MyApplication/src/main/res/values/ids.xml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <item type="id" name="button" /> + <item type="id" name="button2" /> + <item type="id" name="checkBox" /> + <item type="id" name="checkedTextView" /> + <item type="id" name="dialerFilter" /> + <item type="id" name="editText" /> + <item type="id" name="editText2" /> + <item type="id" name="editText3" /> + <item type="id" name="editText4" /> + <item type="id" name="editText5" /> + <item type="id" name="editText6" /> + <item type="id" name="editText7" /> + <item type="id" name="editText8" /> + <item type="id" name="editText9" /> + <item type="id" name="extractEditText" /> + <item type="id" name="frameLayout" /> + <item type="id" name="gridLayout" /> + <item type="id" name="gridView" /> + <item type="id" name="imageButton" /> + <item type="id" name="imageView" /> + <item type="id" name="linearLayout" /> + <item type="id" name="linearLayout2" /> + <item type="id" name="listView" /> + <item type="id" name="progressBar" /> + <item type="id" name="progressBar2" /> + <item type="id" name="progressBar3" /> + <item type="id" name="progressBar4" /> + <item type="id" name="quickContactBadge" /> + <item type="id" name="radioButton" /> + <item type="id" name="radioButton2" /> + <item type="id" name="ratingBar" /> + <item type="id" name="scrollView" /> + <item type="id" name="searchView" /> + <item type="id" name="seekBar" /> + <item type="id" name="spinner" /> + <item type="id" name="switch1" /> + <item type="id" name="switch2" /> + <item type="id" name="tabHost" /> + <item type="id" name="textView" /> + <item type="id" name="textView2" /> + <item type="id" name="textView3" /> + <item type="id" name="textView4" /> + <item type="id" name="textureView" /> + <item type="id" name="zoomControls" /> +</resources>
\ No newline at end of file diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java index ac23564012b3..f2a039ebcd6e 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/Main.java @@ -261,7 +261,7 @@ public class Main { new ResourceRepository(new FolderWrapper(TEST_RES_DIR + APP_TEST_RES), false) { @NonNull @Override - protected ResourceItem createResourceItem(String name) { + protected ResourceItem createResourceItem(@NonNull String name) { return new ResourceItem(name); } }; @@ -275,14 +275,27 @@ public class Main { ConfigGenerator.getEnumMap(attrs), getLayoutLog()); } + /** Text activity.xml */ + @Test + public void testActivity() throws ClassNotFoundException { + renderAndVerify("activity.xml", "activity.png"); + + } + + /** Test allwidgets.xml */ + @Test + public void testAllWidgets() throws ClassNotFoundException { + renderAndVerify("allwidgets.xml", "allwidgets.png"); + } + /** - * Create a new rendering session and test that rendering /layout/activity.xml on nexus 5 - * doesn't throw any exceptions. + * Create a new rendering session and test that rendering given layout on nexus 5 + * doesn't throw any exceptions and matches the provided image. */ - @Test - public void testRendering() throws ClassNotFoundException { + private void renderAndVerify(String layoutFileName, String goldenFileName) + throws ClassNotFoundException { // Create the layout pull parser. - LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/activity.xml"); + LayoutPullParser parser = new LayoutPullParser(APP_TEST_RES + "/layout/" + layoutFileName); // Create LayoutLibCallback. LayoutLibTestCallback layoutLibCallback = new LayoutLibTestCallback(getLogger()); layoutLibCallback.initResources(); @@ -301,7 +314,7 @@ public class Main { session.getResult().getErrorMessage()); } try { - String goldenImagePath = APP_TEST_DIR + "/golden/activity.png"; + String goldenImagePath = APP_TEST_DIR + "/golden/" + goldenFileName; ImageUtils.requireSimilar(goldenImagePath, session.getImage()); } catch (IOException e) { getLogger().error(e, e.getMessage()); @@ -309,7 +322,7 @@ public class Main { } /** - * Uses Theme.Material and Target sdk version as 21. + * Uses Theme.Material and Target sdk version as 22. */ private SessionParams getSessionParams(LayoutPullParser layoutParser, ConfigGenerator configGenerator, LayoutLibTestCallback layoutLibCallback) { @@ -327,7 +340,7 @@ public class Main { resourceResolver, layoutLibCallback, 0, - 21, // TODO: Make it more configurable to run tests for various versions. + 22, // TODO: Make it more configurable to run tests for various versions. getLayoutLog()); } @@ -381,17 +394,17 @@ public class Main { } @Override - public void warning(String msgFormat, Object... args) { + public void warning(@NonNull String msgFormat, Object... args) { failWithMsg(msgFormat, args); } @Override - public void info(String msgFormat, Object... args) { + public void info(@NonNull String msgFormat, Object... args) { // pass. } @Override - public void verbose(String msgFormat, Object... args) { + public void verbose(@NonNull String msgFormat, Object... args) { // pass. } }; @@ -399,7 +412,7 @@ public class Main { return mLogger; } - private static void failWithMsg(String msgFormat, Object... args) { - fail(msgFormat == null || args == null ? "" : String.format(msgFormat, args)); + private static void failWithMsg(@NonNull String msgFormat, Object... args) { + fail(args == null ? "" : String.format(msgFormat, args)); } } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java index a5c320294504..1191df635a2c 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/ConfigGenerator.java @@ -21,12 +21,11 @@ import com.android.ide.common.resources.configuration.CountryCodeQualifier; import com.android.ide.common.resources.configuration.DensityQualifier; import com.android.ide.common.resources.configuration.FolderConfiguration; import com.android.ide.common.resources.configuration.KeyboardStateQualifier; -import com.android.ide.common.resources.configuration.LanguageQualifier; import com.android.ide.common.resources.configuration.LayoutDirectionQualifier; +import com.android.ide.common.resources.configuration.LocaleQualifier; import com.android.ide.common.resources.configuration.NavigationMethodQualifier; import com.android.ide.common.resources.configuration.NetworkCodeQualifier; import com.android.ide.common.resources.configuration.NightModeQualifier; -import com.android.ide.common.resources.configuration.RegionQualifier; import com.android.ide.common.resources.configuration.ScreenDimensionQualifier; import com.android.ide.common.resources.configuration.ScreenOrientationQualifier; import com.android.ide.common.resources.configuration.ScreenRatioQualifier; @@ -158,10 +157,9 @@ public class ConfigGenerator { config.setUiModeQualifier(new UiModeQualifier(UiMode.NORMAL)); config.setNightModeQualifier(new NightModeQualifier(NightMode.NOTNIGHT)); config.setCountryCodeQualifier(new CountryCodeQualifier()); - config.setLanguageQualifier(new LanguageQualifier()); config.setLayoutDirectionQualifier(new LayoutDirectionQualifier()); config.setNetworkCodeQualifier(new NetworkCodeQualifier()); - config.setRegionQualifier(new RegionQualifier()); + config.setLocaleQualifier(new LocaleQualifier()); config.setVersionQualifier(new VersionQualifier()); return config; } diff --git a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java index 0a5e7984a336..5b648efb1089 100644 --- a/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java +++ b/tools/layoutlib/bridge/tests/src/com/android/layoutlib/bridge/intensive/setup/LayoutLibTestCallback.java @@ -23,8 +23,8 @@ import com.android.ide.common.rendering.api.ILayoutPullParser; import com.android.ide.common.rendering.api.LayoutlibCallback; import com.android.ide.common.rendering.api.ResourceReference; import com.android.ide.common.rendering.api.ResourceValue; -import com.android.resources.ResourceType; import com.android.ide.common.resources.IntArrayWrapper; +import com.android.resources.ResourceType; import com.android.util.Pair; import com.android.utils.ILogger; @@ -36,6 +36,8 @@ import java.util.Map; import com.google.android.collect.Maps; +import static org.junit.Assert.fail; + @SuppressWarnings("deprecation") // For Pair public class LayoutLibTestCallback extends LayoutlibCallback { @@ -121,7 +123,7 @@ public class LayoutLibTestCallback extends LayoutlibCallback { @Override public ILayoutPullParser getParser(String layoutName) { - org.junit.Assert.fail("This method shouldn't be called by this version of LayoutLib."); + fail("This method shouldn't be called by this version of LayoutLib."); return null; } |